簡易貪吃蛇c語言代碼,貪吃蛇程序代碼c語言

本文目錄一覽:

貪吃蛇c語言代碼

#includestdio.h

#includestdlib.h

#includeWindows.h

#includeconio.h

#includetime.h

char gamemap[20][40];//遊戲地圖大小 20*40

int score=0;//當前分數

//記錄蛇的結點

int x[800];//每個結點的行編號

int y[800];//每個結點的列編號

int len = 0;//蛇的長度

//記錄水果信息

int fx=0;//食物的橫坐標

int fy=0;//食物的縱坐標

int fcount=0;//食物的數目

//主要函數操作

void createfood();//生成食物

void PrintgameMap(int x[],int y[]);//畫遊戲地圖

void move(int x[],int y[]);//移動蛇

int main()

{

srand(time(NULL));

//初始化蛇頭和身體的位置,默認剛開始蛇長為2

x[len] = 9;

y[len] = 9;

len++;

x[len] = 9;

y[len] = 8;

len++;

createfood();

PrintgameMap(x,y);

move(x,y);

return 0;

}

void createfood()

{

if(0==fcount)

{

int tfx=rand()%18+1;

int tfy=rand()%38+1;

int i,j;

int have=0;//為0表示食物不是食物的一部分

for(i=0;ilen;i++)

{

for(j=0;jlen;j++)

{

if(x[i]==fxy[j]==fy)

{

have=1;

break;

}

else

{

have=0;

}

}

if(1==have)//若為蛇的一部分,執行下一次循環

{

continue;

}

else//否則生成新的水果

{

fcount++;

fx=tfx;

fy=tfy;

break;

}

}

}

}

//遊戲地圖

void PrintgameMap(int x[],int y[])

{

int snake = 0,food=0;

int i, j;

//畫遊戲地圖,並畫出蛇的初始位置

for (i = 0; i 20; i++)

{

for (j = 0; j 40; j++)

{

if (i == 0 j = 1 j = 38)

{

gamemap[i][j] = ‘=’;

}

else if (i == 19 j = 1 j = 38)

{

gamemap[i][j] = ‘=’;

}

else if (j == 0 || j == 39)

{

gamemap[i][j] = ‘#’;

}

else

{

gamemap[i][j] = ‘ ‘;

}

//判斷蛇是否在當前位置

int k;

for ( k = 0; k len; k++)

{

if (i == x[k]j == y[k])

{

snake = 1;

break;

}

else

{

snake = 0;

}

}

{

if(fcountfx==ify==j)

{

food=1;

}

else

{

food=0;

}

}

//若蛇在當前位置

if (1==snake )

{

printf(“*”);

}

else if(1==food)

{

printf(“f”);

}

//若蛇不在當前位置並且當前位置沒有水果

else

{

printf(“%c”, gamemap[i][j]);

}

}

printf(“\n”);

}

printf(“score:%d”,score);

}

//移動

void move(int x[],int y[])

{

char s;

s=getch();

int move=0,beat=0;

while (1)

{

int cx[800];

int cy[800];

memcpy(cx, x, sizeof(int)*len);

memcpy(cy, y, sizeof(int)*len);

//頭

if (s==’w’)

{

x[0]–;

move=1;

if(x[0]=0)

{

printf(“Game over\n”);

break;

}

}

else if (s==’s’)

{

x[0]++;

move=1;

if(x[0]=19)

{

printf(“Game over\n”);

break;

}

}

else if (s==’a’)

{

y[0] –;

move=1;

if(y[0]=0)

{

printf(“Game over\n”);

break;

}

}

else if (s==’d’)

{

y[0]++;

move=1;

if(y[0]=39)

{

printf(“Game over\n”);

break;

}

}

//身體

int i;

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

{

x[i] = cx[i – 1];

y[i] = cy[i – 1];

}

for(i=1;ilen;i++)//要是咬到了自己

{

if(x[0]==x[i]y[0]==y[i])

{

beat=1;

}

else

{

beat=0;

}

}

if(1==beat)

{

printf(“Game over\n”);

break;

}

if(1==move)

{

if(fcountx[0]==fxy[0]==fy)//如果吃到了果子

{

//拷貝當前蛇頭地址到第二個結點

memcpy(x+1,cx,sizeof(int)*len);

memcpy(y+1,cy,sizeof(int)*len);

len++;

fcount–;

fx=0;

fy=0;

score++;

createfood();

}

Sleep(70);

system(“cls”);

PrintgameMap( x, y);

}

else

continue;

if(kbhit())//判斷是否按下按鍵

{

s=getch();

}

}

}

C語言的貪吃蛇源代碼

 

//******友情提示:如想速度快點,請改小_sleep(500)函數中參數*****  

#include stdio.h  

#include stdlib.h  

#include conio.h  

#include string.h  

#include time.h  

const int H = 8;   //地圖的高  

const int L = 16;  //地圖的長  

char GameMap[H][L];   //遊戲地圖  

int  key;  //按鍵保存  

int  sum = 1, over = 0;  //蛇的長度, 遊戲結束(自吃或碰牆)  

int  dx[4] = {0, 0, -1, 1};  //左、右、上、下的方向  

int  dy[4] = {-1, 1, 0, 0};  

struct Snake   //蛇的每個節點的數據類型  

{  

 int x, y;  //左邊位置  

 int now;   //保存當前節點的方向, 0,1,2,3分別為左右上下  

}Snake[H*L];  

const char Shead = ‘@’;  //蛇頭  

const char Sbody = ‘#’;  //蛇身  

const char Sfood = ‘*’;  //食物  

const char Snode = ‘.’;  //’.’在地圖上標示為空  

void Initial();  //地圖的初始化  

void Create_Food(); //在地圖上隨機產生食物  

void Show();   //刷新顯示地圖  

void Button();  //取出按鍵,並判斷方向  

void Move();   //蛇的移動  

void Check_Border();  //檢查蛇頭是否越界  

void Check_Head(int x, int y);   //檢查蛇頭移動後的位置情況  

int main()   

{  

 Initial();  

 Show();  

 return 0;  

}  

void Initial()  //地圖的初始化  

{  

 int i, j;  

 int hx, hy;  

 system(“title 貪吃蛇”);  //控制台的標題  

 memset(GameMap, ‘.’, sizeof(GameMap));  //初始化地圖全部為空’.’  

 system(“cls”);  

 srand(time(0));   //隨機種子  

 hx = rand()%H;    //產生蛇頭  

 hy = rand()%L;  

 GameMap[hx][hy] = Shead;  

 Snake[0].x = hx;  Snake[0].y = hy;  

 Snake[0].now = -1;  

 Create_Food();   //隨機產生食物  

 for(i = 0; i  H; i++)   //地圖顯示  

 {   

  for(j = 0; j  L; j++)  

   printf(“%c”, GameMap[i][j]);  

  printf(“\n”);  

 }  

     

 printf(“\n小小C語言貪吃蛇\n”);  

 printf(“按任意方向鍵開始遊戲\n”);  

    

 getch();   //先接受一個按鍵,使蛇開始往該方向走  

 Button();  //取出按鍵,並判斷方向  

}  

void Create_Food()  //在地圖上隨機產生食物  

{  

 int fx, fy;  

 while(1)  

 {  

  fx = rand()%H;  

     fy = rand()%L;  

     

  if(GameMap[fx][fy] == ‘.’)  //不能出現在蛇所佔有的位置  

  {   

   GameMap[fx][fy] = Sfood;  

      break;  

  }  

 }  

}  

void Show()  //刷新顯示地圖  

{  

 int i, j;  

 while(1)  

 {    

  _sleep(500); //延遲半秒(1000為1s),即每半秒刷新一次地圖  

  Button();   //先判斷按鍵在移動  

  Move();  

  if(over)  //自吃或碰牆即遊戲結束  

  {   

   printf(“\n**遊戲結束**\n”);  

   printf(”     _\n”);  

   getchar();  

      break;  

  }  

  system(“cls”);   //清空地圖再顯示刷新吼的地圖  

  for(i = 0; i  H; i++)   

  {   

   for(j = 0; j  L; j++)  

    printf(“%c”, GameMap[i][j]);  

   printf(“\n”);  

  }  

     

  printf(“\n小小C語言貪吃蛇\n”);  

  printf(“按任意方向鍵開始遊戲\n”);  

 }  

}  

void Button()  //取出按鍵,並判斷方向  

{  

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

 {   

  while(kbhit() != 0)  //可能存在多個按鍵,要全部取完,以最後一個為主  

      key = getch(); //將按鍵從控制台中取出並保存到key中  

  switch(key)  

  {   //左  

   case 75:  Snake[0].now = 0;  

          break;  

            //右  

            case 77:  Snake[0].now = 1;       

          break;  

            //上  

   case 72:  Snake[0].now = 2;  

          break;  

            //下  

   case 80:  Snake[0].now = 3;  

          break;  

  }  

 }  

}  

void Move()   //蛇的移動  

{  

 int i, x, y;  

    int t = sum;  //保存當前蛇的長度  

 //記錄當前蛇頭的位置,並設置為空,蛇頭先移動  

 x = Snake[0].x;  y = Snake[0].y;  GameMap[x][y] = ‘.’;  

 Snake[0].x = Snake[0].x + dx[ Snake[0].now ];  

 Snake[0].y = Snake[0].y + dy[ Snake[0].now ];  

 Check_Border();   //蛇頭是否越界  

 Check_Head(x, y);  //蛇頭移動後的位置情況,參數為: 蛇頭的開始位置  

 if(sum == t)  //未吃到食物即蛇身移動哦  

    for(i = 1; i  sum; i++)  //要從蛇尾節點向前移動哦,前一個節點作為參照  

 {  

  if(i == 1)   //尾節點設置為空再移動  

   GameMap[ Snake[i].x ][ Snake[i].y ] = ‘.’;  

     

  if(i == sum-1)  //為蛇頭後面的蛇身節點,特殊處理  

  {  

   Snake[i].x = x;  

         Snake[i].y = y;  

      Snake[i].now = Snake[0].now;  

  }  

  else   //其他蛇身即走到前一個蛇身位置  

  {  

   Snake[i].x = Snake[i+1].x;  

         Snake[i].y = Snake[i+1].y;  

      Snake[i].now = Snake[i+1].now;  

  }  

      

  GameMap[ Snake[i].x ][ Snake[i].y ] = ‘#’; //移動後要置為’#’蛇身   

 }  

}  

void Check_Border()  //檢查蛇頭是否越界  

{  

 if(Snake[0].x  0 || Snake[0].x = H  

 || Snake[0].y  0 || Snake[0].y = L)  

     over = 1;  

}  

void Check_Head(int x, int y)  //檢查蛇頭移動後的位置情況  

{  

    

 if(GameMap[ Snake[0].x ][ Snake[0].y ] == ‘.’)  //為空  

  GameMap[ Snake[0].x ][ Snake[0].y ] = ‘@’;  

 else 

  if(GameMap[ Snake[0].x ][ Snake[0].y ] == ‘*’)  //為食物  

  {  

   GameMap[ Snake[0].x ][ Snake[0].y ] = ‘@’;    

   Snake[sum].x = x;   //新增加的蛇身為蛇頭後面的那個  

      Snake[sum].y = y;  

      Snake[sum].now = Snake[0].now;  

         GameMap[ Snake[sum].x ][ Snake[sum].y ] = ‘#’;   

   sum++;  

   Create_Food();  //食物吃完了馬上再產生一個食物  

  }  

  else 

   over = 1;  

}

c語言貪吃蛇代碼

基本思路:

蛇每吃一個食物蛇身子就增加一格,用UP, DOWN, LEFT, RIGHT控制蛇頭的運動,而蛇身子跟着蛇頭走,每後一格蛇身子下一步走到上一格蛇身子的位置,以此類推。

#include stdio.h

#include conio.h

#include windows.h

#define BEG_X 2

#define BEG_Y 1

#define WID 20

#define HEI 20

HANDLE hout;

typedef enum {UP, DOWN, LEFT, RIGHT} DIR;

typedef struct Snake_body

{

COORD pos;//蛇身的位置

struct Snake_body *next;//下一個蛇身

struct Snake_body *prev;//前一個蛇身

}SNAKE, *PSNAKE;

PSNAKE head = NULL;//蛇頭

PSNAKE tail = NULL;//蛇尾

//畫遊戲邊框的函數

void DrawBorder()

{

int i, j;

COORD pos = {BEG_X, BEG_Y};

for(i = 0; i HEI; ++i)

{

SetConsoleCursorPosition(hout, pos);

for(j = 0; j WID; ++j)

{

if(i == 0)//第一行

{

if(j == 0)

printf(“┏”);

else if(j == WID – 1)

printf(“┓”);

else

printf(“━”);

}

else if(i == HEI – 1)//最後一行

{

if(j == 0)

printf(“┗”);

else if(j == WID – 1)

printf(“┛”);

else

printf(“━”);

}

else if(j == 0 || j == WID – 1)//第一列或最後一列

printf(“┃”);

else

printf(”  “);

}

++pos.Y;

}

}

//添加蛇身的函數

void AddBody(COORD pos)

{

PSNAKE pnew = (PSNAKE)calloc(1, sizeof(SNAKE));

pnew-pos = pos;

if(!head)

{

head = tail = pnew;

}

else

{

pnew-next = head;//新創建蛇身的next指向原先的蛇頭

head-prev = pnew;//原先的蛇頭的prev指向新創建的蛇身

head = pnew;//把新創建的蛇身作為新的蛇頭

}

SetConsoleCursorPosition(hout, head-pos);

printf(“◎”);

}

//蛇身移動的函數

void MoveBody(DIR dir)

{

PSNAKE ptmp;

COORD pos = head-pos;

switch(dir)

{

case UP:

if(head-pos.Y BEG_Y + 1)

–pos.Y;

else

return;

break;

case DOWN:

if(head-pos.Y BEG_Y + HEI – 2)

++pos.Y;

else

return;

break;

case LEFT:

if(head-pos.X BEG_X + 2)

pos.X -= 2;

else

return;

break;

case RIGHT:

if(head-pos.X BEG_X + (WID – 2) * 2)

pos.X += 2;

else

return;

break;

}

AddBody(pos);//添加了一個新的蛇頭

ptmp = tail;//保存當前的蛇尾

tail = tail-prev;

if(tail)

tail-next = NULL;

SetConsoleCursorPosition(hout, ptmp-pos);

printf(”  “);

free(ptmp);

}

int main()

{

int ctrl;

DIR dir = RIGHT;//初始蛇的方向是向右的

COORD pos = {BEG_X + 2, BEG_Y + HEI / 2};

system(“color 0E”);

system(“mode con cols=90 lines=30”);

hout = GetStdHandle(STD_OUTPUT_HANDLE);

printf(”    ————貪吃蛇的移動————“);

DrawBorder();

//自定義幾個蛇的身體

AddBody(pos);

pos.X += 2;

AddBody(pos);

pos.X += 2;

AddBody(pos);

pos.X += 2;

AddBody(pos);

pos.X += 2;

AddBody(pos);

pos.X += 2;

AddBody(pos);

pos.X += 2;

AddBody(pos);

//控制蛇的移動

while(ctrl = getch())

{

switch(ctrl)

{

case ‘w’:

if(dir == DOWN)

continue;

dir = UP;

break;

case ‘s’:

if(dir == UP)

continue;

dir = DOWN;

break;

case ‘a’:

if(dir == RIGHT)

continue;

dir = LEFT;

break;

case ‘d’:

if(dir == LEFT)

continue;

dir = RIGHT;

break;

case ‘q’:

return 0;

}

MoveBody(dir);

}

return 0;

}

擴展資料:

實現邏輯

1,可以設置光標,就能實現制定位置打印製定符號。

2,涉及一個結構體,包含兩個元素坐標元素和一個結構體指針。

3,結構體串聯形成鏈表,遍歷獲取成員坐標,打印符號得到蛇身。

4,不斷的加頭,去尾,重新遍歷坐標,再打印形成蛇的移動。

5,食物產生的位置判定,不能越界,也不能與蛇身體重合。

6,蛇的轉向判定,一條規則,不允許倒退。

7,轉向的實現,跟行進方向決定新的關節坐標(當前頭的上下左右)

8,死亡檢測,是否頭節點坐標是否與牆壁重合,是否與身體其他關節重合。

9,加速減速,設置刷新休眠時間實現。

參考資料來源:百度百科-C語言

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/156877.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-18 01:58
下一篇 2024-11-18 01:58

相關推薦

  • AES加密解密算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演着非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • Python實現簡易心形代碼

    在這個文章中,我們將會介紹如何用Python語言編寫一個非常簡單的代碼來生成一個心形圖案。我們將會從安裝Python開始介紹,逐步深入了解如何實現這一任務。 一、安裝Python …

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • OpenJudge答案1.6的C語言實現

    本文將從多個方面詳細闡述OpenJudge答案1.6在C語言中的實現方法,幫助初學者更好地學習和理解。 一、需求概述 OpenJudge答案1.6的要求是,輸入兩個整數a和b,輸出…

    編程 2025-04-29
  • Python按位運算符和C語言

    本文將從多個方面詳細闡述Python按位運算符和C語言的相關內容,並給出相應的代碼示例。 一、概述 Python是一種動態的、面向對象的編程語言,其按位運算符是用於按位操作的運算符…

    編程 2025-04-29
  • Python計算機程序代碼全面介紹

    本文將從多個方面對Python計算機程序代碼進行詳細介紹,包括基礎語法、數據類型、控制語句、函數、模塊及面向對象編程等。 一、基礎語法 Python是一種解釋型、面向對象、動態數據…

    編程 2025-04-29
  • Python語言由荷蘭人為中心的全能編程開發工程師

    Python語言是一種高級語言,很多編程開發工程師都喜歡使用Python語言進行開發。Python語言的創始人是荷蘭人Guido van Rossum,他在1989年聖誕節期間開始…

    編程 2025-04-28
  • Python語言設計基礎第2版PDF

    Python語言設計基礎第2版PDF是一本介紹Python編程語言的經典教材。本篇文章將從多個方面對該教材進行詳細的闡述和介紹。 一、基礎知識 本教材中介紹了Python編程語言的…

    編程 2025-04-28
  • Python語言實現人名最多數統計

    本文將從幾個方面詳細介紹Python語言實現人名最多數統計的方法和應用。 一、Python實現人名最多數統計的基礎 1、首先,我們需要了解Python語言的一些基礎知識,如列表、字…

    編程 2025-04-28

發表回復

登錄後才能評論