#包括
#包括
#包括
#包括
#包括
#定義寬度40
#defineHEIGH12
枚舉方向{//方向
左邊,
對,
向上
下面的
};
結構食品{//食品
Intx
Inty
};
{//畫蛇。
intx
inty
structNode * next
};
Structsnake {//snake屬性du
intlenth//長度
enumdirectiondir//方向
};
structFood *食品;//食物
structSnake * snake//蛇屬性
structNode*snode,* tail//蛇身
intSPEECH = 200
int score = 0;//分數
ints mark = 0;//吃食物標誌誌記
int times = 0;
int stop = 0;
voidInitfood();//生產食物
voidInitsnake();//構造蛇
void eatfood();//向前看
voidAddnode(intx,inty);//增加蛇身
void display(struct node * shead);//顯示蛇坐在刀痕上。
void move();//蛇形運動
void draw();//畫壹條蛇
void home page();//主頁
voidkeybordhit();//監視器鍵盤按鍵
void addtail();//吃食物
Voidgotoxy(intx,inty)//定位光標。
{
COORDpos
位置。x = x-1;
位置。y = y-1;
SetConsoleCursorPosition(GetStdHandle(STD _ OUTPUT _ HANDLE),pos);
}
void ini snake()//構造蛇
{
inti
snake =(struct snake *)malloc(sizeof(struct snake));
tail =(struct node *)malloc(sizeof(struct node));
food =(struct food *)malloc(sizeof(struct food));
蛇-& gt;lenth = 5;//初始長度5
蛇-& gt;dir = RIGHT//初始的蛇頭方向是對的
for(I = 2;我& lt= snake-& gt;lenth+2;I++)//添加5個節點
{
Addnode(i,2);
}
}
voidinitfood()//生產食物
{
structNode * p = snode
int mark = 1;
srand((無符號)時間(空));//以時間為種子生成隨機數。
while(1)
{
食物-& gt;x = rand()%(WIDTH-2)+2;//食物x坐標
食物-& gt;y = rand()%(HEIGH-2)+2;//食物y坐標
而(p!=空)
{
如果((食物-& gt;x = = p-& gt;x)和amp& amp(食物-& gt;y = = p-& gt;Y))//如果食物產生在蛇身上。
{//食物再生。
mark = 0;//無效的食物生成
打破;
}
p = p-& gt;接下來;
}
If(mark = = 1)//如果食物不在蛇身上,生成食物;否則,再生食物。
{
gotoxy(食品-& gt;十、食物-& gt;y);
printf("%c ",3);
打破;
}
mark = 1;
p = snode
}
}
Voidmove ()//move
{
structNode*q,* p = snode
if(snake-& gt;dir = =右)
{
add node(p-& gt;x+1,p->y);
如果(smark==0)
{
while(p->;下壹個!=空)
{
q = p;
p = p-& gt;接下來;
}
q->;next = NULL
免費(p);
}
}
if(snake-& gt;方向= =左)
{
add node(p-& gt;x-1,p->y);
如果(smark==0)
{
while(p->;下壹個!=空)
{
q = p;
p = p-& gt;接下來;
}
q->;next = NULL
免費(p);
}
}
if(snake-& gt;dir==UP)
{
add node(p-& gt;x,p-& gt;y-1);
如果(smark==0)
{
while(p->;下壹個!=空)
{
q = p;
p = p-& gt;接下來;
}
q->;next = NULL
免費(p);
}
}
if(snake-& gt;方向= =向下)
{
add node(p-& gt;x,p-& gt;y+1);
如果(smark==0)
{
while(p->;下壹個!=空)
{
q = p;
p = p-& gt;接下來;
}
q->;next = NULL
免費(p);
}
}
}
VoidAddnode(intx,inty)//添加蛇體。
{
struct node * new node =(struct node *)malloc(sizeof(struct node));
structNode * p = snode
新節點-& gt;next = snode
新節點-& gt;x = x
新節點-& gt;y = y
snode = newnode//節點被添加到蛇頭
if(x & lt;2 | | x & gt= WIDTH | | y & lt2 | | y & gt=HEIGH)//到達邊界
{
STOP = 1;
gotoxy(10,19);
Printf("撞墻,遊戲結束,按任意鍵退出!\ n ");//失敗
_ getch();
免費(snode);//釋放內存
免費(蛇);
退出(0);
}
而(p!= null)//擊中自身
{
如果(p->;下壹個!=空)
如果((p-& gt;x = = x)& amp;& amp(p->;y==y))
{
STOP = 1;
gotoxy(10,19);
Printf("打自己,遊戲結束,按任意鍵退出!\ n ");//失敗
_ getch();
免費(snode);//釋放內存
免費(蛇);
退出(0);
}
p = p-& gt;接下來;
}
}
void eatfood()//吃食物
{
addtail();
得分++;
}
voidaddtail()//添加蛇尾
{
struct node * new node =(struct node *)malloc(sizeof(struct node));
structNode * p = snode
尾巴-& gt;next = newnode
新節點-& gt;x = 50
新節點-& gt;y = 20
新節點-& gt;next = NULL//節點被添加到蛇頭
tail = newnode//新的蛇尾
}
void Draw()//繪制蛇
{
structNode * p = snode
inti,j;
而(p!=空)
{
gotoxy(p-& gt;x,p-& gt;y);
printf("%c ",2);
尾巴= p;
p = p-& gt;接下來;
}
if(s node-& gt;x = = food-& gt;x & amp& ampsnode-& gt;y = = food-& gt;Y)//蛇頭的坐標等於食物坐標。
{
smark = 1;
eat food();//添加節點
init food();//生產食物
}
如果(smark==0)
{
gotoxy(tail-& gt;x,tail-& gt;y);//食物清完之前沒吃尾節點。
printf("%c ",' ');//吃菜的話,不知道尾節點。
}
其他
{
次數= 1;
}
if((smark = = 1)& amp;& amp(times==1))
{
gotoxy(tail-& gt;x,tail-& gt;y);//食物清完之前沒吃尾節點。
printf("%c ",' ');//吃菜的話,不知道尾節點。
smark = 0;
}
gotoxy(5012);
Printf ("food: %d,%d ",food-& gt;十、食物-& gt;y);
gotoxy(50,5);
Printf("分數:% d ",分數);
gotoxy(50,7);
Printf("速度:% d ",語音);
gotoxy(15,14);
Printf("按o鍵加速");
gotoxy(15,15);
Printf("按P鍵減速");
gotoxy(15,16);
Printf("按空格鍵暫停");
}
voidhidecursor()//隱藏光標
{
CONSOLE _ CURSOR _ info CURSOR _ info = { 1,0}。
SetConsoleCursorInfo(GetStdHandle(STD _ OUTPUT _ HANDLE),& ampcursor _ info);
}
void home page()//繪制主頁
{
intx,y;
hide cursor();//隱藏光標
printf("-\ n ");
printf(" | \ t \ t \ t \ t | \ n ");
printf(" | \ t \ t \ t \ t | \ n ");
printf(" | \ t \ t \ t \ t | \ n ");
printf(" | \ t \ t \ t \ t | \ n ");
printf(" | \ t \ t \ t \ t | \ n ");
printf(" | \ t \ t \ t \ t | \ n ");
printf(" | \ t \ t \ t \ t | \ n ");
printf(" | \ t \ t \ t \ t | \ n ");
printf(" | \ t \ t \ t \ t | \ n ");
printf(" | \ t \ t \ t \ t | \ n ");
printf("-\ n ");
gotoxy(5,13);
Printf("點擊任意鍵開始遊戲!根據W.A.S.D . ")控制方向;
_ getch();
init snake();
init food();
gotoxy(5,13);
printf(" ");
}
voidkeybordhit()//監視器鍵盤
{
charch
if(_kbhit())
{
ch = getch();
開關(通道)
{
案例“w”:
case ' w ':if(snake-& gt;Dir==DOWN)//如果原方向向下,反方向無效。
{
打破;
}
其他
蛇-& gt;dir = UP打破;
案例“a”:
case ' a ':if(snake-& gt;Dir==RIGHT)//如果原方向是對的,但反方向無效。
{
打破;
}
其他
蛇-& gt;dir = LEFT打破;
案例:
case ' s ':if(snake-& gt;Dir==UP)//如果原方向向上,則反方向無效。
{
打破;
}
其他
蛇-& gt;dir = DOWN打破;
案例“d”:
case ' d ':if(snake->;Dir==LEFT)//如果原方向為左,但反方向無效。
{
打破;
}
其他
蛇-& gt;dir = RIGHT打破;
案例“o”:
案例“o”:
if(SPEECH & gt;=150)//加速。
{
語音=語音-50;
}
打破;
案例“p”:
案例“p”:
if(語音& lt=400)//減速
{
演講=演講+50;
}
打破;
案例“”://暫停
gotoxy(15,18);
Printf("遊戲已經暫停,按任意鍵恢復遊戲");
系統("暫停& gtnul”);
gotoxy(15,18);
printf(" ");
打破;
默認:break
}
}
}
int main(void)//程序入口
{
主頁();
而(!停止)
{
keybordhit();//監視器鍵盤按鍵
move();//snake的坐標變化
draw();//蛇的重新繪制
睡眠(言語);//暫時掛起線程
}
return0
}
擴展數據:
註意事項:
1.代碼將源信息轉換成易於交流或存儲的符號。解碼(Decoding)是壹個還原解碼的過程,將代碼符號轉換成接收方能夠理解的形式。
2.編碼的原因之壹是在共同語言(口語或書面語)難以達到的情況下進行交流。例如,旗幟可以用特定的標記來表達特定的信息,而站在遠處的另壹個人可以解釋該標記來再現該信息。