亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C語言實現貪吃蛇游戲

2020-05-23 13:34:15
字體:
來源:轉載
供稿:網友

最近整理下電腦,看到了自己在上個學期打的貪吃蛇游戲的c代碼,覺得真的是略微有點冗長,但是實現起來應該也算是比較好理解,于是把自己的代碼搬上來,網絡上寫貪吃蛇的c語言的文章很多,我這篇也僅是給大家作為一個參考而已。

我的代碼是在Windows下運行的,因為需要用到windows.h這個庫。

然后也做了一個簡單的ai模式,這在沒有障礙物的情況下前期還是蠻不錯的,但是到了后期蛇變長了之后就會有bug了。
好了,直接上代碼吧:

1)頭文件和宏定義

#include<stdio.h>#include<stdlib.h>#include<time.h>#include<conio.h>#include<windows.h>#define SNAKE_MAX_LENGTH 20#define SNAKE_HEAD 'H'#define SNAKE_BODY 'X'#define BLANK_CELL ''#define SNAKE_FOOD '$'#define WALL_CELL '*'

2)各種實現函數的聲明

/*snake stepping: dy = -1(up) 1(dowm) 0(no move); dx = -1(left), 1(right), 0(no move)*/void snakemove(int, int); //to write dowm the current location of the snake void put_money(void); void output(void); // to put the current map on the screenvoid initial_the_game(void);void put_accelerate(void);// @ is a special food which can speed up your snake.int judge(int, int); /* when it comes to ai, it is used to judge whether the next step is movable. */int dis(int, int); // when it coomes to ai, it is used to calculate the current distence //between the snake head and the food.void welcome(void);  // the game introduction.void gameover(void); void edition_handed(void); // the edition in which you can play by yourself.void edition_presentation(void); // the edition in which the snake can go automatically.

3)各種全局變量

// define vars for snake,notice name of vars in c int snakeX[SNAKE_MAX_LENGTH] = {1, 2, 3, 4, 5};int snakeY[SNAKE_MAX_LENGTH] = {1, 1, 1, 1, 1};int snakeLength = 5;int gamestate = 1;int current_speed = 600;int score = 0;char edition_choose; // for player to choose the edition.int con = 1; // to judge the initial state of the game;int energy = 0; // write down the condition to accelerate by eating $.//the following part is to realize the simple ai .const char movable[4] = {'a', 'd', 's', 'w'};int distance[4] = {9999, 9999, 9999, 9999};int fx = 6, fy = 6; // the coordinate of the food $

4)地圖

char map[12][12] =  {"************", "*XXXXH  *", "*   *", "*   *", "*   *", "*   *", "*  $ *", "*   *", "* @  *", "*   *", "*   *", "************"};

5)主函數(可選模式)

int main() { while (con) {  welcome();  int flag = 1;  while (flag) {   edition_choose = getch(); //choose the edition   if (edition_choose == 'h') {    edition_handed();    flag = 0;   }   else if (edition_choose == 'p') {    edition_presentation();    flag = 0;   }   else {    printf("Please press the correct bottom -,- .../n");   }  }  gameover(); }  return 0;}

6)手動模式實現

void edition_handed(void) { system("cls"); output(); char ch = 'd'; while (gamestate) {  switch (ch) {   case 'a': // go left    while (1) {     snakemove(-1, 0);     Sleep(current_speed);     if (gamestate == 0) // to break the loop if the snake hit the wall or itself.      break;     if (kbhit() != 0) { // to change the direction      ch = getch();     if (ch == 's' || ch == 'w')      break;     else       ch = 'a';     }    }    break;   case 'd': // go right    while (1) {     snakemove(1, 0);     Sleep(current_speed);     if (gamestate == 0)      break;     if (kbhit() != 0)      ch = getch();     if (ch == 's' || ch == 'w')      break;     else       ch = 'd';    }     break;   case 's': // go down    while (1) {     snakemove(0, 1);     Sleep(current_speed);     if (gamestate == 0)      break;     if (kbhit() != 0)      ch = getch();     if (ch == 'a' || ch == 'd')      break;     else       ch = 's';    }    break;   case 'w': // go up    while (1) {     snakemove(0, -1);     Sleep(current_speed);     if (gamestate == 0)      break;     if (kbhit() != 0)      ch = getch();     if (ch == 'a' || ch == 'd')      break;     else       ch = 'w';    }    break;  }  if (gamestate == 0)   break; }  return;}

7)自動模式實現

void edition_presentation(void) { // for ai system("cls"); int i, min = 10000; output(); char ch; char quit = 'o'; int k; while (gamestate) { // find the shortest way;  min = 10000;  if (judge(-1, 0)) distance[0] = dis(-1, 0);  if (judge(1, 0)) distance[1] = dis(1, 0);  if (judge(0, 1)) distance[2] = dis(0, 1);  if (judge(0, -1)) distance[3] = dis(0, -1);  for (i = 0; i < 4; i++) {   if (min >= distance[i]) {    min = distance[i];    k = i;   }  }  Sleep(current_speed);  switch (movable[k]) {   case 'a': // go left    snakemove(-1, 0);    break;   case 'd': // go right    snakemove(1, 0);    break;   case 's': // go down    snakemove(0, 1);    break;   case 'w': // go up    snakemove(0, -1);    break;   }  if (gamestate == 0)   break;  system("cls");   output(); } return;}

8)其他輔助函數

歡迎界面

void welcome(void) { // just for some introduction printf("WELCOME TO THE SNAKE'S WORLD !!!!/n"); printf("/n"); printf("/n"); printf("Please choose the edition you want./n"); printf("/n"); printf("/n"); printf("The 'h' is for the hand-operated and the 'p' is for the simple presentation/n"); printf("/n"); printf("/n"); printf("Attention: the presentation still has a liitle bug, while it can be moving right for a period of time.../n "); return;}

游戲結束界面

void gameover(void) { // give you some introduction when you lose the game. system("cls"); printf("Game over!!!/n"); printf("Do you want to continue? y or n/n"); char start; // in order to judge whether you still want to play the game. while (1) {  start = getch();  if (start == 'y') {   system("cls");   initial_the_game();   break;  } else if (start == 'n') {   system("cls");   con = 0; // in order to let the game end.   printf("See you next time! ^-^/n");   break;  } else {   printf("Please press the correct buttom./n");  } }}

圖像實現方式

void output(void) { // put the cuttent game map. printf("THE INTERESTING SNAKE GAME CREATED BY LONGJ =,=/n"); printf("use w~s~a~d to control the snake's movement/n"); printf("ATTENTION: the @ can speed up your lovely snake~~/n"); int i, j; for (i = 0; i < 12; i++) {  for (j = 0; j < 12; j++) {    printf("%c", map[i][j]);   if (j == 11)    printf("/n");  } } printf("Your current_speed is %d/n", current_speed); printf("The number of your food undigested is %d (when it comes to 5, your speed will be accelerated!) /n", energy); printf("SCORE = %d/n", score); return;}

蛇的行走實現

void snakemove(int dx, int dy) { // all the conditions are comparing the head and the next position. int i; if (snakeY[snakeLength - 1] + dy == snakeY[snakeLength - 2] && snakeX[snakeLength - 1] + dx == snakeX[snakeLength - 2])  return; // to prevent it go to itslef. if (map[snakeY[snakeLength - 1] + dy][snakeX[snakeLength - 1] + dx] == 'X') {  gamestate = 0;  return; } if (map[snakeY[snakeLength - 1] + dy][snakeX[snakeLength - 1] + dx] == '*') {  gamestate = 0;  return; } if (map[snakeY[snakeLength - 1] + dy][snakeX[snakeLength - 1] + dx] == ' '  || map[snakeY[snakeLength - 1] + dy][snakeX[snakeLength - 1] + dx] == '@') {  map[snakeY[0]][snakeX[0]] = ' '; // clear the former_tail  if (map[snakeY[snakeLength - 1] + dy][snakeX[snakeLength - 1] + dx] == '@'  && current_speed > 100) { // what will happen when your snake eats the @   current_speed -= 100;   put_accelerate();  }  for (i = 0; i < snakeLength - 1; ++i) {   snakeX[i] = snakeX[i + 1];   snakeY[i] = snakeY[i + 1];  }  snakeX[snakeLength - 1] += dx;  snakeY[snakeLength - 1] += dy;  for (i = 0; i < snakeLength - 1; i++) // write down the current snake location   map[snakeY[i]][snakeX[i]] = 'X';  map[snakeY[snakeLength - 1]][snakeX[snakeLength - 1]] = 'H'; } if (map[snakeY[snakeLength - 1] + dy][snakeX[snakeLength - 1] + dx] == '$') {  map[snakeY[snakeLength - 1]][snakeX[snakeLength - 1]] = 'X';  snakeLength++;  snakeX[snakeLength - 1] = snakeX[snakeLength - 2] + dx;  snakeY[snakeLength - 1] = snakeY[snakeLength - 2] + dy;  map[snakeY[snakeLength - 1]][snakeX[snakeLength - 1]] = 'H';  score++;  energy++;  if (energy == 5 && current_speed > 50) {   current_speed -= 50;   energy = 0;  }  put_money(); } system("cls"); output(); return;}

食物放置的實現

 

void put_money(void) { /// ai will change the code int flag = 1; while (flag) {  srand(time(NULL));  fx = rand() % 12;  fy = rand() % 12;  if (map[fy][fx] == ' ') {   map[fy][fx] = '$';   flag = 0;  }  if (edition_choose == 'p') {   int i;   for (i = 0; i< 4; i++)    distance[i] = 9999;  } } return;}void put_accelerate(void) { int x, y, flag = 1; while (flag) {  srand(time(NULL));  x = rand() % 12;  y = rand() % 12;  if (map[x][y] == ' ') {   map[x][y] = '@';   flag = 0;  } } return;}

ai輔助函數

int dis(int dx, int dy) { return abs(fx - snakeX[snakeLength - 1] - dx) + abs(fy - snakeY[snakeLength - 1] - dy);}int judge(int dx, int dy) { if (map[snakeY[snakeLength - 1] + dy][snakeX[snakeLength - 1] + dx] == ' ')  return 1; else if (map[snakeY[snakeLength - 1] + dy][snakeX[snakeLength - 1] + dx] == '$')  return 1; else if (map[snakeY[snakeLength - 1] + dy][snakeX[snakeLength - 1] + dx] == '@')  return 1; else   return 0;}

游戲over后的初始化函數:

void initial_the_game(void) { int i, j, count = 1; snakeLength = 5; gamestate = 1; fx = fy = 6; current_speed = 600; for (i = 0; i < 5; i++)  snakeY[i] = 1; for (i = 0; i < 5; i++) {  snakeX[i] = count++; } for (j = 0; j < 12; j++) {  map[0][j] = '*';  map[11][j] = '*'; } for (i = 1; i < 11; i++) {  map[i][0] = map[i][11] = '*';  for (j = 1; j < 11; j++)   map[i][j] = ' '; } map[fy][fx] ='$'; map[8][4] = '@'; for (i = 0; i< 4; i++) {   distance[i] = 9999; } for (i = 0; i < 4; i++)   map[snakeY[i]][snakeX[i]] = 'X'; map[snakeY[4]][snakeX[4]] = 'H'; return;}

小結:

不難看出,c語言代碼比較冗長,而且初始化的函數實現起來十分麻煩,稍有不慎就會全部出錯,導致游戲無法持續玩下去,博主當初寫的時候就是被坑了很久=_=

因而現在在學c++,希望以后把類的概念之類的東西都弄得更加熟練之后,可以去把這個冗長的c代碼改成更加簡潔,閱讀性更強的c++代碼。

(好的,已經更新了,寫出了一個比較簡單的C++貪吃蛇,的確是思路清晰很多,代碼的可讀性更高。)

這篇博客給那些想要用c來寫貪吃蛇的同學一些參考,運行起來是沒有問題的,可以選擇性看:)

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩av成人在线观看| 亚洲国产成人精品女人久久久| 久久99国产精品自在自在app| 亚洲自拍中文字幕| 亚洲欧美精品中文字幕在线| 亚洲色图第一页| 97精品欧美一区二区三区| 欧美小视频在线| 亚洲天堂av综合网| 国自在线精品视频| 成人h视频在线观看播放| 欧美成人合集magnet| 欧美日韩中文字幕在线| 亚洲成年人影院在线| 日韩国产一区三区| 国产999精品久久久影片官网| 91精品在线国产| 亚洲成av人乱码色午夜| 欧洲精品久久久| 爽爽爽爽爽爽爽成人免费观看| 中文字幕久久久av一区| 日本精品免费一区二区三区| 91成人在线观看国产| 久久综合久久美利坚合众国| 久久久久亚洲精品成人网小说| 日韩精品极品在线观看播放免费视频| 国产日韩在线观看av| 日韩在线观看你懂的| 欧美日韩高清在线观看| 在线国产精品播放| 亚洲欧美日本伦理| 国产一区二区三区在线观看视频| 久久久精品国产网站| 欧美性xxxxxxxxx| 久久综合88中文色鬼| 亚洲午夜未满十八勿入免费观看全集| 国产精品夜间视频香蕉| 欧美www视频在线观看| 91精品免费看| 国产精品毛片a∨一区二区三区|国| 亚洲精品日韩久久久| 欧美日韩成人黄色| 成人性生交大片免费看小说| 尤物yw午夜国产精品视频| 亚洲视频精品在线| 高清欧美性猛交xxxx| 国内精品小视频在线观看| 欧美诱惑福利视频| 66m—66摸成人免费视频| 精品国产一区二区三区久久狼5月| 国产69精品久久久久9999| 亚洲一区二区三区成人在线视频精品| 亚洲美女精品成人在线视频| 97在线视频精品| 在线a欧美视频| 国产视频精品免费播放| 亚洲女性裸体视频| 色妞久久福利网| 久久黄色av网站| 亚洲欧美日韩成人| 国产精品久久久久久av福利| 国模精品一区二区三区色天香| 亚洲女同精品视频| 欧美性受xxxx黑人猛交| 色综合天天综合网国产成人网| 亚洲日本成人女熟在线观看| 久久91亚洲人成电影网站| 欧美中文在线免费| 亚洲激情国产精品| 少妇久久久久久| 欧美精品aaa| 国产成人福利网站| 成人欧美在线观看| 成人国产在线视频| 国产极品精品在线观看| 久久久精品欧美| 久久久久久综合网天天| 日本欧美在线视频| 尤物99国产成人精品视频| 国产在线观看精品一区二区三区| 亚洲国产精彩中文乱码av在线播放| www.日韩.com| 最近中文字幕日韩精品| 欧美怡春院一区二区三区| 97久久精品人人澡人人爽缅北| 欧美日韩高清在线观看| 国产精品igao视频| 精品偷拍一区二区三区在线看| 久久精品视频导航| 国产精品伦子伦免费视频| 欧美日韩在线看| 欧美精品激情blacked18| 日本不卡免费高清视频| 美女国内精品自产拍在线播放| 欧美成人免费小视频| 成人午夜高潮视频| 国产精品户外野外| 色婷婷**av毛片一区| 精品久久久久久久久久国产| 91免费版网站入口| 美女撒尿一区二区三区| 国产精品久久久久久av| 亚洲日韩中文字幕| 国产日韩欧美视频在线| 欧美日韩亚洲精品一区二区三区| 欧美国产日韩一区二区在线观看| 亚洲jizzjizz日本少妇| 日韩精品视频在线观看免费| 欧美一级电影免费在线观看| 日韩精品视频在线免费观看| 午夜精品一区二区三区在线视频| 国产精品三级美女白浆呻吟| 国产精品6699| 成人深夜直播免费观看| 欧美大片在线看免费观看| 国内精品免费午夜毛片| 国产精品国模在线| 欧美老女人性生活| 亚洲一区二区三区在线视频| 国产成人鲁鲁免费视频a| 精品高清美女精品国产区| 欧美激情一二区| 久久成人精品一区二区三区| 国产精品吹潮在线观看| 久久久久久久久91| 中文字幕亚洲综合久久筱田步美| 色综合久久天天综线观看| 国产在线不卡精品| 日韩中文字幕在线视频播放| 欧美一区深夜视频| 亚洲精品日产aⅴ| 日韩在线视频中文字幕| 最近日韩中文字幕中文| 亚洲美女在线看| 国产精品午夜一区二区欲梦| 欧美做爰性生交视频| 国产一区二区三区中文| 在线视频中文亚洲| 日韩有码在线观看| 91精品国产高清自在线看超| 国产精品第一第二| 久久影视三级福利片| 欧美亚洲国产日韩2020| 97婷婷涩涩精品一区| 久久久久久久久久av| 国产在线精品一区免费香蕉| 久久久久久国产精品三级玉女聊斋| 久久精品99久久久香蕉| 欧美高清电影在线看| 日本久久中文字幕| 亚洲欧洲日韩国产| 欧美一级大片视频| 日日狠狠久久偷偷四色综合免费| 97在线视频免费| 高清日韩电视剧大全免费播放在线观看| 久久久在线视频| 日韩在线欧美在线国产在线| 国产日韩在线观看av| 欧美激情一二三| 亚洲成人av资源网| 久久青草精品视频免费观看| 国产一区在线播放| 亚洲一区第一页| www.99久久热国产日韩欧美.com|