贪吃蛇控制台版(操作系统win7 64位;编译环境gcc, vs2017通过,其它环境未测试 不保证一定通过)

运行效果:

  1. #include <iomanip>
  2. #include <windows.h>
  3. #include <conio.h>
  4. using namespace std;
  5.  
  6. HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);//全局句柄
  7. class snake;
  8. void Init_Console();//控制台初始化
  9. void gotoPos(SHORT x = , SHORT y = );//光标坐标控制
  10. void Init_Map();//画边框
  11. void KeyConctrl(snake &,int);//键盘控制函数
  12. void is_gameover();//结束提示
  13. void Prompt_info(int, int);//提示信息
  14. void dis_date(int, int, double, int);//得分信息
  15.  
  16. bool gameOver = false;
  17. bool withdraw = false;
  18.  
  19. class snake
  20. {
  21. private:
  22. bool flash;
  23. int speed, length, print_bit, clear_bit;
  24. COORD in_Pos, bit_Pos;
  25. COORD _Pos[];
  26. enum direction{go_stop = , go_left, go_right, go_up, go_down}dir;
  27. public:
  28. snake(SHORT x = , SHORT y = )
  29. {
  30. clear_bit = print_bit = length = speed = ;
  31. in_Pos.X = x; in_Pos.Y = y; bit_Pos.X = ; bit_Pos.Y = ;
  32. flash = true ;
  33. dir = go_stop;
  34. _Pos[].X = in_Pos.X;
  35. _Pos[].Y = in_Pos.Y;
  36. }
  37. ~snake(){}
  38. void up_speed()
  39. {
  40. if(this->speed < )(this->speed)++;
  41.  
  42. }
  43. double get_speed()
  44. {
  45. return this->speed;
  46. }
  47. int get_length()
  48. {
  49. return this->length;
  50. }
  51. //
  52. void dir_control(char _dir)
  53. {
  54. switch(_dir)
  55. {
  56. case 's': this->dir = go_stop;
  57. break;
  58. case 'l': if(this->dir != go_right)this->dir = go_left;
  59. break;
  60. case 'r': if(this->dir != go_left)this->dir = go_right;
  61. break;
  62. case 'u': if(this->dir != go_down)this->dir = go_up;
  63. break;
  64. case 'd': if(this->dir != go_up)this->dir = go_down;
  65. break;
  66.  
  67. }
  68. }
  69.  
  70. //光标位置
  71. void setPos(COORD pos)
  72. {
  73. SetConsoleCursorPosition(hOut, pos);
  74. }
  75.  
  76. //碰撞检测
  77. void check_bit()
  78. {
  79. if(in_Pos.X == bit_Pos.X && in_Pos.Y == bit_Pos.Y)
  80. {
  81. length++;
  82. if((length % == ))
  83. {
  84. if(this->speed < )this->speed++;
  85. }
  86. if(length == )
  87. {
  88. cout << "游戏通关!" ;
  89. }
  90. do
  91. {
  92. srand(time(NULL));
  93. bit_Pos.X = + (rand()%)*;
  94. bit_Pos.Y = + rand()%;
  95. }while(check_snk(bit_Pos));
  96. }
  97. else
  98. {
  99. cle();
  100. clear_bit++;
  101. }
  102. }
  103. //撞蛇 撞边检测
  104. bool check_snk(COORD snk_Pos)
  105. {
  106. //边界检测
  107. if(snk_Pos.Y <= || (snk_Pos.Y >= ) || (snk_Pos.X <= ) || snk_Pos.X >= )
  108. {
  109. return true;
  110. }
  111. for(int i = clear_bit; i <= print_bit; i++)
  112. {
  113. if(_Pos[i].X == snk_Pos.X && _Pos[i].Y == snk_Pos.Y) return true;
  114. }
  115. return false;
  116. }
  117.  
  118. //显示
  119. void dis()
  120. {
  121. if(!flash)
  122. {
  123. setPos(bit_Pos);
  124. SetConsoleTextAttribute(hOut, 0x0e);
  125. cout << " ";
  126. flash = true;
  127. }
  128. else
  129. {
  130. setPos(bit_Pos);
  131. SetConsoleTextAttribute(hOut, 0x0e);
  132. cout << "■";
  133. flash = false;
  134. }
  135. setPos(in_Pos);
  136. SetConsoleTextAttribute(hOut, 0x09);
  137. cout << "■";
  138.  
  139. }
  140. void cle()
  141. {
  142.  
  143. setPos(_Pos[clear_bit]);
  144. SetConsoleTextAttribute(hOut, 0x05);
  145. cout << " ";
  146. }
  147.  
  148. void save_date()
  149. {
  150.  
  151. if(print_bit == )
  152. {
  153. for(int i = ; i <= length; i++)
  154. {
  155. _Pos[i].X = _Pos[clear_bit + i].X;
  156. _Pos[i].Y = _Pos[clear_bit + i].Y;
  157. }
  158. clear_bit = ;
  159. print_bit = length;
  160. }
  161. print_bit++;
  162. _Pos[print_bit].X = in_Pos.X;
  163. _Pos[print_bit].Y = in_Pos.Y;
  164.  
  165. }
  166.  
  167. // //移动
  168. bool move()
  169. {
  170. switch(this->dir)
  171. {
  172. case go_stop:
  173. break;
  174. case go_left:
  175. in_Pos.X -= ;
  176. if(check_snk(in_Pos))
  177. {
  178. return true;
  179. }
  180. dis();
  181. save_date();
  182. check_bit();
  183. break;
  184. case go_right:
  185. in_Pos.X += ;
  186. if(check_snk(in_Pos))
  187. {
  188. return true;
  189. }
  190. dis();
  191. save_date();
  192. check_bit();
  193. break;
  194. case go_up:
  195. in_Pos.Y--;
  196. if(check_snk(in_Pos))
  197. {
  198. return true;
  199. }
  200. dis();
  201. save_date();
  202. check_bit();
  203. break;
  204. case go_down:
  205. in_Pos.Y++;
  206. if(check_snk(in_Pos))
  207. {
  208. return true;
  209. }
  210. dis();
  211. save_date();
  212. check_bit();
  213. break;
  214. }
  215. return false;
  216. }
  217. };
  218.  
  219. int main()
  220. {
  221. do
  222. {
  223. Init_Console();
  224. Init_Map();
  225. Prompt_info(, );
  226. snake s(, );
  227. clock_t t_in, t_out;
  228. t_in = clock();
  229. s.dis();
  230. //
  231. while (!gameOver)
  232. {
  233. if (_kbhit())
  234. {
  235. KeyConctrl(s, _getch());
  236. }
  237.  
  238. t_out = clock();
  239. dis_date(, , s.get_speed(), s.get_length());
  240. if (t_out - t_in > ((0.25 - (s.get_speed() / )) * CLOCKS_PER_SEC))
  241. {
  242. t_in = t_out;
  243. gameOver = s.move();
  244. if (gameOver)
  245. {
  246. is_gameover();
  247. }
  248. }
  249. Sleep();
  250. }
  251. //
  252. while (gameOver)
  253. {
  254. if (_kbhit())
  255. {
  256. switch (_getch())
  257. {
  258. case 'y':
  259. case 'Y':
  260. gameOver = false;
  261. system("cls");
  262. break;
  263. case 'n':
  264. case 'N':
  265. gameOver = false;
  266. withdraw = true;
  267. break;
  268. }
  269. }
  270. Sleep();
  271. }
  272. }while (!withdraw);
  273. gotoPos(, );
  274. return ;
  275. }
  276.  
  277. //控制台初始化
  278. void Init_Console()
  279. {
  280. SetConsoleTitleA("Console_贪吃蛇");
  281. COORD dSiz = {, };
  282. SetConsoleScreenBufferSize(hOut, dSiz);//设置窗口缓冲区大小
  283. CONSOLE_CURSOR_INFO _guan_biao = {, FALSE};//设置光标大小,隐藏光标
  284. SetConsoleCursorInfo(hOut, &_guan_biao);
  285. system("color 0f");//设置画布颜色
  286.  
  287. }
  288. //光标位置
  289. void gotoPos(SHORT x, SHORT y)
  290. {
  291. COORD pos = {x, y};
  292. SetConsoleCursorPosition(hOut, pos);
  293. }
  294. //画边框
  295. void Init_Map()
  296. {
  297. //SetConsoleTextAttribute(hOut, 0xF0); //设置前景色,背景色
  298. system("cls");
  299. //左边框
  300. for(int i = ; i < ; i++)
  301. {
  302. cout << endl << " ●";
  303. }
  304. //上边框
  305. gotoPos(, );
  306. for(int i = ; i < ; i++)
  307. {
  308. cout << "●";
  309. }
  310. //下边框
  311. gotoPos(, );
  312. for(int i = ; i < ; i++)
  313. {
  314. cout << "●";
  315. }
  316. //右边框
  317. for(SHORT i = ; i <= ; i++)
  318. {
  319. gotoPos(, i);
  320. cout << "●";
  321. }
  322. }
  323. //键盘控制函数
  324. void KeyConctrl(snake &_snk, int _key)
  325. {
  326. switch(_key)
  327. {
  328. case ' ':
  329. _snk.dir_control('s');
  330. break;
  331. case 'w':
  332. case 'W':
  333. case : _snk.dir_control('u');
  334. break;
  335. case 'a':
  336. case 'A':
  337. case : _snk.dir_control('l');
  338. break;
  339. case 'd':
  340. case 'D':
  341. case : _snk.dir_control('r');
  342. break;
  343. case 's':
  344. case 'S':
  345. case : _snk.dir_control('d');
  346. break;
  347. case '+': _snk.up_speed();
  348. break;
  349. default: break;
  350. }
  351. }
  352. //结束提示
  353. void is_gameover()
  354. {
  355.  
  356. gotoPos(, );
  357. SetConsoleTextAttribute(hOut, 0xec);
  358. cout << "game over!";
  359. gotoPos(, );
  360. cout << "Y重新开始/N退出";
  361. SetConsoleTextAttribute(hOut, 0x0f);
  362.  
  363. }
  364. //提示信息
  365. void Prompt_info(int _x, int _y)
  366. {
  367.  
  368. SetConsoleTextAttribute(hOut, 0xB);
  369. gotoPos(_x+, _y+);
  370. cout << "■游戏说明:";
  371. gotoPos(_x+, _y+);
  372. cout << "A.每得500分移速自动加1";
  373. gotoPos(_x+, _y+);
  374. cout << "B.可手动加速,最高移速5";
  375. gotoPos(_x+, _y+);
  376. cout << "■操作说明:";
  377. gotoPos(_x+, _y+);
  378. cout << "□向左移动:← A";
  379. gotoPos(_x+, _y+);
  380. cout << "□向右移动:→ D";
  381. gotoPos(_x+, _y+);
  382. cout << "□向下移动:↓ S";
  383. gotoPos(_x+, _y+);
  384. cout << "□向上移动:↑ W";
  385. gotoPos(_x+, _y+);
  386. cout << "□控制加速:+";
  387. gotoPos(_x+, _y+);
  388. cout << "□暂停游戏:空格";
  389. gotoPos(_x+, _y+);
  390. cout << "□开始游戏:任意方向键";
  391. gotoPos(_x+, );
  392. cout <<"■By: Flowingwind 18.01.11";
  393. }
  394. //速度积分显示
  395. void dis_date(int _x, int _y, double Sped, int Score)
  396. {
  397. SetConsoleTextAttribute(hOut, 0xB);
  398. gotoPos(_x+, _y+);
  399. cout << setw() << "◆ 移动速度: ";
  400. SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_INTENSITY);
  401. cout << Sped;
  402. gotoPos(_x+, _y+);
  403. SetConsoleTextAttribute(hOut, 0xB);
  404. cout << "◆ 当前积分: ";
  405. SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_INTENSITY);
  406. cout << setw() << Score * ;
  407. }

代码应该还可以 做一些精简化处理!!!暂时先就这样了;

save_date()保存数据函数对内存做了一定优化处理,以达到使用较小内存可永久运行程序。

(虽然现在的电脑内存根本不用考虑这个,但想起我第一次玩贪吃蛇,还是在一款 掌机上玩的,有机会能拷贝上去也不错)

c/c++ 贪吃蛇控制台版的更多相关文章

  1. 原生js写的贪吃蛇网页版游戏特效

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <bo ...

  2. js贪吃蛇-简单版

    分享个用原生js写的贪吃蛇,最近在学java,按照当年写的 js的思路,转换成java,换汤不换药 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1 ...

  3. 贪吃蛇java版

    主要的蛇的类 import java.awt.Color; import java.awt.Graphics; import java.awt.HeadlessException; import ja ...

  4. 如何用python制作贪吃蛇以及AI版贪吃蛇

    用python制作普通贪吃蛇 哈喽,大家不知道是上午好还是中午好还是下午好还是晚上好! 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很 ...

  5. C语言 小游戏之贪吃蛇

    还记得非常久曾经听群里人说做贪吃蛇什么的,那时候大一刚学了C语言,认为非常难,根本没什么思路. 前不久群里有些人又在谈论C语言贪吃蛇的事了,看着他们在做,我也打算做一个出来. 如今大三,经过了这一年半 ...

  6. 原生JavaScript贪吃蛇

    在实例开发过程中还是能认识到很多不足的,并且加强了一些基础. 简单写一下制作过程: 1.创建画布 2.创建蛇和老鼠 坐标不能重叠 3.让蛇移动起来 4.添加死亡方法 5.添加转点坐标和方向 6.添加吃 ...

  7. C语言 贪吃蛇

    贪吃蛇(单人版): 本人先来介绍一个函数 -- bioskey函数: int bioskey (int cmd) 参数 (cmd) 基本功能 0 返回下一个从键盘键入的值(若不键入任何值,则将等下一个 ...

  8. 原生Js贪吃蛇游戏实战开发笔记

    前言 本课程是通过JavaScript结合WebAPI DOM实现的一版网页游戏---贪吃蛇的开发全过程,采用面向以象的思想设计开发.通过这个小游戏的开发, 不仅可以掌握JS的语法的应用,还可以学会D ...

  9. 贪吃蛇(C语言版)链表实现

    贪吃蛇 gitee:贪吃蛇C语言版: Snake 蛇的结构 typedef struct Snake { int x; int y; struct Snake *next; }; 游戏开始欢迎界面 / ...

随机推荐

  1. java傻瓜简单100%一定看的懂新手安装教程

    1.java官网   最新的不是很稳定 http://www.oracle.com/technetwork/java/javase/downloads/index.html 一直点下一步就可以,但别忘 ...

  2. vue项目的骨架及常用组件介绍

    vue项目基础结构 一个vue的项目,我觉得最小的子集其实就是{vue,vue-router,component},vue作为基础库,为我们提供双向绑定等功能.vue-router连接不同的" ...

  3. C. Kyoya and Colored Balls(Codeforces Round #309 (Div. 2))

    C. Kyoya and Colored Balls Kyoya Ootori has a bag with n colored balls that are colored with k diffe ...

  4. [Phonegap+Sencha Touch] 移动开发26 Android下的sencha touch程序,转屏时,Ext.Viewport不能触发orientationchange事件的解决的方法

    Sencha touch 2.4.2 已经解决问题了. 比方你为Ext.Viewport的orientationchange事件加入了一个监听方法: Ext.Viewport.on('orientat ...

  5. 查询linux版本命令

    [环境] Ubuntu [本文命令记录] uname -a lsb_release cat /etc/issue cat /proc/version [截图效果] (1)uname -a (2)lsb ...

  6. 【转载】Java系列笔记(3) - Java 内存区域和GC机制

    Java系列笔记(3) - Java 内存区域和GC机制 转载:原文地址http://www.cnblogs.com/zhguang/p/3257367.html 目录 Java垃圾回收概况 Java ...

  7. java 集合学习笔记

    1.Collection(单列结合) List(有序,数据可重复) ArrayList:底层数据结构是数组,查询快,增删慢,线程不安全,效率高. Vector:底层数据结构是数组,查询快,增删慢,线程 ...

  8. Redis 订阅发布 - Jedis实现

    Redis 订阅发布 - Jedis实现 我想到使用Redis的订阅发布模式是用来解决推送问题的-. 对于概念性的叙述,多多少少还是要提一下的: ​ 什么是Redis发布订阅?Redis发布订阅是一种 ...

  9. ListView用法总结C#

    ListView是个较为复杂的控件     网上教程写的很乱,C#中文资料太匮乏了,小白叔叔觉得有必要自己出一份了. http://blog.sina.com.cn/s/blog_43eb83b901 ...

  10. Intellij IDEA 像eclipse那样给maven添加依赖

    打开pom.xml,在它里面使用快捷键:ALT+Insert  ---->点击dependency 再输入想要添加的依赖关键字,比如:输个spring   出现下图: 根据需求选择版本,完成以后 ...