在网上看到一段贪吃蛇程序,自己心痒下了下来又稍微做了一点修改。
没有用面向对象的方式来进行封装,下次准备试试。
需要在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 }