C程序设计 贪吃蛇分析(3)
显示模仿别人,然后是自己做了点修改,包括游戏结束和界面上。。
这个终于写出来了。
早上的时间没有白费。
1 //Lee. 控制台 贪吃蛇 2 //测试版本 3 4 5 #include<stdio.h> 6 #include<windows.h> 7 #include<conio.h> 8 #include<time.h> 9 #include<stdlib.h> 10 11 #define UP 72 //定义上下左右常量 12 #define DOWN 80 13 #define LEFT 75 14 #define RIGHT 77 15 16 int X, Y;//食物坐标 17 18 int Map[79][24]={{0}}; // 地图尺寸,其实有食物记为1 19 int over=0; //用来标记游戏结束 20 21 struct Snake 22 { 23 int x, y; //坐标 24 int direction; //方向 25 }Snake[100]; //蛇最多100个节点 26 27 int length = 3; //初始化蛇的长度为3 28 29 void GamePrint(); //游戏开始画面函数 30 void Gameinit(); //游戏初始化函数 31 void Sweep_Screem(); //清屏函数 32 void Gotoxy(int , int); //光标移动函数 33 void Hid_Cursor(); //光标隐藏函数 34 void Snake_Move(); //蛇运动函数 35 void Create_Food(); //食物产生函数 36 void Pwall(); //画墙函数 37 void Key(); //键盘操作函数 38 void Hit_Wall(); //判断是否撞墙 39 void Eat_Itself(); //判断是否咬到自己 40 void Whether_Eat(); //判断蛇是否吃到食物 41 void GameRun(); //游戏运行函数 42 43 int main() 44 { 45 Hid_Cursor(); 46 GamePrint(); 47 Gameinit(); //游戏初始化函数 48 GameRun(); 49 50 return 0; 51 } 52 53 54 55 56 void GamePrint() //游戏开始画面函数 57 { 58 Gotoxy(30,9); 59 printf("Welcome to RedSnake."); 60 Gotoxy(36,12); 61 printf("by_Lee."); 62 Sleep(2000); 63 Sweep_Screem(); 64 Gotoxy(30, 11); 65 printf("方向键 ↑ 向上"); 66 Gotoxy(30, 12); 67 printf("方向键 ↓ 向下"); 68 Gotoxy(30, 13); 69 printf("方向键 ← 向左"); 70 Gotoxy(30, 14); 71 printf("方向键 → 向右"); 72 Gotoxy(30, 15); 73 printf("按 ESC 键 退出游戏"); 74 Sleep(2000); 75 Sweep_Screem(); 76 Pwall(); //画墙函数 77 Sleep(1300); 78 } 79 80 81 void Gameinit() 82 { 83 Snake[0].x = 10; 84 Snake[0].y = 12; 85 Snake[1].x = 8; 86 Snake[1].y = 12; 87 Snake[2].x = 6; 88 Snake[2].y = 12; 89 Snake[0].direction = RIGHT; 90 Gotoxy(10, 12); 91 printf("□"); 92 Gotoxy(8, 12); 93 printf("■"); 94 Gotoxy(6, 12); 95 printf("■"); 96 } 97 98 99 void Sweep_Screem()//清屏函数 100 { 101 int i; 102 Gotoxy(0, 0); 103 for(i = 0;i < 25; i++) 104 { 105 printf(" "); 106 } 107 } 108 109 void Gotoxy(int x, int y)//移动光标 110 { 111 COORD coord; 112 coord.X=x; 113 coord.Y=y; 114 SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), coord ); 115 } 116 117 void Hid_Cursor() //光标隐藏函数 118 { 119 HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); 120 CONSOLE_CURSOR_INFO cci; 121 GetConsoleCursorInfo(hOut,&cci); 122 cci.bVisible=0;//赋1为显示,赋0为隐藏 123 SetConsoleCursorInfo(hOut,&cci); 124 } 125 126 void Snake_Move() //蛇运动函数 127 { 128 int i; 129 Gotoxy(Snake[0].x, Snake[0].y); 130 printf("□"); 131 Gotoxy(Snake[1].x, Snake[1].y); 132 printf("■"); 133 Gotoxy(Snake[length].x, Snake[length].y); 134 printf(" "); 135 Whether_Eat(); //判断蛇是否吃到食物 136 Eat_Itself(); //判断蛇是否咬到自己 137 for(i = length; i > 0; i--) //移动蛇的坐标 138 Snake[i] = Snake[i-1]; 139 Key(); //判断用户的键盘输入 140 switch(Snake[0].direction) 141 { 142 case 72: Snake[0].y-=1; break; 143 case 80: Snake[0].y+=1; break; 144 case 75: Snake[0].x-=2; break; 145 case 77: Snake[0].x+=2; break; 146 } 147 } 148 149 150 void Create_Food() //食物产生函数 151 { 152 int i; 153 if(Map[X][Y] == 0) 154 { 155 srand((unsigned int)time(0) + X); 156 X = (rand() % 38 + 1) * 2; 157 srand((unsigned int)time(0) + Y + rand()); 158 Y = rand() % 23 + 1; 159 for(i = 0; i < length; i++) 160 if(Snake[i].x == X && Snake[i].y == Y) 161 { 162 i = -1; 163 break; 164 } 165 if(i != -1) 166 { 167 Map[X][Y] = 1; 168 Gotoxy(X, Y); 169 printf("■"); 170 } 171 } 172 } 173 174 void Whether_Eat() //判断蛇是否吃到食物 175 { 176 if(Map[Snake[0].x][Snake[0].y] == 1) 177 { 178 length++; 179 Map[Snake[0].x][Snake[0].y] = 0; 180 } 181 } 182 183 void Eat_Itself() //判断蛇是否咬到自己 184 { 185 int i; 186 for(i = 3; i < length; i++) 187 { 188 if(Snake[0].x == Snake[i].x && Snake[0].y == Snake[i].y) 189 { 190 over=1; 191 break; 192 } 193 } 194 } 195 196 197 void Hit_Wall() //判断是否撞墙 198 { 199 if(Snake[0].x == 0) Snake[0].x = 76; 200 if(Snake[0].x == 78) Snake[0].x = 2; 201 if(Snake[0].y == 0) Snake[0].y = 23; 202 if(Snake[0].y == 24) Snake[0].y = 1; 203 } 204 205 206 void Key()//用户是否操作键盘 207 { 208 if(_kbhit())//判断是否按键 209 { 210 int ch = _getch(); 211 if(ch == 224)//判断按的是不是方向键 212 { 213 ch = _getch(); 214 if(ch+Snake[0].direction != 152)//判断按键是否是反方向 215 Snake[0].direction = ch;//如果不是就改变蛇头方向 216 } 217 else if(ch == 27)//判断用户是否退出 218 { 219 exit(0); 220 } 221 } 222 } 223 224 void Pwall()//画墙函数 225 { 226 int i, j; 227 for(i = 39,j = 0; j < 39; i--, j++) 228 { 229 Gotoxy(j*2, 0); 230 printf("■"); 231 if(j < 24) 232 { 233 Gotoxy(78, j); 234 printf("■"); 235 } 236 Gotoxy(i*2, 24); 237 printf("■"); 238 if(i > 15) 239 { 240 Gotoxy(0, i-15); 241 printf("■"); 242 } 243 Sleep(50); 244 } 245 Gotoxy(52,24); 246 printf("RedSnake v1.0 by_Lee"); 247 } 248 249 void GameRun() //游戏运行函数 250 { 251 while(1) 252 { 253 Snake_Move(); //控制蛇的运动 254 Hit_Wall(); //判断是否撞墙 255 Create_Food(); //随机产生食物 256 257 if(length == 99) 258 { 259 Sweep_Screem(); 260 Gotoxy(28, 12); 261 printf("You Win."); 262 Sleep(2000); 263 break; 264 } 265 if(over) 266 { 267 Sweep_Screem(); 268 Gotoxy(28, 12); 269 printf("Game Over."); 270 } 271 Sleep(80); 272 } 273 }
测试结果如下