資料結構大作業 純C雙鏈表實現貪吃蛇

2021-10-05 11:54:20 字數 4460 閱讀 9673

整理電腦檔案資料,發現的自己18年(大一下學期)寫的資料結構大作業貪吃蛇。時光流逝,轉眼間2年就過去了。

老師意見:有存檔功能,就能滿分了。

看**,借思路,獨自實現,成長自己。

遊戲效果圖如下:

**如下:

#include#include#include#include#include#define wid 40

#define hei 20

int speed;//蛇的速度

//蛇的節點

typedef struct snake_nodesnake,*psnake;

psnake head;//蛇的頭指標

psnake tail;//蛇的尾指標

struct snake_posheadpos;//蛇頭即將移動的方向和座標

coord food;//食物座標

int score;//積分記錄

//游標定位

void getposition(coord pos)

//遊戲玩家積分等級輸出

void gamelevel()

; getposition(pos_1);

if(score>=70)

else if(score>=60)

else if(score>=55)

else if(score>=50)

else if(score>=45)

else if(score>=40)

else if(score>=36)

else if(score>=32)

else if(score>=28)

else if(score>=24)

else if(score>=19)

else if(score>=16)

else if(score>=13)

else if(score>=7)

else if(score>=0) }

//新增蛇的頭節點

void addsnakehead(coord pos)

else

//輸出頭部的位置

coord pos_1=;

getposition(pos_1);

printf(" ");//涉及迴圈列印資訊,空格覆蓋,防止資訊錯亂

getposition(pos_1);

printf("蛇頭位置:%d行 %d列",pos.y,pos.x/2);

}//刪掉蛇的尾節點

void reducesnaketail()

//蛇的移動

void movesnake(coord pos)

//方向控制

void changedir()

; int flag=0;//因為下面用的while迴圈,所以設定此標記,保證方向的單次改變 (如果沒有會出現bug,直接掉頭)

while(_kbhit())

break;

case 80:

if(!(headpos.dir==0&&score>1)&&flag==0)

break;

case 75:

if(!(headpos.dir==3&&score>1)&&flag==0)

break;

case 77:

if(!(headpos.dir==2&&score>1)&&flag==0)

break;

case 32:

pos_1.y=8;

getposition(pos_1);

system("pause");

getposition(pos_1);

printf(" ");

getposition(pos_1);

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

break;

case '5':

speed=50;

getposition(pos_1);

printf("當前模式:噩夢");

break;

case '4':

speed=100;

getposition(pos_1);

printf("當前模式:困難");

break;

case '3':

speed=150;

getposition(pos_1);

printf("當前模式:一般");

break;

case '2':

speed=200;

getposition(pos_1);

printf("當前模式:簡單");

break;

case '1':

speed=400;

getposition(pos_1);

printf("當前模式:蝸牛");

break;

default:

break;

};} switch (headpos.dir) }

//劃出遊戲邊框

void drawborder()

else

}pos.x=0; }

//邊框右側部分資訊列印

coord pos_1=;

getposition(pos_1);

pos_1.y++;

getposition(pos_1);

printf("遊戲過程中,模式可以隨意切換,請君量力而行!");

pos_1.y++;

getposition(pos_1);

printf("當前模式:一般");

speed=150;

pos_1.y=8;

getposition(pos_1);

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

pos_1.y=0;

getposition(pos_1);

printf("貪吃蛇遊戲");

pos_1.y=12;

getposition(pos_1);

printf("想要知道最高等級是什麼嗎?那就繼續玩遊戲吧!");

pos_1.y=14;

getposition(pos_1);

printf("蛇頭方向控制:↑↓←→");

pos_1.y=15;

getposition(pos_1);

printf("大兄弟,祝你玩的開心!o(∩_∩)o");

pos_1.y=hei-3;

getposition(pos_1);

printf("開發者資訊:信安1704-張鵬-學號******xx"); }

//遊戲結束判斷

int gameover()

psnake q=head;

while(q!=null)

q=q->next;

} return 0;

}//食物和積分資訊輸出

void foodinfo()

; getposition(pos);

printf(" ");//分數多次重新整理,所需要用空格刷掉前面輸出的文字,防止接下來輸出混亂排版

getposition(pos);

printf("食物位置:%d行 %d列",food.y,food.x/2);

pos.y=9;

getposition(pos);

printf("當前得分:%d",score++);

}//初始化食物

int initfood()

q=q->next;

} if(flag==0)//假設成立跳出迴圈,

}getposition(food);//游標定位

printf("●");//列印食物

gamelevel();//輸出玩家積分所達到的等級

foodinfo();//輸出食物位置資訊

}//考慮到記憶體問題,鍊錶空間釋放(重新開始遊戲需要用到)

void destroysnake()

free(tail);//釋放蛇頭節點

}//遊戲資料初始化

void initgame()

//遊戲執行控制

void rungame()

else if(headpos.pos.x==food.x&&headpos.pos.y==food.y)//吃到食物

else

}//蛇死亡後

coord pos_1=;

getposition(pos_1);

printf("很遺憾,你撞牆了或者自食自己,遊戲結束!\n");

}//遊戲重新開始

int restartgame()

else if(restar==0)

else }

int main()

break;

} return 0;

}

C 資料結構 雙鏈表

據說單鏈表沒有迴路,那麼雙鏈表也出現了,既包括後繼指標,又加入了前驅指標,某個元素可以尋找他上面乙個元素,也可以尋找到下乙個元素。當然雙鏈表也是鍊錶的一種。物理儲存結構 不一定是連續的儲存區域 邏輯儲存結構 邏輯上儲存是連續的 使用場景 跟單鏈表一樣,適用於對資料的大量新增和刪除元素,對訪問元素無要...

資料結構 c語言實現 雙鏈表

有頭結點雙鏈表 include include include define max 51 struct people typedef struct lnode lnode,linklist linklist為指向結構體lnode的指標型別,這裡linklist 與lnote 等價 void pri...

資料結構 雙鏈表

typedef struct nodenode 雙鏈表的根節點的bwd指標指向雙鏈表的最後乙個節點,fwd指標指向雙鏈表的第乙個節點,雙鏈表的value欄位為空 以下程式是將乙個值插入到乙個有序的雙鏈表中,如果鍊錶中已經有和該值相同的節點則不插入 include include typedef st...