近期学ncurses。用贪吃蛇训练下

思路:不构造链表。蛇头向前进方向打点,蛇尾逐点消失,形成移动。

须要记录蛇头方向,蛇尾方向。并用list仿造队列,增加拐点信息(空间比链表每一个结点开辟空间节省非常多)

思路感觉比較清晰,几个小时就写了 出来

编程环境 ubuntu12.04   安装ncurses :sudo apt-get install ncurses  编译:g++ xx.cpp -lncurses

  1. #include<iostream>
  2. #include<list>
  3. #include<algorithm>
  4. #include<ncurses.h>
  5. #include<signal.h>
  6. #include<sys/time.h>
  7. #include<cstdio>
  8. #include<cstdlib>
  9. using namespace std;
  10.  
  11. /*************定义方向****************/
  12. #define UP 1
  13. #define DOWN 2
  14. #define LEFT 3
  15. #define RIGHT 4
  16.  
  17. #define random(x) (rand()%x+1) //用来产生随机数
  18.  
  19. struct SNode //结点
  20. {
  21. int x;
  22. int y;
  23. //SNode *next;
  24. }fruit; //定义果子
  25.  
  26. struct Snake
  27. {
  28. SNode front;
  29. SNode back;
  30. list<SNode> turn; //这里用list仿造一个队列
  31. list<int> turn_direction; //2个List主要用来存拐点信息。方便推断
  32. int front_direction; //蛇头的前进方向
  33. int back_direction; //蛇尾的消失方向
  34. int len;
  35. }mysnake;
  36.  
  37. int ch,eat,i;
  38. list<SNode>::iterator turn_iter;
  39. void show(int signumber);
  40. void conctroller(void);
  41. void draw_node(SNode node, char paint);
  42. void end_game();
  43. bool crash();
  44.  
  45. int main()
  46. {
  47. struct itimerval value;
  48. value.it_value.tv_sec=0;
  49. value.it_value.tv_usec=200000;
  50. value.it_interval.tv_sec=0;
  51. value.it_interval.tv_usec=200000;
  52. signal(SIGALRM,&show);
  53. // setitimer(ITIMER_REAL,&value,NULL);
  54.  
  55. initscr(); //初始化虚拟屏幕
  56. raw(); //禁用行缓冲
  57. noecho(); //关闭键盘回显
  58. keypad(stdscr,TRUE); //开启功能键盘
  59. for(int i=0;i<40;i++)
  60. {
  61. mvaddch(0,i,'-');
  62. mvaddch(21,i,'-');
  63. }
  64. for(int i=0;i<21;i++)
  65. {
  66. mvaddch(i,0,'|');
  67. mvaddch(i,41,'|');
  68. }
  69.  
  70. mysnake.front.x=2;
  71. mysnake.front.y=1;
  72. mysnake.back.x=1;
  73. mysnake.back.y=1;
  74. mysnake.len=2;
  75. fruit.x=random(20);
  76. fruit.y=random(20);
  77. draw_node(mysnake.front,'*');
  78. draw_node(mysnake.back,'*');
  79. draw_node(fruit,'#');
  80. mysnake.front_direction=RIGHT;
  81. mysnake.back_direction=RIGHT;
  82. mvprintw(22,0,"/******Game : snake len:%d by Plss******/",mysnake.len);
  83. refresh();
  84.  
  85. getch();//等待接收一个空字符,開始游戏
  86. setitimer(ITIMER_REAL,&value,NULL); //开启定时器
  87. while(ch != KEY_F(2))
  88. {
  89. conctroller();
  90. }
  91. endwin();
  92. return 0;
  93. }
  94.  
  95. void conctroller(void)
  96. {
  97. ch=getch();
  98. switch(ch)
  99. {
  100. case KEY_UP:
  101. if(mysnake.front_direction!=DOWN)
  102. {
  103. mysnake.front_direction=UP;
  104. mysnake.turn_direction.push_back(mysnake.front_direction);
  105. mysnake.turn.push_back(mysnake.front);
  106. sleep(100);
  107. }break;
  108. case KEY_DOWN:
  109. if(mysnake.front_direction!=UP)
  110. {
  111. mysnake.front_direction=DOWN;
  112. mysnake.turn_direction.push_back(mysnake.front_direction);
  113. mysnake.turn.push_back(mysnake.front);
  114. sleep(100);
  115. }break;
  116. case KEY_LEFT:
  117. if(mysnake.front_direction!=RIGHT)
  118. {
  119. mysnake.front_direction=LEFT;
  120. mysnake.turn_direction.push_back(mysnake.front_direction);
  121. mysnake.turn.push_back(mysnake.front);
  122. sleep(100);
  123. }break;
  124. case KEY_RIGHT:
  125. if(mysnake.front_direction!=LEFT)
  126. {
  127. mysnake.front_direction=RIGHT;
  128. mysnake.turn_direction.push_back(mysnake.front_direction);
  129. mysnake.turn.push_back(mysnake.front);
  130. sleep(100);
  131. }break;
  132. }
  133. }
  134. void show(int signumber)
  135. {
  136. if(signumber==SIGALRM)
  137. {
  138. eat=0;
  139. draw_node(mysnake.back,' ');
  140. if(mysnake.front.x==fruit.x && mysnake.front.y==fruit.y)
  141. eat=1;
  142. for(int i=0;i<=eat;i++)
  143. {
  144. switch(mysnake.front_direction)
  145. {
  146. case UP: mysnake.front.y--;break;
  147. case DOWN:mysnake.front.y++;break;
  148. case LEFT:mysnake.front.x--;break;
  149. case RIGHT:mysnake.front.x++;break;
  150. }
  151. draw_node(mysnake.front,'*');
  152. }
  153. switch(mysnake.back_direction)
  154. {
  155. case UP:mysnake.back.y--;break;
  156. case DOWN:mysnake.back.y++;break;
  157. case LEFT:mysnake.back.x--;break;
  158. case RIGHT:mysnake.back.x++;break;
  159. }
  160. if(mysnake.turn_direction.size() && (mysnake.back.x==mysnake.turn.front().x && mysnake.back.y==mysnake.turn.front().y))
  161. {
  162. mysnake.back_direction=mysnake.turn_direction.front();
  163. mysnake.turn_direction.pop_front();
  164. mysnake.turn.pop_front();
  165. }
  166.  
  167. if(crash()) end_game();
  168. if(eat)
  169. {
  170. mysnake.len++;
  171. mvprintw(22,0,"/******Game : snake len:%d by Plss******/",mysnake.len);
  172. fruit.x=random(20);
  173. fruit.y=random(20);
  174. draw_node(fruit,'#');
  175. }
  176. refresh();
  177. }
  178. }
  179. void draw_node(SNode node,char paint)
  180. {
  181. mvaddch(node.y,node.x,paint);
  182. }
  183.  
  184. void end_game()
  185. {
  186. struct itimerval value;
  187. value.it_value.tv_sec=0;
  188. value.it_value.tv_usec=0;
  189. value.it_interval.tv_sec=0;
  190. value.it_interval.tv_usec=0;
  191. setitimer(ITIMER_REAL,&value,NULL);
  192. mvprintw(10,18,"Game_over");
  193. }
  194. bool crash()
  195. {
  196. int Max,Min;
  197. SNode tmp;
  198. if(mysnake.front.x>40 || mysnake.front.x<=0 ||mysnake.front.y<=0 || mysnake.front.y>20 )
  199. return true; //撞墙
  200. /*推断是否撞到自己*/
  201. if(!mysnake.turn.empty())
  202. {
  203. i=mysnake.turn.size()-1;
  204. turn_iter = mysnake.turn.end();
  205.  
  206. while(i--)
  207. {
  208. tmp=*turn_iter;
  209. turn_iter--;
  210. if((*turn_iter).x==tmp.x && (*turn_iter).x==mysnake.front.x)
  211. {
  212. Max=max((*turn_iter).y,tmp.y);
  213. Min=min((*turn_iter).y,tmp.y);
  214. if(mysnake.front.y>=Min && mysnake.front.y<=Max)return true;
  215. }
  216. else if((*turn_iter).y==tmp.y && (*turn_iter).y==mysnake.front.y)
  217. {
  218. Max=max((*turn_iter).x,tmp.x);
  219. Min=min((*turn_iter).x,tmp.x);
  220. if(mysnake.front.x>=Min && mysnake.front.x<=Max)return true;
  221. }
  222.  
  223. }
  224. turn_iter = mysnake.turn.begin();
  225. if((*turn_iter).x==mysnake.back.x && (*turn_iter).x==mysnake.front.x)
  226. {
  227. Max=max((*turn_iter).y,mysnake.back.y);
  228. Min=min((*turn_iter).y,mysnake.back.y);
  229. if(mysnake.front.y>=Min && mysnake.front.y<=Max)return true;
  230. }
  231. else if((*turn_iter).y==mysnake.back.y && (*turn_iter).y==mysnake.front.y)
  232. {
  233. Max=max((*turn_iter).x,mysnake.back.x);
  234. Min=min((*turn_iter).x,mysnake.back.x);
  235. if(mysnake.front.x>=Min && mysnake.front.x<=Max)return true;
  236. }
  237. }
  238.  
  239. return false;
  240. }

贪吃蛇 c++ ncurses的更多相关文章

  1. Linux Curses编程实现贪吃蛇

    curses库 简单而言,提供UNIX中多种终端 操作光标和显示字符 的接口.我们常见的vi就是使用curses实现的.现在一般都用ncurses库. Linux下curses函数库    Linux ...

  2. Android快乐贪吃蛇游戏实战项目开发教程-01项目概述与目录

    一.项目简介 贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏. 我已经将做好的案例上传到了应用宝,无病毒.无广告,大家可以放心下载下来把玩一下.应用宝 ...

  3. 用C++实现的贪吃蛇游戏

    我是一个C++初学者,控制台实现了一个贪吃蛇游戏. 代码如下: //"贪吃蛇游戏"V1.0 //李国良于2016年12月29日编写完成 #include <iostream& ...

  4. [LeetCode] Design Snake Game 设计贪吃蛇游戏

    Design a Snake game that is played on a device with screen size = width x height. Play the game onli ...

  5. JavaScript-简单的贪吃蛇小游戏

    实现逻辑: //获取Html中的格子(行,列) //建立数组存储所有格子(x,y) //建立数组用于存储蛇身(x,y) //生成随机坐标(x,y)的函数 //随机创建蛇身并存储到蛇身数组 //创建食物 ...

  6. juery实现贪吃蛇的游戏

    今天用juery做了一个贪吃蛇的游戏,代码比较简陋,不过作为这些天学习juery的成果,非常有成就感.另外关于代码内容如有雷同不胜荣幸. 更改了下 让头和身子的颜色不一样 这样好区分些,虽然还是不怎么 ...

  7. HTML 5 背离贪吃蛇 写成了类似于屏幕校准

    中间写了改 改了写 还是没做出自己满意的效果 ,看来自己的确不是一个走前端的料子.当然h5还是学一点好一点 具体说来 就是 在canvas 的画布中 鼠标点击后画上一个圆形 然后就有随机的在画布上面出 ...

  8. 控制台游戏引擎CGE——贪吃蛇

    今天我也来发一个控制台游戏.先看图: 缘起 LZ是一个有严重拖延症的人,表现的形式就是隔一段时间就要刷一刷博客园. 这不前几天,看到了魏大师<使用Lua脚本语言开发出高扩展性的系统...> ...

  9. 原生JS制作贪吃蛇小游戏

    感情都在代码里,来,干了!... <!doctype html> <html> <head> <meta http-equiv="Content-T ...

随机推荐

  1. CAD使用GetxDataString读数据(com接口)

    主要用到函数说明: MxDrawEntity::GetxDataString2 读取一个字符扩展数据,详细说明如下: 参数 说明 [in] LONG lItem 该值所在位置 [out, retval ...

  2. ubuntu apt-update NO_PUBKEY 40976EAF437D05B5 NO_PUBKEY 3B4FE6ACC0B21F32

    Fetched 28.1 MB in 11s (2344 kB/s) W: GPG error: http://archive.canonical.com xenial Release: The fo ...

  3. 2.10.2 section元素

    section元素 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> & ...

  4. delphi byte to of set

    最佳方案 type // Controls.TCMMouseWheel relies on TShiftState not exceeding 2 bytes in size TShiftState ...

  5. ICMP协议和ping命令

    当网络不通的情况下,通常会想到ping命令,ping一下,但是ping命令内部如何执行的,可能并不清楚,其实ping是基于ICMP协议进行工作的.  一.ICMP协议的格式 ICMP是在RFC 792 ...

  6. assert.notEqual()

    浅测试,使用不等于比较运算符(!=)比较. const assert = require('assert'); assert.notEqual(1, 2); // OK assert.notEqual ...

  7. ecshop 修改支持php7 方案

    修改方法 http://jsb.php-php.com/2016/05/472/ 修改数据库配置 data/config.php

  8. Python-基本图形绘制及库引用

    turtle库的使用 概述:turtle(海龟)库是turtle绘图体系的python实现 turtle库的理解: -有一只海龟,其实在窗体正中心,在画布上游走 -走过的轨迹形成了绘制的图形 -海龟由 ...

  9. Spider-scrapy断点续爬

    scrapy的每一个爬虫,暂停时可以记录暂停状态以及爬取了哪些url,重启时可以从暂停状态开始爬取过的URL不在爬取 实现暂停与重启记录状态 方法一: 1.首先cd进入到scrapy项目里(当然你也可 ...

  10. Oracle 实现查询不区分大小写(SQL实现)

    转为小写  LOWER('ABC') 结果 abc转为大写  UPPER('aBc') 结果 ABC 将数据库字段数据和前台接受的值全部转换为大写或者小写 例: select * from table ...