今天和人吃晚饭突然想起来

之前西佳佳老师说小学期会要求两星期撸一个小游戏

有人已经撸完一个俄罗斯方块了...

菜逼我决定从最简单的贪吃蛇玩起...

我是直接参考的这个博客

算是相当简单而且很Low的实现了

在我看来

开始和结束界面不是重点

自己随意设计一下吧

然后贪吃蛇的活动问题

由定时清屏再输出字符矩阵来解决

果实位置当然由随机数获得

定时问题直接用ctime函数来计算

这里的开始界面也用到了

清屏再输出的方式进行了倒计时

对蛇身的记录可以使用双端队列deque

操作不是很多也可以手写

获取键盘读入的问题

可以用键盘扫描码来解决

上下左右分别为72 80 75 77

_kbhit()函数判断是否有键盘输入

默认除“上下左右”以外的输入直接导致游戏结束

另一个可行的方案就是使用WASD来控制方向

就不必使用键盘扫描码了

然后代码里虽然同时使用了getch 和 _getch

但其实这似乎只是不同库里的功能一样的函数...

最后放上相当简陋的代码(我好懒就没写注释)

  1. #include<ctime>
  2. #include<cstdio>
  3. #include<conio.h>
  4. #include<cstdlib>
  5.  
  6. #define map(pos) map[pos.x][pos.y]
  7.  
  8. char map[][];
  9.  
  10. struct point {
  11. int x, y;
  12.  
  13. void _rand() {
  14. x = rand() % + ;
  15. y = rand() % + ;
  16. }
  17.  
  18. bool operator == (const point &a) const {
  19. return x == a.x && y == a.y;
  20. }
  21.  
  22. };
  23.  
  24. int head, tail;
  25. point snake[], food, next;
  26. int dir, grade, length, uptime;
  27.  
  28. inline void find_food() {
  29. do {
  30. food._rand();
  31. }while(map(food) != ' ');
  32. map(food) = '*';
  33. }
  34.  
  35. inline void update() {
  36. system("cls");
  37. puts("");
  38. for(int i = ;i < ;i ++) {
  39. putchar('\t');
  40. for(int j = ;j < ;j ++)
  41. putchar(map[i][j]), putchar(' ');
  42. if(i == ) printf("\t等级为:%d", grade);
  43. if(i == ) printf("\t长度为:%d", length);
  44. if(i == ) printf("\t自动前进时间");
  45. if(i == ) printf("\t间隔为:%d ms", uptime);
  46. puts("");
  47. }
  48. }
  49.  
  50. inline bool GO() {
  51. bool timeover = ;
  52. double start = (double) clock() / CLOCKS_PER_SEC;
  53. while((timeover = (double) clock() / CLOCKS_PER_SEC <= start + uptime / 1000.0) && !_CRTIMP::_kbhit());
  54. if(timeover) {
  55. _getch();
  56. dir = _getch();
  57. }
  58. next = snake[head];
  59. switch (dir) {
  60. case :next.x -= ;break;
  61. case :next.x += ;break;
  62. case :next.y -= ;break;
  63. case :next.y += ;break;
  64. default:
  65. puts("\tGame over!");
  66. return ;
  67. }
  68. if(!next.x || next.x == || !next.y || next.y == ) {
  69. puts("\tGame over!");
  70. return ;
  71. }
  72. if(map(next) != ' ' && !(next == food)) {
  73. puts("\tGame over!");
  74. return ;
  75. }
  76. if(length == ) {
  77. puts("\tGood game!");
  78. return ;
  79. }
  80. return ;
  81. }
  82.  
  83. int main() {
  84. srand();
  85. for(int i = ;i <= ;i ++)
  86. for(int j = ;j <= ;j ++)
  87. map[i][j] = ' ';
  88. for(int i = ;i < ;i ++)
  89. map[i][] = map[][i] = map[][i] = map[i][] = '!';
  90. map[][] = map[][] = 'o', map[][] = '@';
  91. snake[] = (point){, };
  92. snake[] = (point){, };
  93. snake[] = (point){, };
  94. head = , tail = , grade = , length = , uptime = ;
  95. find_food(), dir = ;
  96.  
  97. puts("\n\n\n\t\t\t即将开始玩蛇!");
  98. double start;
  99. for(int i = ;i >= ;i --) {
  100. start = (double)clock() / CLOCKS_PER_SEC;
  101. while((double)clock() / CLOCKS_PER_SEC <= start + );
  102. if(i > ) {
  103. system("cls");
  104. printf("\n\n\n\t\t\t进入倒计时:%d\n", i);
  105. }
  106. else {
  107. update();
  108. }
  109. }
  110.  
  111. while() {
  112. if(GO()) {
  113. if(next == food) {
  114. length ++;
  115. if(length % == ) {
  116. grade ++;
  117. if(uptime >= ) uptime -= ;
  118. }
  119. map(next) = '@';
  120. map(snake[head]) = 'o';
  121. head = (head + ) % ;
  122. snake[head] = next;
  123. find_food(), update();
  124. }
  125. else {
  126. map(snake[tail]) = ' ';
  127. tail = (tail + ) % ;
  128. map(next) = '@';
  129. map(snake[head]) = 'o';
  130. head = (head + ) % ;
  131. snake[head] = next;
  132. update();
  133. }
  134. }
  135. else break;
  136. }
  137. getch();
  138. return ;
  139. }

没有使用图形

开始界面还能接受

结束界面没有再来一局的提示

也没有最终分数的显示

有待改进

另外想写一个自动玩这个游戏的程序

不考虑最短路径的话

在nm不全为奇数的情况下是有必胜策略的

而这是比较好实现的

但还要考虑一下怎么把它自己玩的过程展现出来?

直接把游戏代码嵌入进去?那岂不是很蠢?

而考虑同等分数下的最少按键次数或最少移动次数呢?

似乎可以尝试用机器学习的方法来搞一搞?

都忘记到底是深度学习还是强化学习了...

但这似乎可能又与随机出来的果实位置有关?

机器学习的话,可以直接尝试让它自己学着玩这个游戏?

......

看上去比上一个想法更有实现的意义?

先到此为止

play snake on windows的更多相关文章

  1. C++控制台贪吃蛇代码

    游戏截图: 以下是3个代码文件: Snake_Class.h文件: #ifndef SNAKE #define SNAKE #include<windows.h> #include< ...

  2. windows下搭建svn服务端、客户端

    1.安装SVN服务器subversion以及客户端TortoiseSVN,在网上下载windows版的subversion,TortoiseSVN并安装,比如我的服务端安装在了D:\Program F ...

  3. Windows程序设计 贪吃蛇c

    看Windows程序有段时间了,终于动手写东西.贪吃蛇算是一个开始吧,下面的贪吃蛇很简单,也有很多地方需要修改,还有情况没有考虑QAQ 但这不是我的目的了... 思路很简单:建个链表储存蛇身节点即可. ...

  4. 教你pomeloclient包libpomelo增加cocos2d-x 3.0工程(Windows、Android、IOS平台)

    Windows平台 操作系统:Windows7(64-bit) VS版本号:2013 Cocos2d-x版本号:3.0 project路径:E:\cocos2d-prj\ 1.从github下载lib ...

  5. Windows API教程文件系统

    本篇文章主要介绍了"Windows API教程文件系统",主要涉及到Windows API教程文件系统方面的内容,对于Windows API教程文件系统感兴趣的同学可以参考一下. ...

  6. play snake on linux

    在写完超Low的windows上的贪吃蛇后 被人吐槽了几个方面: 1.界面真的Low,开始,结束,游戏中,都太简陋了... 2.每次都清屏在输出字符矩阵的解决方案...太晃眼了 3.一个BUG,为了解 ...

  7. Windows server 2012 添加中文语言包(英文转为中文)(离线)

    Windows server 2012 添加中文语言包(英文转为中文)(离线) 相关资料: 公司环境:亚马孙aws虚拟机 英文版Windows2012 中文SQL Server2012安装包,需要安装 ...

  8. Windows Server 2012 NIC Teaming介绍及注意事项

    Windows Server 2012 NIC Teaming介绍及注意事项 转载自:http://www.it165.net/os/html/201303/4799.html Windows Ser ...

  9. C# 注册 Windows 热键

    闲扯: 前几日,一个朋友问我如何实现按 F1 键实现粘贴(Ctrl+V)功能,百度了一个方法,发给他,他看不懂(已经是 Boss 的曾经的码农),我就做了个Demo给他参考.今日得空,将 Demo 整 ...

随机推荐

  1. B1877 [SDOI2009]晨跑 费用流

    其实之前写过一个板子,但是一点印象都没有,所以今天重写了一下,顺便把这个题当成板子就行了. 其实费用流就是把bfs换成spfa,但是中间有一个原则,就是费用优先,在费用(就是c)上跑spfa,顺便求出 ...

  2. jeesite ckeditor数据库 HTML 被编码 的问题解决

    public abstract class BaseController { /** * 初始化数据绑定 * 1. 将所有传递进来的String进行HTML编码,防止XSS攻击 * 2. 将字段中Da ...

  3. cloudstack ---部署的架构

    cloudstack跟KVM一起部署的架构 下图是CloudStack跟kvm一起部署的架构: 在每个kvm的宿主机上都需要部署agent程序. cloudstack跟vsphere一起部署的架构 下 ...

  4. Network(Tarjan+LCA)

    http://poj.org/problem?id=3417 元宵节+情人节晚上刷的题,纪念一下.. 题意:给出n个点,m条边,然后Q个询问,每次询问输入一条边,输出加入此边后桥的个数.. #incl ...

  5. Dsp和ARM的区别

    有一次上课老师在将ARM的时候说到了Dsp. Dsp(Digital Signal Process),数字信号处理技术,而Dsp芯片和ARM的结构也有很多相似之处.比如有流水线.采用哈佛结构(早期的A ...

  6. poi 和jxl导出excel(2)

    controller: /** * 导出报表 * @return */ @RequestMapping(value = "/export") @ResponseBody publi ...

  7. RocketMQ(2)

    1. 消费端集群消费(负载均衡) 示例代码: /** * Producer,发送消息 * */ public class Producer { public static void main(Stri ...

  8. [ SCOI 2007 ] Perm

    \(\\\) \(Description\) 给出只包括多个\(0\text~ 9\)的数字集,求有多少个本质不同的全排列,使得组成的数字能够整除\(M\). \(|S|\in [1,10]\),\( ...

  9. ie9以下的浏览器兼容性问题

    .bind不兼容的问题Function.prototype.bind = function () { var fn = this, args = Array.prototype.slice.call( ...

  10. 利用php生成验证码

    <?php /** * php生成验证码 * @param $width 画布宽 * @param $height 画布高 * @param $vcodelen 验证码长度 * @param $ ...