第1讲-枚举算法-俄罗斯方块游戏的自动求解.ppt

第1讲-枚举算法-俄罗斯方块游戏的自动求解.ppt

  1. 1、本文档共15页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

第1讲枚举算法-俄罗斯方块游戏的自动求解知识点俄罗斯方块游戏的自动求解1.1需求分析-俄罗斯方块游戏自动求解1.2响应F1键阶段程序:俄罗斯方块61.3自动求解初步实现-选择随机位置阶段程序:俄罗斯方块71.4自动求解最终实现阶段程序:俄罗斯方块81.1需求分析-俄罗斯方块游戏自动求解本案例要在“俄罗斯方块5:改进(在标题栏显示得分)”的基础上,实现以下功能:通过F1键来启动或关闭“自动求解”功能。当启动“自动求解”功能时,对下一个方块,选择一个最佳位置落下;同时不响应方向键和空格键、定时器加快5倍。当关闭“自动求解”功能时,可以通过方向键来玩俄罗斯方块游戏。动态更新窗口标题:提示“自动求解”功能是启动还是关闭,并显示游戏得分。1.2响应F1键本阶段要在“俄罗斯方块5:改进(在标题栏显示得分)”的基础上,实现以下功能:响应F1键:模拟“自动求解”功能的启动与关闭,并实现动态显示窗口标题。具体为:初始时,自动求解功能关闭,在窗口标题栏上显示“关闭”;当按下F1键时,启动自动求解功能,在窗口标题栏上显示“启动”,当再次按下F1键时,关闭自动求解功能,在窗口标题栏上显示“关闭”。实现步骤:定义状态变量bauto,表征“自动求解”功能是关闭还是启动。定义两个字符串s1和s2。响应F1按键。(详见代码)1.3自动求解初步实现-选择随机位置本阶段要在上一阶段的基础上,实现以下功能:当自动求解功能启动时,禁止方向键和空格键、但允许通过回车键暂停/恢复游戏,将下降定时器的时间修改为原来的1/5,为下一个方块随机地选择一个下落位置。实现步骤:定义BestStartX函数,为下一个方块随机地选择一个范围在[1,9]之间的下落位置(X坐标),在NewFall函数中,如果bAuto为true,则设置CurrentX为BestStartX函数的返回值。修改WM_KEYDOWN消息响应代码。(详见代码)1.4自动求解最终实现本阶段要在上一阶段的基础上,实现以下功能:修改BestStartX函数,实现真正的“自动求解”功能。为下一个方块寻找最佳下降位置的策略:策略1为:放置后,空出的方格数最小,为MinC1,此时能达到最高位置为MaxY1,该位置为BestX1。策略2为:放置后,能下降的位置最高,为MaxY2,此时空出的方格数为MinC2,该位置为BestX2。必有MaxY1=MaxY2,MinC1=MinC2。取二者的折衷,策略为:优先采取策略1,但如果MinC2==MinC1或MaxY2=MaxY1+2,则取策略2。项目实训(参考1)改进俄罗斯方块游戏自动求解的策略:现有的策略是不是还能改进?现有的策略只针对新落下的方块(去找一个最佳的下落位置)、没有针对当前方块找一个最佳的位置。等等。项目实训(参考2)葛永制作的自动俄罗斯方块,非常漂亮:有多种自动求解算法可供选择:标准算法;金优算法;金优攻击算法。提供了插件的接口:插件:就是动态库文件,用户可按照插件的范例实现自己的求解算法,并在该软件上演示。比一比修改自动求解的策略,看谁设计的策略得分更高。*《算法分析与设计》intBestStartX(){ intX,Y,tmpx,tmpy; //循环变量 intBestX=0,MaxY=0,MinC=100;//最终所求的最佳下降位置 intBestX1,MaxY1,MinC1; //策略1:MinC:最佳位置处放置方块时,空出的空格最少,BestX:最佳下降位置,MaxY:能下降到的位置 intBestX2,MaxY2,MinC2; //策略2:最佳位置为能下降的位置最高 intc; //以上策略求最值时用到的辅助变量 inttBox1[4][4],tBox2[4][4]; //tBox2为实现旋转时用到的临时变量 intRotates=0,Rotates1=0,Rotates2=0;//找到最佳位置后,当前方块需要旋转的次数 intLast1,Last2; //Last1为下一个方块未旋转时最下一个方格所在的行,Last2为旋转后最下一个方格所在的行 memcpy(tBox1,NextBox,sizeof(tBox1));memcpy(tBox2,NextBox,sizeof(tBox1)); for(tmpy=3;tmpy=0;tmpy--) //统计tBox1中最下一个方格所在的行 { for(tmpx=0;tmpx4;tmpx++)if(tBox1[tmpy][tmpx])break;

文档评论(0)

金华 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档