项目名称:贪吃蛇
文件:main.c
实现平台和语言:VC++6.0和C语言
说明:简单的字符小游戏,是学习c语言初期为了好玩写的,可以给初学C者参考。
1 #include <stdio.h> 2 #include <windows.h> 3 #include <conio.h> 4 #include <dos.h> 5 6 #define S_FRIST_X 20 7 #define S_FRIST_Y 10 8 9 #define UP 11 10 #define DOWN 12 11 #define LEFT 13 12 #define RIGHT 14 13 14 #define START 22 15 #define OVER 33 16 17 //封装vc++6.0中光标移动函数 18 int mygotoxy(int x, int y) 19 { 20 COORD coord = {x, y}; 21 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); 22 23 return 0; 24 } 25 26 //打印蛇的身体 27 int s_print(int s_arr[][2], int s_len) 28 { 29 int i = 0; 30 for (i = 0; i < s_len; i++) 31 { 32 mygotoxy(s_arr[i][0], s_arr[i][1]); 33 printf("*"); 34 } 35 } 36 37 //清空蛇的身体 38 int s_print_clean(int s_arr[][2], int s_len) 39 { 40 int i = 0; 41 for (i = 0; i < s_len; i++) 42 { 43 mygotoxy(s_arr[i][0], s_arr[i][1]); 44 printf(" "); 45 } 46 } 47 48 //打印食物 49 int t_print(int x, int y) 50 { 51 mygotoxy(x, y); 52 printf("*"); 53 } 54 55 //清空食物 56 int t_print_clean(int x, int y) 57 { 58 mygotoxy(x, y); 59 printf(" "); 60 } 61 62 int main (void) 63 { 64 int i = 0; 65 char key = 0; 66 int speed = 0; 67 int s_len = 0; 68 int s_direction = 0; 69 70 int t_x = 0; 71 int t_y = 0; 72 int t_rand = 0; 73 int score = 0; 74 int levels = 0; 75 76 int game = OVER; 77 78 int s_arr[100][2] = {{0, 0}}; 79 80 //打印游戏界面为宽度1-59,高度1-22 81 for (i = 1; i <= 60; i += 2) 82 { 83 mygotoxy(i, 0); 84 printf("-"); 85 } 86 for (i = 1; i <= 60; i += 2) 87 { 88 mygotoxy(i, 23); 89 printf("-"); 90 } 91 for (i = 1; i <= 22; i++) 92 { 93 mygotoxy(0, i); 94 printf("|"); 95 } 96 for (i = 1; i <= 22; i++) 97 { 98 mygotoxy(60, i); 99 printf("|"); 100 } 101 102 //打印欢迎信息 103 mygotoxy(63, 2); 104 printf("欢迎来到贪吃蛇。"); 105 mygotoxy(66, 4); 106 printf("w键为上"); 107 mygotoxy(66, 5); 108 printf("s键为下"); 109 mygotoxy(66, 6); 110 printf("a键为左"); 111 mygotoxy(66, 7); 112 printf("d键为右"); 113 mygotoxy(63, 20); 114 printf("按回车开始游戏。"); 115 116 while (1) 117 { 118 _start: 119 //判定关卡 120 if(20 == score && 1 == levels) 121 { 122 mygotoxy(30, 12); 123 printf("下一关"); 124 Sleep(1000); 125 mygotoxy(30, 12); 126 printf(" "); 127 speed = 250; 128 levels = 2; 129 } 130 else if(30 == score && 2 == levels) 131 { 132 mygotoxy(30, 12); 133 printf("下一关"); 134 Sleep(1000); 135 mygotoxy(30, 12); 136 printf(" "); 137 speed = 125; 138 levels = 3; 139 } 140 else if(40 == score && 3 == levels) 141 { 142 mygotoxy(30, 12); 143 printf("下一关"); 144 Sleep(1000); 145 mygotoxy(30, 12); 146 printf(" "); 147 speed = 60; 148 levels = 4; 149 } 150 else if(50 == score && 4 == levels) 151 { 152 mygotoxy(30, 12); 153 printf("下一关"); 154 Sleep(1000); 155 mygotoxy(30, 12); 156 printf(" "); 157 speed = 30; 158 levels = 5; 159 } 160 161 if(OVER == game) 162 { 163 //打印游戏信息 164 mygotoxy(68, 21); 165 printf("结束"); 166 167 //输入回车开始游戏 168 while(1) 169 { 170 key = _getch(); 171 fflush(stdin); 172 173 if(13 == key) 174 { 175 key = 0; 176 break; 177 } 178 } 179 180 //初始化移动速度和蛇的长度 181 speed = 500; 182 s_len = 3; 183 184 //初始化关卡 185 levels = 1; 186 187 //初始化食物坐标 188 if((t_rand = rand() % 60) != 0) 189 { 190 t_x = t_rand; 191 } 192 193 if((t_rand = rand() % 23) != 0) 194 { 195 t_y = t_rand; 196 } 197 198 //初始化蛇的身体 199 for (i = 0; i < s_len; i++) 200 { 201 s_arr[i][0] = 20 + i; 202 s_arr[i][1] = 10; 203 } 204 205 //初始化方向 206 s_direction = RIGHT; 207 208 game = START; 209 210 //打印游戏信息 211 mygotoxy(68, 21); 212 printf("进行"); 213 } 214 215 //刷新得分 216 mygotoxy(66, 13); 217 printf("得分: %d分", score); 218 219 //刷新关卡 220 mygotoxy(65, 11); 221 printf("关卡: 第%d关", levels); 222 223 //判断方向 224 switch (s_direction) 225 { 226 case UP: 227 { 228 //判断是否到上边界面 229 if(0 == s_arr[s_len - 1][1] - 1) 230 { 231 game = OVER; 232 score = 0; 233 mygotoxy(30, 12); 234 printf("Game Over!"); 235 Sleep(1000); 236 mygotoxy(30, 12); 237 printf(" "); 238 continue; 239 } 240 241 //判断是否要撞上自己的身体 242 for (i = 0; i < s_len; i++) 243 { 244 if(s_arr[i][0] == s_arr[s_len - 1][0] && s_arr[i][1] == s_arr[s_len - 1][1] - 1) 245 { 246 game = OVER; 247 score = 0; 248 mygotoxy(30, 12); 249 printf("Game Over!"); 250 Sleep(1000); 251 mygotoxy(30, 12); 252 printf(" "); 253 goto _start; 254 } 255 } 256 257 //判断是否吃到食物 258 if (t_x == s_arr[s_len - 1][0] && t_y == s_arr[s_len - 1][1] - 1) 259 { 260 s_len++; 261 s_arr[s_len - 1][0] = t_x; 262 s_arr[s_len - 1][1] = t_y; 263 264 //分数加十分 265 score += 10; 266 267 //刷新食物坐标 268 if((t_rand = rand() % 60) != 0) 269 { 270 t_x = t_rand; 271 } 272 if((t_rand = rand() % 23) != 0) 273 { 274 t_y = t_rand; 275 } 276 break; 277 } 278 else 279 { 280 //坐标上移 281 for (i = 0; i < s_len; i++) 282 { 283 if(s_len - 1 == i) 284 { 285 s_arr[i][1]--; 286 } 287 else 288 { 289 s_arr[i][0] = s_arr[i + 1][0]; 290 s_arr[i][1] = s_arr[i + 1][1]; 291 } 292 } 293 break; 294 } 295 } 296 case DOWN: 297 { 298 //判断是否到下边界面 299 if(23 == s_arr[s_len - 1][1] + 1) 300 { 301 game = OVER; 302 score = 0; 303 mygotoxy(30, 12); 304 printf("Game Over!"); 305 Sleep(1000); 306 mygotoxy(30, 12); 307 printf(" "); 308 continue; 309 } 310 311 //判断是否要撞上自己的身体 312 for (i = 0; i < s_len; i++) 313 { 314 if(s_arr[i][0] == s_arr[s_len - 1][0] && s_arr[i][1] == s_arr[s_len - 1][1] + 1) 315 { 316 game = OVER; 317 score = 0; 318 mygotoxy(30, 12); 319 printf("Game Over!"); 320 Sleep(1000); 321 mygotoxy(30, 12); 322 printf(" "); 323 goto _start; 324 } 325 } 326 327 //判断是否吃到食物 328 if (t_x == s_arr[s_len - 1][0] && t_y == s_arr[s_len - 1][1] + 1) 329 { 330 s_len++; 331 s_arr[s_len - 1][0] = t_x; 332 s_arr[s_len - 1][1] = t_y; 333 334 //分数加十分 335 score += 10; 336 337 //刷新食物坐标 338 if((t_rand = rand() % 60) != 0) 339 { 340 t_x = t_rand; 341 } 342 if((t_rand = rand() % 23) != 0) 343 { 344 t_y = t_rand; 345 } 346 break; 347 } 348 else 349 { 350 //坐标下移 351 for (i = 0; i < s_len; i++) 352 { 353 if(s_len - 1 == i) 354 { 355 s_arr[i][1]++; 356 } 357 else 358 { 359 s_arr[i][0] = s_arr[i + 1][0]; 360 s_arr[i][1] = s_arr[i + 1][1]; 361 } 362 } 363 break; 364 } 365 } 366 case LEFT: 367 { 368 //判断是否到左边界面 369 if(0 == s_arr[s_len - 1][0] - 1) 370 { 371 game = OVER; 372 score = 0; 373 mygotoxy(30, 12); 374 printf("Game Over!"); 375 Sleep(1000); 376 mygotoxy(30, 12); 377 printf(" "); 378 continue; 379 } 380 381 //判断是否要撞上自己的身体 382 for (i = 0; i < s_len; i++) 383 { 384 if(s_arr[i][0] == s_arr[s_len - 1][0] - 1 && s_arr[i][1] == s_arr[s_len - 1][1]) 385 { 386 game = OVER; 387 score = 0; 388 mygotoxy(30, 12); 389 printf("Game Over!"); 390 Sleep(1000); 391 mygotoxy(30, 12); 392 printf(" "); 393 goto _start; 394 } 395 } 396 397 //判断是否吃到食物 398 if (t_x == s_arr[s_len - 1][0] - 1 && t_y == s_arr[s_len - 1][1]) 399 { 400 s_len++; 401 s_arr[s_len - 1][0] = t_x; 402 s_arr[s_len - 1][1] = t_y; 403 404 //分数加十分 405 score += 10; 406 407 //刷新食物坐标 408 if((t_rand = rand() % 60) != 0) 409 { 410 t_x = t_rand; 411 } 412 if((t_rand = rand() % 23) != 0) 413 { 414 t_y = t_rand; 415 } 416 break; 417 } 418 else 419 { 420 //坐标左移 421 for (i = 0; i < s_len; i++) 422 { 423 if(s_len - 1 == i) 424 { 425 s_arr[i][0]--; 426 } 427 else 428 { 429 s_arr[i][0] = s_arr[i + 1][0]; 430 s_arr[i][1] = s_arr[i + 1][1]; 431 } 432 } 433 break; 434 } 435 } 436 case RIGHT: 437 { 438 //判断是否到左边界面 439 if(60 == s_arr[s_len - 1][0] + 1) 440 { 441 game = OVER; 442 score = 0; 443 mygotoxy(30, 12); 444 printf("Game Over!"); 445 Sleep(1000); 446 mygotoxy(30, 12); 447 printf(" "); 448 continue; 449 } 450 451 //判断是否要撞上自己的身体 452 for (i = 0; i < s_len; i++) 453 { 454 if(s_arr[i][0] == s_arr[s_len - 1][0] + 1 && s_arr[i][1] == s_arr[s_len - 1][1]) 455 { 456 game = OVER; 457 score = 0; 458 mygotoxy(30, 12); 459 printf("Game Over!"); 460 Sleep(1000); 461 mygotoxy(30, 12); 462 printf(" "); 463 goto _start; 464 } 465 } 466 467 //判断是否吃到食物 468 if (t_x == s_arr[s_len - 1][0] + 1 && t_y == s_arr[s_len - 1][1]) 469 { 470 s_len++; 471 s_arr[s_len - 1][0] = t_x; 472 s_arr[s_len - 1][1] = t_y; 473 474 //分数加十分 475 score += 10; 476 477 //刷新食物坐标 478 if((t_rand = rand() % 60) != 0) 479 { 480 t_x = t_rand; 481 } 482 if((t_rand = rand() % 23) != 0) 483 { 484 t_y = t_rand; 485 } 486 break; 487 } 488 else 489 { 490 //坐标右移 491 for (i = 0; i < s_len; i++) 492 { 493 if(s_len - 1 == i) 494 { 495 s_arr[i][0]++; 496 } 497 else 498 { 499 s_arr[i][0] = s_arr[i + 1][0]; 500 s_arr[i][1] = s_arr[i + 1][1]; 501 } 502 } 503 break; 504 } 505 } 506 } 507 508 //打印蛇的身体 509 s_print(s_arr, s_len); 510 511 //打印食物 512 t_print(t_x, t_y); 513 514 while (kbhit()) 515 { 516 //输入一个字符 517 key = _getch(); 518 fflush(stdin); 519 520 //按键输入 521 switch (key) 522 { 523 case \'w\': 524 if(DOWN == s_direction) 525 break; 526 else 527 { 528 s_direction = UP; 529 break; 530 } 531 case \'s\': 532 if(UP == s_direction) 533 break; 534 else 535 { 536 s_direction = DOWN; 537 break; 538 } 539 case \'a\': 540 if(RIGHT == s_direction) 541 break; 542 else 543 { 544 s_direction = LEFT; 545 break; 546 } 547 case \'d\': 548 if(LEFT == s_direction) 549 break; 550 else 551 { 552 s_direction = RIGHT; 553 break; 554 } 555 } 556 } 557 558 //延时函数 559 Sleep(speed); 560 561 //清空蛇的身体 562 s_print_clean(s_arr, s_len); 563 564 //清空食物 565 t_print_clean(t_x, t_y); 566 } 567 568 return 0; 569 }