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  数组的 操作,还有一个情绪值。

按一定逻辑 应对买家 的 行为来标记状态,

来进行行为,讲话。

 

posted @ 2022-12-04 22:56  D7mir  阅读(61)  评论(0)    收藏  举报