日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c语言链表写贪吃蛇思路,C语言构建的链表贪吃蛇

發布時間:2023/12/2 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言链表写贪吃蛇思路,C语言构建的链表贪吃蛇 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

用C語言鏈表寫的貪吃蛇(程序設計時做的,做的不好大佬勿噴)

借助游戲內容分析貪吃蛇所需的功能主要包括這幾塊:

移動光標模塊

打印地圖模塊和基本規則信息

讀取最高分文件

打印初始蛇模塊

打印時給予蛇的初始移動方向

產生食物模塊

1)、保證食物在地圖內產生

2)、保證食物不能出現在蛇體

蛇的生命狀態判斷模塊

1)、撞墻導致死亡

2)、頭撞身體部位死亡

6.運行模塊

1)、讓蛇移動

2)、根據按鍵來改變蛇的移動方向

3)、對待分數的增加游戲難度的增加

4)、蛇在吃食物后分數的增加

7.結束模塊

在遇到撞墻或者撞自己部位死亡時結束程序,并進行分數與歷史最高分作比較,最終達到最高分的更新

以下為代碼

#include

#include

#include //控制臺輸入和輸出

#include //窗口函數

#include

#define W 1//蛇的運動方向W:上 S:下 A: 左 D:右

#define S 2

#define A 3

#define D 4

/*

定義全局變量

*/

typedef struct{

int x;

int y;

}place;//定義坐標結構體

typedef struct ZB{

place data;

struct ZB *next;

}snake;//定義蛇的鏈表

/*

定義全局鏈表

*/

snake *head,*p,*q,*h;//

place food;//定義食物坐標

int score=0,bestscore,game_flag=0,ch,sleep=400;//定義得分score死亡判斷game_flag方向判斷ch蛇的速度sleep

/*

函數聲明

*/

void gotoxy(int x,int y);//定位光標

void map_creat();//運用定位函數打印地圖

void ini_snack();//隨機產生蛇

void cre_food();//隨機產生食物

void live_jud_1();//判斷自己是否撞墻死亡

void live_jud_2();//判斷自己是否撞到自己

void move();//蛇的移動

void rungame();//游戲運行

void gameover();//游戲結束界面

void changch();//改變方向

int color(int c);//改顏色函數

/*

構建定位函數

*/

int color(int c)

{

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),c); //更改文字顏色

return 0;

}

void gotoxy(int x,int y)//定位光標

{

COORD pos;

HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);

pos.X=x;

pos.Y=y;

SetConsoleCursorPosition(handle,pos);

}

/*

打印地圖

*/

void map_creat()//運用定位函數打印地圖

{

FILE *fp;//創建一個記錄最高分的文件

fp=fopen("score.1","r");

fscanf(fp,"%d",&bestscore);//讀取最高分

fclose(fp);

gotoxy(54,26);

printf("Your Best Score : %d\t", bestscore);//打印出最高分

int i,j;

for(i=0;i<48;i++)

{

gotoxy(i,0);

printf("#");

color(6);

gotoxy(i,26);

printf("#");

color(6);

}

for(j=0;j<26;j++)

{

gotoxy(0,j);

printf("#");

color(6);

gotoxy(48,j);

printf("#");

color(6);

}

gotoxy(54,10);

printf("游戲規則:");

gotoxy(54,12);

printf("向上移動:↑\n");

gotoxy(54,14);

printf("向下移動:↓\n");

gotoxy(54,16);

printf("向左移動:←\n");

gotoxy(54,18);

printf("向右移動:→\n");

gotoxy(54,20);

printf("吃一個食物分數加10");

gotoxy(54,22);

printf("按空格鍵暫停游戲");

gotoxy(54,24);

printf("按ESC直接結束游戲");

}

/*

構建初始蛇

*/

void ini_snack()//產生蛇

{

int i;

/*

采用尾插法構建蛇的鏈表初始長度設為二

*/

head=(snake *)malloc(sizeof(snake));

head->data.x=48/2;

head->data.y=26/2;

head->next=NULL;

h=head;

for(i=1;i<=2;i++)

{

p=(snake *)malloc(sizeof(snake));

p->data.x=48/2+i;

p->data.y=26/2;

h->next=p;

h=p;

}

p->next=NULL;

/*

將蛇打印出來

*/

h=head;

while(h!=NULL)

{

gotoxy(h->data.x,h->data.y);

color(5);

printf("@");

h=h->next;

}

ch=W;//蛇的初始方向

}

/*

隨機產生食物

*/

void cre_food()//隨機產生食物

{

srand((unsigned)time(NULL));//為了防止每次產生的隨機數相同,種子設置為time

/*

隨機產生食物

*/

food.x=rand()%(48-2)+1;

food.y=rand()%(26-2)+1;

while(p!=NULL)

{

/*

判斷食物是否與蛇重合,如果重合重新產生

*/

if(p->data.x==food.x&&p->data.y==food.y)

cre_food();

p=p->next;

}

gotoxy(food.x,food.y);

color(1);

printf("$");//打印食物

}

/*

判斷是否死亡

*/

void live_jud_1()//判斷自己是否撞墻死亡

{

if(head->data.x==0||head->data.x==48||head->data.y==0||head->data.y==26)//撞墻

{

game_flag=1;

gameover();

}

}

void live_jud_2()//判斷自己是否撞到自己

{

q=head->next;

while(q!=NULL)

{

if(head->data.x==q->data.x&&head->data.y==q->data.y)//撞自己

{

{

game_flag=2;

gameover();

}

break;

}

q=q->next;

}

}

/*

游戲進行界面

*/

void move()

{

snake *l;

live_jud_1();

l=(snake *)malloc(sizeof(snake));

/*

構建一個新的節點通,過新節點來表示下一次頭節點所在的位置

將新節點當作移動后的頭節點

如果新頭節點的坐標等于食物的坐標得分加10,食物的標志變為1

因為蛇的鏈表長度加了一,如果是移動的話找出尾節點并打印出 然后刪掉該尾節點

如果吃到了食物就直接將蛇打印出來

*/

if(ch==W)

{

l->data.x=head->data.x;

l->data.y=head->data.y-1;

if(l->data.x==food.x&&l->data.y==food.y)

{

l->next=head;

head=l;

q=head;

while(q!=NULL)//將蛇重新打印一邊

{

gotoxy(q->data.x,q->data.y);

color(5);

printf("@");

q=q->next;

}

score+=10;

cre_food();//構建新的食物

}

else

{

l->next=head;

head=l;

q=head;

while(q->next->next!=NULL)

{

gotoxy(q->data.x,q->data.y);

color(5);

printf("@");

q=q->next;

}

gotoxy(q->next->data.x,q->next->data.y);

printf(" ");//將蛇尾去掉

free(q->next);

q->next=NULL;

}

}

if(ch==A)

{

l->data.x=head->data.x-1;

l->data.y=head->data.y;

if(l->data.x==food.x&&l->data.y==food.y)

{

l->next=head;

head=l;

q=head;

while(q!=NULL)

{

gotoxy(q->data.x,q->data.y);

color(5);

printf("@");

q=q->next;

}

score+=10;

cre_food();

}

else

{

l->next=head;

head=l;

q=head;

while(q->next->next!=NULL)

{

gotoxy(q->data.x,q->data.y);

color(5);

printf("@");

q=q->next;

}

gotoxy(q->next->data.x,q->next->data.y);

printf(" ");

free(q->next);

q->next=NULL;

}

}

if(ch==S)

{

l->data.x=head->data.x;

l->data.y=head->data.y+1;

if(l->data.x==food.x&&l->data.y==food.y)

{

l->next=head;

head=l;

q=head;

while(q!=NULL)

{

gotoxy(q->data.x,q->data.y);

color(5);

printf("@");

q=q->next;

}

score+=10;

cre_food();

}

else

{

l->next=head;

head=l;

q=head;

while(q->next->next!=NULL)

{

gotoxy(q->data.x,q->data.y);

color(5);

printf("@");

q=q->next;

}

gotoxy(q->next->data.x,q->next->data.y);

printf(" ");

free(q->next);

q->next=NULL;

}

}

if(ch==D)

{

l->data.x=head->data.x+1;

l->data.y=head->data.y;

if(l->data.x==food.x&&l->data.y==food.y)

{

l->next=head;

head=l;

q=head;

while(q!=NULL)

{

gotoxy(q->data.x,q->data.y);

color(5);

printf("@");

q=q->next;

}

score+=10;

cre_food();

}

else

{

l->next=head;

head=l;

q=head;

while(q->next->next!=NULL)

{

gotoxy(q->data.x,q->data.y);

color(5);

printf("@");

q=q->next;

}

gotoxy(q->next->data.x,q->next->data.y);

printf(" ");

free(q->next);

q->next=NULL;

}

}

live_jud_2();//判斷是否撞自己死亡

}

void rungame()//運行游戲

{

while(1)

{

gotoxy(54,8);

printf("Your Score:%d",score);

/*

以下確保不能向上運動時改方向為向下等情況

*/

if(GetAsyncKeyState(VK_UP)&&ch!=S)

ch=W;

else if(GetAsyncKeyState(VK_DOWN)&&ch!=W)

ch=S;

else if(GetAsyncKeyState(VK_LEFT)&&ch!=D)

ch=A;

else if(GetAsyncKeyState(VK_RIGHT)&&ch!=A)

ch=D;

/*

根據分數和Sleep函數來確定游戲難度

*/

if(score>=50&&score<100)

sleep=300;

else if(score>=100&&score<300)

sleep=250;

else if(score>=300)

sleep=200;

if(GetAsyncKeyState(VK_SPACE))//輸入space暫停游戲

{

while(1)

{

Sleep(300);

if(GetAsyncKeyState(VK_SPACE))

break;

}

}

else if (GetAsyncKeyState(VK_ESCAPE))//輸入ESC直接結束游戲

{

game_flag=3;

gameover();

}

Sleep(sleep);

move();

}

}

/*

游戲結束界面

*/

void gameover()//游戲結束界面

{

FILE *fp;

system("cls");//清屏

gotoxy(48/2,26/2-2);

printf("\tGame Over!!!");//打印出游戲結束界面

gotoxy(48/2,26/2);

if(game_flag==1)

printf("\t你撞墻了!!!\n");

else if(game_flag==2)

printf("\t傻孩子!你不能吃你自己!!!\n");

else if(game_flag==3)

printf("\t您已結束游戲!");

gotoxy(48/2,26/2+2);

printf("\tYour score:%d\n",score);//打印出得到的分數

if(score>bestscore)//如果此次游戲分數大于以前最高分

{

fp=fopen("score.1","w");

fprintf(fp,"%d",score);//將此次分數保存在最高分文件里

fclose(fp);

}

system("pause");

exit(0);

}

/*

主函數

*/

int main()

{

system("color 9");

map_creat();

ini_snack();

cre_food();

rungame();

return 0;

}

標簽:head,food,gotoxy,next,鏈表,貪吃蛇,printf,C語言,data

來源: https://blog.csdn.net/ippcp/article/details/106817372

總結

以上是生活随笔為你收集整理的c语言链表写贪吃蛇思路,C语言构建的链表贪吃蛇的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。