Chinaunix首页 | 论坛 | 博客
  • 博客访问: 16496370
  • 博文数量: 5645
  • 博客积分: 9880
  • 博客等级: 中将
  • 技术积分: 68081
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-28 13:35
文章分类

全部博文(5645)

文章存档

2008年(5645)

我的朋友

分类:

2008-04-28 20:50:34

下载本文示例代码
  前言:“抢三十”是中国民间的一个游戏。游戏规则是:两人从1开始轮流报数,每人每次可加1或加2,谁先报到30,谁就为胜方。一个简单的游戏,要想获胜也只有掌握了其中的奥妙才行。但要想用程序去实现该如何做呢?本文就为你做一个详细的讲解。  必胜的原理  如何才能轻易获胜呢?这就要去寻找其中的规律。我制作了一个小程序,让你可以和计算机单挑。程序界面如图。   若你先报数,不是我夸口,你是一定斗不过计算机的;若计算机先报数,那么就看你的了,如果你犯任何一次错误,计算机都会抓住机会反败为胜。听起来这个程序好像很智能,其实它的道理很简单:  获胜的必要条件是:牢牢抓住3的倍数。具体来讲就是把对方报的数字与3求模,若值为1,则报的数字为对方的数字加2;若值为2,则报的数字为对方的数字加1;否则的话就随意报1或者2。这样在游戏中就能紧紧抓住3的倍数,坚持到最后就是胜利者。把这个算法用程序实现后,电脑在与人对局的时候就智能化了。试问不知道此算法的人会是电脑的对手吗?  关键代码  在有了程序的算法和界面之后,要编写完整的程序就不是很困难了。  最关键的显示实报的数字的Edit控件的Onchange代码: procedure TForm1.Edit1Change(Sender: TObject); begin  if flag=false then //得到控制权,计算机开始自动报数  begin   temp1:=s 1;   temp2:=s 2;   if (temp1 mod 3)=0 then //你报的最后的数字与3取模,若为1,则计算机加2   begin    s:=temp1;    j:=1;   end   else if (temp2 mod 3)=0 then //你报的最后的数字与3取模,若为2,则计算机加1   begin    s:=temp2;    j:=2;   end   else //否则计算机随机报一个数字或两个数字   begin    randomize();    j:=random(2) 1;    s:=s j;   end;   Button2.Enabled :=true; //计算机报数完毕后把报数按钮设为可用   Button3.Enabled :=true;   Button2.Caption :=IntToStr(s 1); //并把报数按钮的Caption设为将要选择的数字   Button3.Caption :=IntToStr(s 2);   Edit2.Text :=IntToStr(j); //显示计算机报的个数   ListBox1.Items.Add('计算机报的个数: ' IntToStr(j));//写入到历史记录   flag:=true; //交出控制权   Edit1.Text :=IntToStr(s); //显示计算机实际报的数字   if s>=30 then //判断游戏是否结束   begin    Button2.Enabled :=false;    Button3.Enabled :=false;    ShowMessage('嘿嘿,想赢我?动动脑筋再来吧!');   end;  end;end;  难点讲解  用一个BOOL变量来交接控制权,也就是什么时候该由你报数,什么时候该由计算机报数。  Form1.Edit1Change处理时要注意,Edit1显示的是计算机实际报的数字。当控制权移交到计算机时,计算机处理完报数程序后要做两件事:1交出控制权,2刷新Edit1的显示。这里要相当小心,看起来这两件事的先后顺序不重要,可实际上要特别注意:如果先刷新Edit1的显示再交出控制权的话,数据就会溢出!  道理是这样的,当程序执行到Edit1的显示刷新时,程序不再向下执行而是回到本段程序的第一行开始依次执行,当执行到这里时再次返回到第一行……死循环就产生了!所以一旦遇到刷新Edit1的显示时,请仔细考虑所做的事情是否存在先后顺序,因为执行Edit1的显示代码后程序将不再向下继续执行,而是跳到TForm1.Edit1Change事件中,请仔细体会这段程序。  源代码下载   前言:“抢三十”是中国民间的一个游戏。游戏规则是:两人从1开始轮流报数,每人每次可加1或加2,谁先报到30,谁就为胜方。一个简单的游戏,要想获胜也只有掌握了其中的奥妙才行。但要想用程序去实现该如何做呢?本文就为你做一个详细的讲解。  必胜的原理  如何才能轻易获胜呢?这就要去寻找其中的规律。我制作了一个小程序,让你可以和计算机单挑。程序界面如图。   若你先报数,不是我夸口,你是一定斗不过计算机的;若计算机先报数,那么就看你的了,如果你犯任何一次错误,计算机都会抓住机会反败为胜。听起来这个程序好像很智能,其实它的道理很简单:  获胜的必要条件是:牢牢抓住3的倍数。具体来讲就是把对方报的数字与3求模,若值为1,则报的数字为对方的数字加2;若值为2,则报的数字为对方的数字加1;否则的话就随意报1或者2。这样在游戏中就能紧紧抓住3的倍数,坚持到最后就是胜利者。把这个算法用程序实现后,电脑在与人对局的时候就智能化了。试问不知道此算法的人会是电脑的对手吗?  关键代码  在有了程序的算法和界面之后,要编写完整的程序就不是很困难了。  最关键的显示实报的数字的Edit控件的Onchange代码: procedure TForm1.Edit1Change(Sender: TObject); begin  if flag=false then //得到控制权,计算机开始自动报数  begin   temp1:=s 1;   temp2:=s 2;   if (temp1 mod 3)=0 then //你报的最后的数字与3取模,若为1,则计算机加2   begin    s:=temp1;    j:=1;   end   else if (temp2 mod 3)=0 then //你报的最后的数字与3取模,若为2,则计算机加1   begin    s:=temp2;    j:=2;   end   else //否则计算机随机报一个数字或两个数字   begin    randomize();    j:=random(2) 1;    s:=s j;   end;   Button2.Enabled :=true; //计算机报数完毕后把报数按钮设为可用   Button3.Enabled :=true;   Button2.Caption :=IntToStr(s 1); //并把报数按钮的Caption设为将要选择的数字   Button3.Caption :=IntToStr(s 2);   Edit2.Text :=IntToStr(j); //显示计算机报的个数   ListBox1.Items.Add('计算机报的个数: ' IntToStr(j));//写入到历史记录   flag:=true; //交出控制权   Edit1.Text :=IntToStr(s); //显示计算机实际报的数字   if s>=30 then //判断游戏是否结束   begin    Button2.Enabled :=false;    Button3.Enabled :=false;    ShowMessage('嘿嘿,想赢我?动动脑筋再来吧!');   end;  end;end;  难点讲解  用一个BOOL变量来交接控制权,也就是什么时候该由你报数,什么时候该由计算机报数。  Form1.Edit1Change处理时要注意,Edit1显示的是计算机实际报的数字。当控制权移交到计算机时,计算机处理完报数程序后要做两件事:1交出控制权,2刷新Edit1的显示。这里要相当小心,看起来这两件事的先后顺序不重要,可实际上要特别注意:如果先刷新Edit1的显示再交出控制权的话,数据就会溢出!  道理是这样的,当程序执行到Edit1的显示刷新时,程序不再向下执行而是回到本段程序的第一行开始依次执行,当执行到这里时再次返回到第一行……死循环就产生了!所以一旦遇到刷新Edit1的显示时,请仔细考虑所做的事情是否存在先后顺序,因为执行Edit1的显示代码后程序将不再向下继续执行,而是跳到TForm1.Edit1Change事件中,请仔细体会这段程序。  源代码下载 下载本文示例代码


用Delphi设计“抢三十”游戏用Delphi设计“抢三十”游戏用Delphi设计“抢三十”游戏用Delphi设计“抢三十”游戏用Delphi设计“抢三十”游戏用Delphi设计“抢三十”游戏用Delphi设计“抢三十”游戏用Delphi设计“抢三十”游戏用Delphi设计“抢三十”游戏用Delphi设计“抢三十”游戏用Delphi设计“抢三十”游戏用Delphi设计“抢三十”游戏用Delphi设计“抢三十”游戏用Delphi设计“抢三十”游戏用Delphi设计“抢三十”游戏
阅读(124) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~