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語言