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

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

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

需要在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=0,Food_x,Food_y,Direction=MOVE_RIGHT,Grade,Score=0;
 21 // 定义蛇的头部
 22 Body *body001=new Body[sizeof(Body)];
 23 
 24 // 在指定位置输出需要显示的字符
 25 void Position(int x,int y) {
 26     // 定位坐标
 27     COORD pos={y-1,x-1};
 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=11;body001->y=35;
 42     body002->x=11;body002->y=33;
 43     body003->x=11;body003->y=31;
 44     body004->x=11;body004->y=29;
 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=1;i<=80;i+=2) {
 56         Position(1,i);COUT;
 57         Position(24,i);COUT;
 58     }//x:2~23 共22个
 59     for(i=1;i<=24;i++) {
 60         Position(i,1);COUT;
 61         Position(i,57);COUT;//y:3~55共27个
 62         Position(i,79);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(7,63);cout<<"Score: "<<Score;
 79     // 选取的速度级别
 80     Position(10,63);cout<<"Grade: "<<Grade;
 81 }
 82 
 83 // 是否有异常的操作导致游戏结束
 84 int JudgeOver() {
 85     Body *p;
 86     p=body001->next;
 87     // 如果蛇碰到边框,则游戏结束
 88     if(body001->y==1||body001->y==57||body001->x==1||body001->x==24){
 89         return 1;
 90     }
 91     // 如果没有碰到自身,那么正常执行
 92     while(!(p->x==body001->x&&p->y==body001->y)) {
 93         if(p->next==NULL) {
 94             return 0;
 95         }
 96         p=p->next;
 97     }
 98     // 碰到自身,游戏结束
 99     return 1;
100 }
101 
102 // 创建贪吃蛇的下一个食物
103 void Creat_Food() {
104     // 如果页面上没有食物,则创建
105     if(Food==0) {
106         // 用当前的时间值来作为随机数种子,在随机位置定义
107         srand((int)time(0));
108         // 取随机数定义食物的横轴,后面的数操作是确保生成的食物在游戏框体内
109         Food_x=rand()%21+2;
110         int temp=rand()%52+3;
111         // 定义食物的竖轴
112         if(temp%2==0) {
113             Food_y=temp+1;
114         }
115         else { 
116             Food_y=temp;
117         }
118         Food=1;
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+1)&&body001->y==Food_y) {
128             temp->x=Food_x;temp->y=Food_y;temp->next=body001;body001=temp;Food=0;Score+=5;
129         }
130         else {
131             temp->x=body001->x-1;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+2)) {
141             temp->x=Food_x;temp->y=Food_y;temp->next=body001;body001=temp;Food=0;Score+=5;
142         }
143         else {
144             temp->x=body001->x;temp->y=body001->y-2;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-1)&&body001->y==Food_y) {
154             temp->x=Food_x;temp->y=Food_y;temp->next=body001;body001=temp;Food=0;Score+=5;
155         }
156         else {
157             temp->x=body001->x+1;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-2)) {
167             temp->x=Food_x;temp->y=Food_y;temp->next=body001;body001=temp;Food=0;Score+=5;
168         }
169         else{
170             temp->x=body001->x;temp->y=body001->y+2;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(1) {
182         // 如果游戏失败,返回
183         if(JudgeOver()==1) {
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(550-Grade*50);
210     }
211 }
212 
213 void main() {
214     Position(12,24);
215     cout<<"Plese Select Grade:[1~10]";
216     // 输入蛇的运行速度
217     cin>>Grade;
218     
219     // 限制速度在1~10
220     if(Grade<1||Grade>10) {
221         system("cls");
222         Position(12,35);
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(12,35);
239     // 如果满屏,则输出成功,反之则输出失误
240     if (Score >= 2790) {
241         cout<<"You Win !"<<endl;
242     } else {
243         cout<<"You Lost !"<<endl;
244     }
245     Position(13,31);
246     cout<<"You Got "<<Score<<" Scores"<<endl;
247     Position(24,29);
248     getch();
249 }
原文地址:https://www.cnblogs.com/hustcser/p/3636264.html