亚洲精品中文字幕无乱码_久久亚洲精品无码AV大片_最新国产免费Av网址_国产精品3级片

C語言

用C語言如何實現(xiàn)貪吃蛇編程

時間:2024-08-06 09:53:19 C語言 我要投稿
  • 相關(guān)推薦

用C語言如何實現(xiàn)貪吃蛇編程

  貪吃蛇游戲在理論上是可以無限的進行下去的(除了撞墻和咬到自己),那么游戲主體就一定是個循環(huán)。下面是小編為大家?guī)淼年P(guān)于用C語言如何實現(xiàn)貪吃蛇編程的知識,歡迎閱讀。

  貪吃蛇實現(xiàn)原理:

  貪吃蛇游戲在理論上是可以無限的進行下去的(除了撞墻和咬到自己),那么游戲主體就一定是個循環(huán)。

  蛇是如何動起來的?在這里就是通過不斷改變蛇的坐標,然后根據(jù)蛇的坐標不斷刷新屏幕在視覺上形成蛇的移動效果。

  食物出現(xiàn)在隨機位置(當然不能出現(xiàn)在障礙物和蛇身上)。

  蛇能吃到食物其實就是蛇頭的坐標與食物的坐標重合時。

  當蛇咬到自己或者撞到墻的時候游戲結(jié)束(坐標判斷)

  #include

  #include

  #include

  #include

  #include

  //72,80,75,77是方向鍵對應(yīng)的鍵值

  #define UP 72

  #define DOWN 80

  #define LEFT 75

  #define RIGHT 77

  #define SNAKE 1 //蛇的.坐標標識

  #define FOOD 2 //食物的坐標標識

  #define BAR 3 //墻的坐標標識

  //初始化地圖 17*17

  char map[17][17] = {0};

  //初始化蛇頭坐標

  unsigned char snake[50] = {77};

  //初始化食物坐標

  unsigned char food = 68;

  //蛇長

  char len = 1;

  //存儲坐標數(shù)字與x、y的轉(zhuǎn)換函數(shù)

  void tran(unsigned char num,unsigned char * x,unsigned char * y);

  //打印游戲

  void print_game(void);

  //獲取方向函數(shù)(注意當蛇身長度超過一節(jié)時不能回頭)

  int get_dir(int old_dir);

  //移動蛇身函數(shù)(游戲大部分內(nèi)容在其中)

  void move_snake(int dir);

  //生產(chǎn)食物的函數(shù)

  unsigned char generate_food(void);

  //判斷蛇死活的函數(shù)(判斷了蛇是否撞到邊界或者自食)

  int isalive(void);

  int main(void){

  int dir = UP; //初始方向默認向上,UP是我們定義的宏

  //按道理該游戲是可以無限繼續(xù)下去的,因此是個循環(huán)

  while(1){

  print_game(); //打印游戲

  dir = get_dir(dir); //獲取方向(我們摁下的方向)

  move_snake(dir); //移動蛇身

  if(!isalive()){ //判斷蛇的生命狀態(tài)

  break;

  }

  }

  printf("Game Over! ");

  return 0;

  }

  //

  void tran(unsigned char num,unsigned char * x,unsigned char * y){

  *x = num >> 4;

  *y = (unsigned char)(num << 4) >> 4; //注意這里要做個強制類型轉(zhuǎn)換

  //根據(jù)匯編,如果不做強制轉(zhuǎn)換,y的值與num的值相同

  }

  void print_game(void){

  int i,j;

  //根據(jù)地圖上每點的情況繪制游戲( i 表示 x 軸,j 表示 y 軸),按行打印,j表示行,i表示列

  for(j = 0;j < 17;j ++){

  for(i = 0;i < 17;i ++){

  //空白地方

  if(map[i][j] == 0){

  put' ');

  }

  //蛇身

  else if(map[i][j] == SNAKE){

  put'*');

  }

  //圍欄

  else if(map[i][j] == BAR){

  put'#');

  }

  //食物

  else if(map[i][j] == FOOD){

  put'$');

  }

  }

  put' ');

  }

  Sleep(500); //休眠函數(shù) 將進程掛起500ms,包含在window.h(在linux下用 sleep(),#include )

  system("cls"); //清屏函數(shù) 配合下一次 print_game() 起到刷新作用,包含在stdlib.h中

  }

  int get_dir(int old_dir){

  int new_dir = old_dir;

  //用kbhit()與getch()組合實現(xiàn)鍵盤響應(yīng)

  //kbhit() 檢查當前是否有鍵盤輸入,若有則返回一個非0值,否則返回0

  //getch() 用ch=_getch();會等待你按下任意鍵之后,把該鍵字符所對應(yīng)的ASCII碼賦給ch,再執(zhí)行下面的語句。

  if(_kbhit()){

  _getch(); //第一次輸出的方向鍵的擴展值,第二次是方向鍵的實際值,只有方向鍵上下左右這樣

  new_dir = _getch(); //getch()函數(shù)要使用兩次,原因是因為第一次返回的值指示該鍵擴展的字符,第二次調(diào)用才返回實際的鍵代碼

  //如果蛇身長度大于1,則不能回頭,如果摁回頭方向,則按原來方向走

  //abs(new_dir - old_dir) == 2 表示 |LEFT-RIGHT|

  //abs(new_dir - old_dir) == 8 表示 |UP-DOWN|

  if(len > 1 && (abs(new_dir - old_dir) == 2 || abs(new_dir - old_dir) == 8)){

  new_dir = old_dir;

  }

  }

  return new_dir;

  }

  void move_snake(int dir){

  int last = snake[0],current; //last與current用于之后蛇坐標的更新

  int i,j;

  int grow=0; //判斷是否要長身體

  unsigned char x, y,fx,fy; //蛇坐標與食物坐標

  tran(food, &fx, &fy); //食物坐標

  tran(snake[0], &x, &y); //蛇頭坐標

  switch (dir){ //更新蛇頭坐標(坐標原點是左上角)

  case UP:

  y--;

  break;

  case DOWN:

  y++;

  break;

  case LEFT:

  x--;

  break;

  case RIGHT:

  x++;

  break;

  }

  //按位抑或(妙!)

  //http://www.bianceng.cn

  snake[0] = ((x ^ 0) << 4) ^ y; //將x,y換回一個數(shù)

  //x與0抑或保留原值

  //將x與y重新合成一個值

  //蛇吃到了食物

  if (snake[0] == food) {

  grow = 1;

  food = generate_food(); //產(chǎn)生新食物

  }

  for (i = 0; i

  if (i == 0) //如果只有頭,跳過,因為前面已更新蛇頭坐標

  continue;

  current = snake[i]; //將當前操作的蛇節(jié)坐標存儲到current里

  snake[i] = last; //完成當前操作蛇節(jié)坐標的更新

  last = current; //last記錄的是上一次操作蛇節(jié)的坐標,這次操作已經(jīng)結(jié)束,故把current賦給last

  }

  //如果蛇邊長了

  if (grow) {

  snake[len] = last;

  len++;

  }

  for (j = 0; j < 17; j ++){ //將邊界與食物加到地圖里去(i,j 對應(yīng) x軸和y軸)

  for (i = 0; i < 17; i ++){

  if (i == 0 || i == 16 || j == 0 || j == 16){

  map[i][j] = BAR;

  }

  else if (i == fx&&j == fy){

  map[i][j] = FOOD;

  }

  else{

  map[i][j] = 0;

  }

  }

  for (i = 0; i < len; i++) { //將蛇加到地圖里去

  tran(snake[i], &x, &y);

  if (snake[i] > 0){

  map[x][y] = SNAKE;

  }

  }

  }

  }

  unsigned char generate_food(void)

  {

  unsigned char food_,fx,fy;

  int in_snake=0,i;

  //以當前時間為參數(shù)提供種子供rand()函數(shù)生成更為隨機的數(shù)

  srand((unsigned int)time(NULL));

  //循環(huán)產(chǎn)生在邊界內(nèi)且不在蛇身上的食物

  do {

  food_ = rand() % 255;//產(chǎn)生一個0--255的隨機數(shù)

  tran(food_, &fx, &fy);

  for (i = 0; i < len; i++){

  if (food_ == snake[i]){

  //在不在蛇身上

  in_snake = 1;

  }

  }

  } while (fx == 0 || fx == 16 || fy == 0 || fy == 16 || in_snake);

  return food_;

  }

  int isalive(void)

  {

  int self_eat = 0;

  int i;

  unsigned char x, y;

  tran(snake[0], &x, &y);

  for (i = 1; i < len; i++){

  if (snake[0] == snake[i]){

  self_eat = 1;

  }

  }

  //蛇頭撞邊界或者吃到自己 ,則死掉

  return (x == 0 || x == 16 || y == 0 || y >= 16 || self_eat) ? 0 : 1;

  }


【用C語言如何實現(xiàn)貪吃蛇編程】相關(guān)文章:

如何學習C語言編程10-28

鏈表的C語言實現(xiàn)方法編程學習06-12

如何實現(xiàn)C語言畫圖教程08-08

C語言如何實現(xiàn)畫圖教程08-19

C語言編程基礎(chǔ)08-17

C編程語言概述10-20

C語言程序的實現(xiàn)09-27

怎樣學習c++c語言編程10-26

C語言入門什么是編程語言10-12

C語言socket編程的方法10-07