在网上看到一段贪吃蛇程序,自己心痒下了下来又稍微做了一点修改。

没有用面向对象的方式来进行封装,下次准备试试。

需要在windows环境下进行编译

  1. #include<iostream>
  2. #include<windows.h>
  3. #include<conio.h>
  4. #include<time.h>
  5. #include<stdlib.h>
  6.  
  7. using namespace std;
  8.  
  9. #define COUT cout<<"■"
  10. #define MOVE_UP 1
  11. #define MOVE_LEFT 2
  12. #define MOVE_DOWN 3
  13. #define MOVE_RIGHT 4
  14.  
  15. struct Body {
  16. int x,y;
  17. Body *next;
  18. };
  19.  
  20. int Food=,Food_x,Food_y,Direction=MOVE_RIGHT,Grade,Score=;
  21. // 定义蛇的头部
  22. Body *body001=new Body[sizeof(Body)];
  23.  
  24. // 在指定位置输出需要显示的字符
  25. void Position(int x,int y) {
  26. // 定位坐标
  27. COORD pos={y-,x-};
  28. // 把字符输出到屏幕(命令行)
  29. HANDLE Out=GetStdHandle(STD_OUTPUT_HANDLE);
  30. // 定位光标位置
  31. SetConsoleCursorPosition(Out,pos);
  32. }
  33.  
  34. // 初始化蛇开始时的数量(4)
  35. void CreatSneak() {
  36. // 定义初始状态蛇头后的三个身体
  37. Body *body002=new Body[sizeof(Body)];
  38. Body *body003=new Body[sizeof(Body)];
  39. Body *body004=new Body[sizeof(Body)];
  40. // 固定初始状态的蛇的位置
  41. body001->x=;body001->y=;
  42. body002->x=;body002->y=;
  43. body003->x=;body003->y=;
  44. body004->x=;body004->y=;
  45. // 初始状态的蛇连接(最后一个蛇身体指向即将被连接的身体)
  46. body001->next=body002;
  47. body002->next=body003;
  48. body003->next=body004;
  49. body004->next=NULL;
  50. }
  51.  
  52. // 创建游戏的框体
  53. void Prt_Map() {
  54. int i;
  55. for(i=;i<=;i+=) {
  56. Position(,i);COUT;
  57. Position(,i);COUT;
  58. }//x:2~23 共22个
  59. for(i=;i<=;i++) {
  60. Position(i,);COUT;
  61. Position(i,);COUT;//y:3~55共27个
  62. Position(i,);COUT;
  63. }
  64. }
  65.  
  66. // 创建右侧的分数和选取的速度级别
  67. void Prt_Sneak() {
  68. // 定义蛇并使其指向蛇头
  69. Body *p;
  70. p=body001;
  71. // 通过循环不断指向下一个指针指向的位置来实现蛇的移动
  72. while(p!=NULL) {
  73. Position(p->x,p->y);COUT;
  74. p=p->next;
  75. }
  76. Position(Food_x,Food_y);COUT;
  77. // 实时分数
  78. Position(,);cout<<"Score: "<<Score;
  79. // 选取的速度级别
  80. Position(,);cout<<"Grade: "<<Grade;
  81. }
  82.  
  83. // 是否有异常的操作导致游戏结束
  84. int JudgeOver() {
  85. Body *p;
  86. p=body001->next;
  87. // 如果蛇碰到边框,则游戏结束
  88. if(body001->y==||body001->y==||body001->x==||body001->x==){
  89. return ;
  90. }
  91. // 如果没有碰到自身,那么正常执行
  92. while(!(p->x==body001->x&&p->y==body001->y)) {
  93. if(p->next==NULL) {
  94. return ;
  95. }
  96. p=p->next;
  97. }
  98. // 碰到自身,游戏结束
  99. return ;
  100. }
  101.  
  102. // 创建贪吃蛇的下一个食物
  103. void Creat_Food() {
  104. // 如果页面上没有食物,则创建
  105. if(Food==) {
  106. // 用当前的时间值来作为随机数种子,在随机位置定义
  107. srand((int)time());
  108. // 取随机数定义食物的横轴,后面的数操作是确保生成的食物在游戏框体内
  109. Food_x=rand()%+;
  110. int temp=rand()%+;
  111. // 定义食物的竖轴
  112. if(temp%==) {
  113. Food_y=temp+;
  114. }
  115. else {
  116. Food_y=temp;
  117. }
  118. Food=;
  119. }
  120. }
  121.  
  122. // 操作贪吃蛇随着键盘的移动而移动
  123. void Move() {
  124. Body *p=new Body[sizeof(Body)],*q,*temp=new Body[sizeof(Body)];
  125. // 向上
  126. if(Direction==MOVE_UP) {
  127. if(body001->x==(Food_x+)&&body001->y==Food_y) {
  128. temp->x=Food_x;temp->y=Food_y;temp->next=body001;body001=temp;Food=;Score+=;
  129. }
  130. else {
  131. temp->x=body001->x-;temp->y=body001->y;temp->next=body001;body001=temp;
  132. q=body001;
  133. while((q->next)->next!=NULL)q=q->next;
  134. Position((q->next)->x,(q->next)->y);cout<<" ";
  135. delete(q->next); q->next=NULL;
  136. }
  137. }
  138. // 向左
  139. if(Direction==MOVE_LEFT) {
  140. if(body001->x==Food_x&&body001->y==(Food_y+)) {
  141. temp->x=Food_x;temp->y=Food_y;temp->next=body001;body001=temp;Food=;Score+=;
  142. }
  143. else {
  144. temp->x=body001->x;temp->y=body001->y-;temp->next=body001;body001=temp;
  145. q=body001;
  146. while((q->next)->next!=NULL)q=q->next;
  147. Position((q->next)->x,(q->next)->y);cout<<" ";
  148. delete(q->next); q->next=NULL;
  149. }
  150. }
  151. // 向下
  152. if(Direction==MOVE_DOWN) {
  153. if(body001->x==(Food_x-)&&body001->y==Food_y) {
  154. temp->x=Food_x;temp->y=Food_y;temp->next=body001;body001=temp;Food=;Score+=;
  155. }
  156. else {
  157. temp->x=body001->x+;temp->y=body001->y;temp->next=body001;body001=temp;
  158. q=body001;
  159. while((q->next)->next!=NULL)q=q->next;
  160. Position((q->next)->x,(q->next)->y);cout<<" ";
  161. delete(q->next); q->next=NULL;
  162. }
  163. }
  164. // 向右
  165. if(Direction==MOVE_RIGHT) {
  166. if(body001->x==Food_x&&body001->y==(Food_y-)) {
  167. temp->x=Food_x;temp->y=Food_y;temp->next=body001;body001=temp;Food=;Score+=;
  168. }
  169. else{
  170. temp->x=body001->x;temp->y=body001->y+;temp->next=body001;body001=temp;
  171. q=body001;
  172. while((q->next)->next!=NULL)q=q->next;
  173. Position((q->next)->x,(q->next)->y);cout<<" ";
  174. delete(q->next); q->next=NULL;
  175. }
  176. }
  177. }
  178.  
  179. // 执行游戏
  180. void Game() {
  181. while() {
  182. // 如果游戏失败,返回
  183. if(JudgeOver()==) {
  184. return;
  185. }
  186. // 键盘操作光标键上
  187. if(GetAsyncKeyState(VK_UP)&&Direction!=MOVE_DOWN) {
  188. Direction=MOVE_UP;
  189. }
  190. // 键盘操作光标键左
  191. if(GetAsyncKeyState(VK_LEFT)&&Direction!=MOVE_RIGHT) {
  192. Direction=MOVE_LEFT;
  193. }
  194. // 键盘操作光标键下
  195. if(GetAsyncKeyState(VK_DOWN)&&Direction!=MOVE_UP) {
  196. Direction=MOVE_DOWN;
  197. }
  198. // 键盘操作光标键右
  199. if(GetAsyncKeyState(VK_RIGHT)&&Direction!=MOVE_LEFT) {
  200. Direction=MOVE_RIGHT;
  201. }
  202. // 创建贪吃蛇的下一个食物
  203. Creat_Food();
  204. // 取得贪吃蛇随着键盘的移动而移动的坐标
  205. Move();
  206. // 移动蛇
  207. Prt_Sneak();
  208. // 根据输入的速度,决定程序执行挂起的时间,以便得到移动速度
  209. Sleep(-Grade*);
  210. }
  211. }
  212.  
  213. void main() {
  214. Position(,);
  215. cout<<"Plese Select Grade:[1~10]";
  216. // 输入蛇的运行速度
  217. cin>>Grade;
  218.  
  219. // 限制速度在1~10
  220. if(Grade<||Grade>) {
  221. system("cls");
  222. Position(,);
  223. cout<<"Wrong Grade!"<<endl;
  224. return;
  225. }
  226. // 清除屏幕上的显示信息
  227. system("cls");
  228. // 创建初始状态的蛇
  229. CreatSneak();
  230. // 创建并显示游戏的框体
  231. Prt_Map();
  232. // 定义蛇的移动,创建右侧的分数和选取的速度级别
  233. Prt_Sneak();
  234.  
  235. // 运行游戏
  236. Game();
  237. system("cls");
  238. Position(,);
  239. // 如果满屏,则输出成功,反之则输出失误
  240. if (Score >= ) {
  241. cout<<"You Win !"<<endl;
  242. } else {
  243. cout<<"You Lost !"<<endl;
  244. }
  245. Position(,);
  246. cout<<"You Got "<<Score<<" Scores"<<endl;
  247. Position(,);
  248. getch();
  249. }

[010]转+修正---C++的贪吃蛇程序(未用面向对象封装)的更多相关文章

  1. 一个简单的c# 贪吃蛇程序

    一个简单的c#贪吃蛇程序 程序分为界面设计和程序设计:界面设计和程序设计均参考了一些游戏实例,但是所有代码内容是本人编写. 由于看到别人写的程序并没有署名,这里的署名全部都是csdn官网. 游戏界面设 ...

  2. C#简单实现贪吃蛇程序(LinQ + Entity)

    做梦想起来的C#简单实现贪吃蛇程序(LinQ + Entity) 最近一直在忙着单位核心开发组件的版本更新,前天加了一个通宵,昨天晚上却睡不着,脑子里面突然不知怎的一直在想贪吃蛇的实现方法.以往也有类 ...

  3. 做梦想起来的C#简单实现贪吃蛇程序(LinQ + Entity)

    最近一直在忙着单位核心开发组件的版本更新,前天加了一个通宵,昨天晚上却睡不着,脑子里面突然不知怎的一直在想贪吃蛇的实现方法.以往也有类似的情况,白天一直想不通的问题,晚上做梦有时会想到更好的版本,于是 ...

  4. Java小游戏贪吃蛇

    package snake; import java.awt.BorderLayout;import java.awt.Canvas;import java.awt.Color;import java ...

  5. UI创意求助:手机贪吃蛇游戏方向控制键设计

    继上一片博文<做梦想起来的C#简单实现贪吃蛇程序(LinQ + Entity)>之后,尝试做一个手机版本,大部分的功能都已经实现了.但在贪吃蛇的方向控制设计上一直不太满意.由于手机界面的大 ...

  6. 关于用Java写的贪吃蛇游戏的一些感想

    学习Java有那么一个月了,兴趣还是挺高的.然而最近老师布置的一个迷宫问题,着实让我头疼了一两个礼拜,以至于身心疲惫,困扰不安.无奈,暂且先放下这个迷宫问题,写个简单点的贪吃蛇程序,以此来提高低落的情 ...

  7. 如何用Python写一个贪吃蛇AI

    前言 这两天在网上看到一张让人涨姿势的图片,图片中展示的是贪吃蛇游戏, 估计大部分人都玩过.但如果仅仅是贪吃蛇游戏,那么它就没有什么让人涨姿势的地方了. 问题的关键在于,图片中的贪吃蛇真的很贪吃XD, ...

  8. Devc++贪吃蛇

    使用Devc++写的一个简单版贪吃蛇程序,不过,在未配置之前,是不包含图形库的,所以需要自己配置新的环境 ----------------------------------------------- ...

  9. html5面向对象做一个贪吃蛇小游戏

    canvas加面向对象方式的贪吃蛇 2016-08-25 这个小游戏可以增加对面向对象的理解,可以加强js逻辑能力,总之认真自己敲一两遍收获还是不少啊!!适合刚学canvas的同学练习!! 废话不多说 ...

随机推荐

  1. Java [leetcode 33]Search in Rotated Sorted Array

    题目描述: Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 ...

  2. jwplayer 网页在线播放插件

    1.到官网 https://www.jwplayer.com/ 注册,取得key并下载免费版本(免费版只支持mp4格式): 2.编辑如下网页即可在线播放: <!DOCTYPE html> ...

  3. Android 自动换行流式布局的RadioGroup

    效果图 用法 使用FlowRadioGroup代替RadioGroup 代码 import android.content.Context; import android.util.Attribute ...

  4. ClassLoader工作机制

    阅读目录 一.ClassLoader概念 二.JVM平台提供三层classLoader 三.JVM加载class文件到内存有两种方式 四.ClassLoader加载类的过程 五.自定义类加载器 六.实 ...

  5. 文件上传利器JQuery上传插件Uploadify

    在做日常项目中,经常在后台需要上传图片等资源文件,之前使用过几次这个组件,感觉非常好用 ,但是每次使用的时候都是需要经过一番查阅,所以还不如记住在这里,以后使用的时候就翻翻. 他的官方网站如下:htt ...

  6. CPU affinity 进程和线程的亲缘性

    设置Processor Affinity 作用: 1.进程和线程的亲缘性(affinity),使进程或线程在指定的CPU(核)上运行.(比如程序A,在第4个核心上运行) 2.设置进程 或者 线程, 使 ...

  7. Webdriver API (二)

    (转载) 1.3 打开测试页面 对页面对测试,首先要打开被测试页面的地址(如:http://www.google.com),web driver 提供的get方法可以打开一个页面: // And no ...

  8. Oracle函数:求两个数的最小公倍数

    CREATE or replace function GetGbs(num1 NUMBER,num2 NUMBER) RETURN NUMBER is resultnum NUMBER; maxnum ...

  9. android 实现模拟按键

    android 实现模拟按键方法一 通过Runtime实现,代码如下: try { String keyCommand = "input keyevent " + KeyEvent ...

  10. 【原】Storm 守护线程容错机制

    Storm入门教程 1. Storm基础 Storm Storm主要特点 Storm基本概念 Storm调度器 Storm配置 Guaranteeing Message Processing(消息处理 ...