Delphi 经典游戏程序设计40例 的学习 例38 与商店老板拼智慧

unit Rei38; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TR38 = class(TForm) Panel1: TPanel; Panel2: TPanel; RadioGroup1: TRadioGroup; RadioGroup2: TRadioGroup; RadioGroup3: TRadioGroup; Memo1: TMemo; Edit1: TEdit; Edit2: TEdit; Button1: TButton; Button2: TButton; Timer1: TTimer; procedure FormCreate(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Citem(Sender: TObject); procedure Sitem(Sender: TObject); private { Private declarations } procedure InitData; procedure Speak(SpData: string;AddM: ShortInt); public { Public declarations } end; var R38: TR38; TM: Byte; Price: Word; Mood, Qitem: ShortInt; //老板情绪值 Gold: Integer = 10000; R1Data: array[0..5] of string = ( //玩家行动 '打招呼', '微笑', '考虑', '抱怨', '杀价', '购买'); R2Data: array[0..9] of string = ( '强者的剑', '穆塔的剑', '大板剑', '竹刀', '药草', '龙的盾', '盔甲', '复活卷轴', '天狗草', '太阳戒指'); Plist: array[0..9] of Word = ( 1500, 2500, 3800, 300, 22000, 1800, 5000, 2000, 900, 2200); Sold: array[0..9] of Word; // Deed: array[0..4] of Byte; //老板的反应? Spk0: array[0..5] of string; Spk1: array[0..3] of string; Spk2: array[0..2] of string; Spk3: array[0..3] of string; Spk4: array[0..3] of string; Spk5: array[0..4] of string; implementation {$R *.dfm} procedure TR38.FormCreate(Sender: TObject); var n: Byte; begin for n := 0 to 5 do //根据R1data数组添加radiogroup1内容 RadioGroup1.Items.Add(R1Data[n]); for n := 0 to 9 do RadioGroup2.Items.Add(R2Data[n]); InitData; Spk0[0] := '哦!很高兴能有你的回音'; Spk0[1] := '打招呼应该是在一见面时及要离开时打'; Spk0[2] := '要回去了吗?'; Spk0[3] := '要回去还跟我道別,服了你了,你去拿吧!'; Spk0[4] := '这药草是生的。即使吃了,根也绝对不能丟掉!'; Spk0[5] := '那还要再来哦。下次会算你便宜一点...!'; Spk1[0] := '又不招呼,还笑...'; Spk1[1] := '我最经不起人家笑'; Spk1[2] := '不要再笑了'; Spk1[3] := '你要笑到什么时候'; Spk2[0] := '你摆这种表情,我也很为难'; Spk2[1] := '你是不是要买?'; Spk2[2] := '不要考虑了,快决定吧!'; Spk3[0] := '又不买东西,少在那里嫌东嫌西!'; Spk3[1] := '什么,这东西你不满意。那我用原价买回来。'; Spk3[2] := '还嫌贵啊!'; Spk3[3] := '你一直抱怨,我快受不了了!'; Spk4[0] := '到底要便宜多少你才满意...'; Spk4[1] := '好吧,算你'; Spk4[2] := '不管你说几遍算便宜一点,结果还是一样...'; Spk4[3] := '没办法再减下去了'; Spk5[0] := '我不跟钱老大商量一下的话...'; Spk5[1] := '你到底想买什麽?'; Spk5[2] := '这个你不是有了吗?不要浪费哦!'; Spk5[3] := '他是冤大头哦。被人听到的话...'; Spk5[4] := '谢谢!'; end; procedure TR38.Timer1Timer(Sender: TObject); begin Edit1.Text := '持有金额;' + IntToStr(Gold); Edit2.Text := ' ' + IntToStr(Mood); TM := TM + 1; if TM > 120 then //时间计数,清理Memo1内容 begin TM := 0; Memo1.Lines.Clear; end; end; procedure TR38.InitData; var n: Byte; begin //参数初始化 Memo1.Lines.Clear; Memo1.Lines.Add('欢迎光临'); RadioGroup1.ItemIndex := -1; RadioGroup2.ItemIndex := -1; RadioGroup3.Items.Clear; Mood := 50; Gold := 10000; Qitem := -1; for n := 0 to 9 do Sold[n] := 0; for n := 0 to 4 do Deed[n] := 0; TM := 0; end; procedure TR38.Speak(SpData: string;AddM: ShortInt); begin Memo1.Lines.Clear; Memo1.Lines.Add(SpData); //文本框里增加显示 Mood := Mood + AddM; //情绪值设定,增减 if Mood < 0 then Mood := 0 else if Mood > 100 then Mood := 100; TM := 0; end; procedure TR38.Button1Click(Sender: TObject); begin InitData; end; procedure TR38.Button2Click(Sender: TObject); var n: Byte; begin if Deed[0] >= 4 then //购物完毕的情况 begin Speak(Spk0[Deed[0]],0); // Spk0[4] := '这药草是生的。即使吃了,根也绝对不能丟掉!'; // Spk0[5] := '那还要再来哦。下次会算你便宜一点...!'; Deed[0] := 4 + (Deed[0] + 1) and 1; //按位与,得值4或5 end else begin case RadioGroup1.ItemIndex of //选择行动? 0: begin //打招呼 if Deed[0] = 0 then begin //首次打招呼 Speak(Spk0[0], 20); //Spk0[0] := '哦!很高兴能有你的回音'; Deed[0] := 1; end else if RadioGroup3.Items.Count = 9 then //9?全部购买了 begin Speak(Spk0[3], 0); //Spk0[3] := '要回去还跟我道別,服了你了,你去拿吧!'; Deed[0] := 4; RadioGroup3.Items.Add('药草'); //送药草? end else begin Speak(Spk0[Deed[0]], 0); //说Spk0[1],[2] if Deed[0] < 2 then Deed[0] := Deed[0] + 1; //Spk0[1] := '打招呼应该是在一见面时及要离开时打'; //Spk0[2] := '要回去了吗?'; end; end; 1: begin //微笑 if Deed[0] = 0 then //没有打招呼时 begin Speak(Spk1[0], 0 ); Deed[0] := 1; Deed[1] := 1; end else begin Deed[4] := 0; if (Qitem >= 0) and (Price <= Plist[Qitem] div 2) then Deed[1] := 3; //砍价一半的时候? if (Deed[1] = 1) and (Random(3) = 0) then Deed[1] := 2; //随机进入2? case Deed[1] of 0, 1: begin Speak(Spk1[1], 4); //Spk1[1] := '我最经不起人家笑'; Deed[1] := Deed[1] + 1; Deed[4] := 0; end; 2: begin Speak(Spk1[2], 0); //Spk1[2] := '不要再笑了'; Deed[1] := 3; Deed[4] := Random(2); end; 3: begin Speak(Spk1[3], -1); //Spk1[3] := '你要笑到什么时候'; end; end; end; end; 2: begin //考虑 if Deed[0] = 0 then Deed[0] := 1; if (Qitem >= 0) and (Price <= Plist[Qitem] div 2) then Deed[2] := 2; case Deed[2] of 0: begin Speak(Spk2[0], -2); //Spk2[0] := '你摆这种表情,我也很为难'; Deed[2] := 1; Deed[4] := 0; end; 1: begin Speak(Spk2[1], 8); //Spk2[1] := '你是不是要买?'; Deed[2] := 2; Deed[4] := 0; end; 2: Speak(Spk2[2], 0); //Spk2[2] := '不要考虑了,快决定吧!'; end; end; 3: begin //抱怨 if Deed[0] = 0 then Deed[0] := 1; if RadioGroup3.Items.Count = 0 then Speak(Spk3[0], -5) //Spk3[0] := '又不买东西,少在那里嫌东嫌西!'; else if RadioGroup3.ItemIndex <> -1 then begin Speak(Spk3[1], -20); //Spk3[1] := '什么,这东西你不满意。那我用原价买回来。'; n := 0; while R2Data[n] <> RadioGroup3.Items.Strings[RadioGroup3.ItemIndex] do n := n + 1; //字符串比较 Gold := Gold + Sold[n]; RadioGroup3.Items.Delete(RadioGroup3.ItemIndex); end else if Deed[3] = 0 then begin Speak(Spk3[2], 7); // Spk3[2] := '还嫌贵啊!'; Deed[3] := 1; Deed[4] := 0; end else Speak(Spk3[3], -4); //Spk3[3] := '你一直抱怨,我快受不了了!'; end; 4: begin //还价 if Deed[0] = 0 then Deed[0] := 1; if Qitem < 0 then Speak(Spk4[0], 0) //Spk4[0] := '到底要便宜多少你才满意...'; else begin if Price <= Plist[Qitem] div 2 then Deed[4] := 2; case Deed[4] of 0: if Mood > 50 then //老板情绪值 begin Price := Price - Plist[Qitem] div 10; //减价格一成 Speak(Spk4[1] + IntToStr(Price) + '个金币', -5); Deed[1] := 1; //Spk4[1] := '好吧,算你'; Deed[2] := 1 + Random(2); Deed[4] := 1; end else Speak(Spk4[3], 0); //Spk4[3] := '没办法再减下去了'; 1: begin Speak(Spk4[2], 0); //Spk4[2] := '不管你说几遍算便宜一点,结果还是一样...'; Deed[1] := 1; Deed[2] := 0; end; 2: Speak(Spk4[3], 0); end; end; end; 5: begin //购买 if Deed[0] = 0 then Deed[0] := 1; if Gold < Price then Speak(Spk5[0], 0) //Spk5[0] := '我不跟钱老大商量一下的话...'; else if Qitem < 0 then Speak(Spk5[1], 0) //Spk5[1] := '你到底想买什麽?'; else if Sold[Qitem] <> 0 then Speak(Spk5[2], 0) //Spk5[2] := '这个你不是有了吗?不要浪费哦!'; else begin if Price > Plist[Qitem] div 2 then Speak(Spk5[3], 20) //Spk5[3] := '他是冤大头哦。被人听到的话...'; else Speak(Spk5[4], 10); //Spk5[4] := '谢谢!'; Gold := Gold - Price; Sold[Qitem] := Price; //记录售卖价格? Deed[1] := 1; Deed[2] := 0; Deed[3] := 0; RadioGroup3.Items.Add(R2Data[Qitem]); Qitem := -1; //指示归-1 RadioGroup2.ItemIndex := -1; end; end; end; end; end; procedure TR38.Citem(Sender: TObject); begin if Deed[0] = 0 then Deed[0] := 1; if (Qitem <> RadioGroup2.ItemIndex) and (RadioGroup3.Items.Count <> 10) then begin if Qitem = -1 then Speak('嗯。。。', 2) else if Qitem = -2 then Speak('这个。。', 0) else Speak('什么!你不要"' + R2Data[Qitem] + '" ...', -2); Qitem := RadioGroup2.ItemIndex; Price := Plist[Qitem]; Deed[1] := 1; Deed[2] := 0; Deed[3] := 0; Deed[4] := 0; RadioGroup3.ItemIndex := -1; end; end; procedure TR38.Sitem(Sender: TObject); begin if Deed[0] = 0 then Deed[0] := 1; if RadioGroup3.Items.Count <> 10 then begin Speak('你把刚买的东西拿出来要干嘛?', 0); Qitem := -2; RadioGroup2.ItemIndex := -1; Deed[1] := 1; Deed[2] := 0; Deed[3] := 0; Deed[4] := 0; end; end; end.
程序的核心是对Deed 数组的 操作,还有一个情绪值。
按一定逻辑 应对买家 的 行为来标记状态,
来进行行为,讲话。