c語(yǔ)言 貪吃蛇 程序 C語(yǔ)言的貪吃蛇源代碼
基本思路:
蛇每吃一個(gè)食物蛇身子就增加一格,用UP, DOWN, LEFT, RIGHT控制蛇頭的運(yùn)動(dòng),而蛇身子跟著蛇頭走,每后一格蛇身子下一步走到上一格蛇身子的位置,以此類(lèi)推。
#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;//下一個(gè)蛇身
struct Snake_body *prev;//前一個(gè)蛇身
}SNAKE, *PSNAKE;
PSNAKE head = NULL;//蛇頭
PSNAKE tail = NULL;//蛇尾
//畫(huà)游戲邊框的函數(shù)
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;
}
}
//添加蛇身的函數(shù)
void AddBody(COORD pos)
{
PSNAKE pnew = (PSNAKE)calloc(1, sizeof(SNAKE));
pnew->pos = pos;
if(!head)
{
head = tail = pnew;
}
else
{
pnew->next = head;//新創(chuàng)建蛇身的next指向原先的蛇頭
head->prev = pnew;//原先的蛇頭的prev指向新創(chuàng)建的蛇身
head = pnew;//把新創(chuàng)建的蛇身作為新的蛇頭
}
SetConsoleCursorPosition(hout, head->pos);
printf("◎");
}
//蛇身移動(dòng)的函數(shù)
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);//添加了一個(gè)新的蛇頭
ptmp = tail;//保存當(dāng)前的蛇尾
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(" ------------貪吃蛇的移動(dòng)------------");
DrawBorder();
//自定義幾個(gè)蛇的身體
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);
//控制蛇的移動(dòng)
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;
}
擴(kuò)展資料:
實(shí)現(xiàn)邏輯
1,可以設(shè)置光標(biāo),就能實(shí)現(xiàn)制定位置打印制定符號(hào)。
2,涉及一個(gè)結(jié)構(gòu)體,包含兩個(gè)元素坐標(biāo)元素和一個(gè)結(jié)構(gòu)體指針。
3,結(jié)構(gòu)體串聯(lián)形成鏈表,遍歷獲取成員坐標(biāo),打印符號(hào)得到蛇身。
4,不斷的加頭,去尾,重新遍歷坐標(biāo),再打印形成蛇的移動(dòng)。
5,食物產(chǎn)生的位置判定,不能越界,也不能與蛇身體重合。
6,蛇的轉(zhuǎn)向判定,一條規(guī)則,不允許倒退。
7,轉(zhuǎn)向的實(shí)現(xiàn),跟行進(jìn)方向決定新的關(guān)節(jié)坐標(biāo)(當(dāng)前頭的上下左右)
8,死亡檢測(cè),是否頭節(jié)點(diǎn)坐標(biāo)是否與墻壁重合,是否與身體其他關(guān)節(jié)重合。
9,加速減速,設(shè)置刷新休眠時(shí)間實(shí)現(xiàn)。
參考資料來(lái)源:百度百科-C語(yǔ)言
代碼示例如下:
使用了4個(gè)自定義函數(shù)來(lái)實(shí)現(xiàn)
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#define High 20 // 游戲畫(huà)面尺寸
#define Width 30
// 全局變量
int moveDirection; // 小蛇移動(dòng)位置,上下左右分別用1,2,3,4表示
int food_x,food_y; // 食物的位置
int canvas[High][Width] = {0}; // 二維數(shù)組存儲(chǔ)游戲畫(huà)布中對(duì)應(yīng)的元素
// 0為空格0,-1為邊框#,-2為食物F,1為蛇頭@,大于1的正數(shù)為蛇身*
void gotoxy(int x,int y) //光標(biāo)移動(dòng)到(x,y)位置
{
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos;
pos.X = x;
pos.Y = y;
SetConsoleCursorPosition(handle,pos);
}
// 移動(dòng)小蛇
// 第一步掃描數(shù)組canvas所有元素,找到正數(shù)元素都+1
// 找到最大元素(即蛇尾巴),把其變?yōu)?
// 找到=2的元素(即蛇頭),再根據(jù)輸出的上下左右方向,把對(duì)應(yīng)的另一個(gè)像素值設(shè)為1(新蛇頭)
void moveSnakeByDirection()
{
int i,j;
for (i=1;i<High-1;i++)
for (j=1;j<Width-1;j++)
if (canvas[i][j]>0)
canvas[i][j]++;
int oldTail_i,oldTail_j,oldHead_i,oldHead_j;
int max = 0;
for (i=1;i<High-1;i++)
for (j=1;j<Width-1;j++)
if (canvas[i][j]>0)
{
if (max<canvas[i][j])
{
max = canvas[i][j];
oldTail_i = i;
oldTail_j = j;
}
if (canvas[i][j]==2)
{
oldHead_i = i;
oldHead_j = j;
}
}
int newHead_i,newHead_j;
if (moveDirection==1) // 向上移動(dòng)
{
newHead_i = oldHead_i-1;
newHead_j = oldHead_j;
}
if (moveDirection==2) // 向下移動(dòng)
{
newHead_i = oldHead_i+1;
newHead_j = oldHead_j;
}
if (moveDirection==3) // 向左移動(dòng)
{
newHead_i = oldHead_i;
newHead_j = oldHead_j-1;
}
if (moveDirection==4) // 向右移動(dòng)
{
newHead_i = oldHead_i;
newHead_j = oldHead_j+1;
}
// 新蛇頭如果吃到食物
if (canvas[newHead_i][newHead_j]==-2)
{
canvas[food_x][food_y] = 0;
// 產(chǎn)生一個(gè)新的食物
food_x = rand()%(High-5) + 2;
food_y = rand()%(Width-5) + 2;
canvas[food_x][food_y] = -2;
// 原來(lái)的舊蛇尾留著,長(zhǎng)度自動(dòng)+1
}
else // 否則,原來(lái)的舊蛇尾減掉,保持長(zhǎng)度不變
canvas[oldTail_i][oldTail_j] = 0;
// 是否小蛇和自身撞,或者和邊框撞,游戲失敗
if (canvas[newHead_i][newHead_j]>0 || canvas[newHead_i][newHead_j]==-1)
{
printf("游戲失敗!
");
Sleep(2000);
system("pause");
exit(0);
}
else
canvas[newHead_i][newHead_j] = 1;
}
void startup() // 數(shù)據(jù)初始化
{
int i,j;
// 初始化邊框
for (i=0;i<High;i++)
{
canvas[i][0] = -1;
canvas[i][Width-1] = -1;
}
for (j=0;j<Width;j++)
{
canvas[0][j] = -1;
canvas[High-1][j] = -1;
}
// 初始化蛇頭位置
canvas[High/2][Width/2] = 1;
// 初始化蛇身,畫(huà)布中元素值分別為2,3,4,5....
for (i=1;i<=4;i++)
canvas[High/2][Width/2-i] = i+1;
// 初始小蛇向右移動(dòng)
moveDirection = 4;
food_x = rand()%(High-5) + 2;
food_y = rand()%(Width-5) + 2;
canvas[food_x][food_y] = -2;
}
void show() // 顯示畫(huà)面
{
gotoxy(0,0); // 光標(biāo)移動(dòng)到原點(diǎn)位置,以下重畫(huà)清屏
int i,j;
for (i=0;i<High;i++)
{
for (j=0;j<Width;j++)
{
if (canvas[i][j]==0)
printf(" "); // 輸出空格
else if (canvas[i][j]==-1)
printf("#"); // 輸出邊框#
else if (canvas[i][j]==1)
printf("@"); // 輸出蛇頭@
else if (canvas[i][j]>1)
printf("*"); // 輸出蛇身*
else if (canvas[i][j]==-2)
printf("F"); // 輸出食物F
}
printf("
");
}
Sleep(100);
}
void updateWithoutInput() // 與用戶(hù)輸入無(wú)關(guān)的更新
{
moveSnakeByDirection();
}
void updateWithInput() // 與用戶(hù)輸入有關(guān)的更新
{
char input;
if(kbhit()) // 判斷是否有輸入
{
input = getch(); // 根據(jù)用戶(hù)的不同輸入來(lái)移動(dòng),不必輸入回車(chē)
if (input == 'a')
{
moveDirection = 3; // 位置左移
moveSnakeByDirection();
}
else if (input == 'd')
{
moveDirection = 4; // 位置右移
moveSnakeByDirection();
}
else if (input == 'w')
{
moveDirection = 1; // 位置上移
moveSnakeByDirection();
}
else if (input == 's')
{
moveDirection = 2; // 位置下移
moveSnakeByDirection();
}
}
}
int main()
{
startup(); // 數(shù)據(jù)初始化
while (1) // 游戲循環(huán)執(zhí)行
{
show(); // 顯示畫(huà)面
updateWithoutInput(); // 與用戶(hù)輸入無(wú)關(guān)的更新
updateWithInput(); // 與用戶(hù)輸入有關(guān)的更新
}
return 0;
}
拓展資料
C語(yǔ)言是一門(mén)通用計(jì)算機(jī)編程語(yǔ)言,廣泛應(yīng)用于底層開(kāi)發(fā)。C語(yǔ)言的設(shè)計(jì)目標(biāo)是提供一種能以簡(jiǎn)易的方式編譯、處理低級(jí)存儲(chǔ)器、產(chǎn)生少量的機(jī)器碼以及不需要任何運(yùn)行環(huán)境支持便能運(yùn)行的編程語(yǔ)言。
盡管C語(yǔ)言提供了許多低級(jí)處理的功能,但仍然保持著良好跨平臺(tái)的特性,以一個(gè)標(biāo)準(zhǔn)規(guī)格寫(xiě)出的C語(yǔ)言程序可在許多電腦平臺(tái)上進(jìn)行編譯,甚至包含一些嵌入式處理器(單片機(jī)或稱(chēng)MCU)以及超級(jí)電腦等作業(yè)平臺(tái)。
二十世紀(jì)八十年代,為了避免各開(kāi)發(fā)廠商用的C語(yǔ)言語(yǔ)法產(chǎn)生差異,由美國(guó)國(guó)家標(biāo)準(zhǔn)局為C語(yǔ)言制定了一套完整的美國(guó)國(guó)家標(biāo)準(zhǔn)語(yǔ)法,稱(chēng)為ANSI C,作為C語(yǔ)言最初的標(biāo)準(zhǔn)。 目前2011年12月8日,國(guó)際標(biāo)準(zhǔn)化組織(ISO)和國(guó)際電工委員會(huì)(IEC)發(fā)布的C11標(biāo)準(zhǔn)是C語(yǔ)言的第三個(gè)官方標(biāo)準(zhǔn),也是C語(yǔ)言的最新標(biāo)準(zhǔn),該標(biāo)準(zhǔn)更好的支持了漢字函數(shù)名和漢字標(biāo)識(shí)符,一定程度上實(shí)現(xiàn)了漢字編程。
C語(yǔ)言是一門(mén)面向過(guò)程的計(jì)算機(jī)編程語(yǔ)言,與C++,Java等面向?qū)ο蟮木幊陶Z(yǔ)言有所不同。
其編譯器主要有Clang、GCC、WIN-TC、SUBLIME、MSVC、Turbo C等。
/* 貪吃蛇程序 by champking */
#define N 200
#include <graphics.h>
#include <stdlib.h>
#include <dos.h>
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define ESC 0x011b
int i,key;
int score = 0;/*得分*/
int gamespeed = 100000;/*游戲速度自己調(diào)整*/
struct Food
{
int x;/*食物的橫坐標(biāo)*/
int y;/*食物的縱坐標(biāo)*/
int yes;/*判斷是否要出現(xiàn)食物的變量*/
}food;/*食物的結(jié)構(gòu)體*/
struct Snake
{
int x[N];
int y[N];
int node;/*蛇的節(jié)數(shù)*/
int direction;/*蛇移動(dòng)方向*/
int life;/* 蛇的生命,0活著,1死亡*/
}snake;
void Init(void);/*圖形驅(qū)動(dòng)*/
void Close(void);/*圖形結(jié)束*/
void DrawK(void);/*開(kāi)始畫(huà)面*/
void GameOver(void);/*結(jié)束游戲*/
void GamePlay(void);/*玩游戲具體過(guò)程*/
void PrScore(void);/*輸出成績(jī)*/
/*主函數(shù)*/
void main(void)
{
Init();/*圖形驅(qū)動(dòng)*/
DrawK();/*開(kāi)始畫(huà)面*/
GamePlay();/*玩游戲具體過(guò)程*/
Close();/*圖形結(jié)束*/
}
/*圖形驅(qū)動(dòng)*/
void Init(void)
{
int gd = DETECT, gm;
initgraph(&gd, &gm, "c:\\tc");
cleardevice();
}
/*開(kāi)始畫(huà)面,左上角坐標(biāo)為(50,40),右下角坐標(biāo)為(610,460)的圍墻*/
void DrawK(void)
{
/*setbkcolor(LIGHTGREEN);*/
setcolor(11);
setlinestyle(SOLID_LINE, 0, THICK_WIDTH);/*設(shè)置線型*/
for(i = 50; i <= 600; i += 10)/*畫(huà)圍墻*/
{
rectangle(i, 40, i + 10, 49); /*上邊*/
rectangle(i, 451, i + 10, 460);/*下邊*/
}
for(i = 40; i <= 450; i += 10)
{
rectangle(50, i, 59, i + 10); /*左邊*/
rectangle(601, i, 610, i + 10);/*右邊*/
}
}
/*玩游戲具體過(guò)程*/
void GamePlay(void)
{
randomize();/*隨機(jī)數(shù)發(fā)生器*/
food.yes = 1;/*1表示需要出現(xiàn)新食物,0表示已經(jīng)存在食物*/
snake.life = 0;/*活著*/
snake.direction = 1;/*方向往右*/
snake.x[0] = 100; snake.y[0] = 100;/*蛇頭*/
snake.x[1] = 110; snake.y[1] = 100;
snake.node = 2;/*節(jié)數(shù)*/
PrScore();/*輸出得分*/
while(1)/*可以重復(fù)玩游戲,壓ESC鍵結(jié)束*/
{
while(!kbhit())/*在沒(méi)有按鍵的情況下,蛇自己移動(dòng)身體*/
{
if(food.yes == 1)/*需要出現(xiàn)新食物*/
{
food.x = rand() % 400 + 60;
food.y = rand() % 350 + 60;
while(food.x % 10 != 0)/*食物隨機(jī)出現(xiàn)后必須讓食物能夠在整格內(nèi),這樣才可以讓蛇吃到*/
food.x++;
while(food.y % 10 != 0)
food.y++;
food.yes = 0;/*畫(huà)面上有食物了*/
}
if(food.yes == 0)/*畫(huà)面上有食物了就要顯示*/
{
setcolor(GREEN);
rectangle(food.x, food.y, food.x + 10, food.y - 10);
}
for(i = snake.node - 1; i > 0; i--)/*蛇的每個(gè)環(huán)節(jié)往前移動(dòng),也就是貪吃蛇的關(guān)鍵算法*/
{
snake.x[i] = snake.x[i-1];
snake.y[i] = snake.y[i-1];
}
/*1,2,3,4表示右,左,上,下四個(gè)方向,通過(guò)這個(gè)判斷來(lái)移動(dòng)蛇頭*/
switch(snake.direction)
{
case 1: snake.x[0] += 10; break;
case 2: snake.x[0] -= 10; break;
case 3: snake.y[0] -= 10; break;
case 4: snake.y[0] += 10; break;
}
for(i = 3; i < snake.node; i++)/*從蛇的第四節(jié)開(kāi)始判斷是否撞到自己了,因?yàn)樯哳^為兩節(jié),第三節(jié)不可能拐過(guò)來(lái)*/
{
if(snake.x[i] == snake.x[0] && snake.y[i] == snake.y[0])
{
GameOver();/*顯示失敗*/
snake.life = 1;
break;
}
}
if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||
snake.y[0]>455)/*蛇是否撞到墻壁*/
{
GameOver();/*本次游戲結(jié)束*/
snake.life=1; /*蛇死*/
}
if(snake.life == 1)/*以上兩種判斷以后,如果蛇死就跳出內(nèi)循環(huán),重新開(kāi)始*/
break;
if(snake.x[0] == food.x && snake.y[0] == food.y)/*吃到食物以后*/
{
setcolor(0);/*把畫(huà)面上的食物東西去掉*/
rectangle(food.x, food.y, food.x + 10, food.y - 10);
snake.x[snake.node] =- 20; snake.y[snake.node] =- 20;
/*新的一節(jié)先放在看不見(jiàn)的位置,下次循環(huán)就取前一節(jié)的位置*/
snake.node++;/*蛇的身體長(zhǎng)一節(jié)*/
food.yes = 1;/*畫(huà)面上需要出現(xiàn)新的食物*/
score += 10;
PrScore();/*輸出新得分*/
}
setcolor(4);/*畫(huà)出蛇*/
for(i = 0; i < snake.node; i++)
rectangle(snake.x[i], snake.y[i], snake.x[i] + 10,
snake.y[i] - 10);
delay(gamespeed);
setcolor(0);/*用黑色去除蛇的的最后一節(jié)*/
rectangle(snake.x[snake.node-1], snake.y[snake.node-1],
snake.x[snake.node-1] + 10, snake.y[snake.node - 1] - 10);
} /*endwhile(!kbhit)*/
if(snake.life == 1)/*如果蛇死就跳出循環(huán)*/
break;
key = bioskey(0);/*接收按鍵*/
if(key == ESC)/*按ESC鍵退出*/
break;
else
if(key == UP&&snake.direction!=4)
/*判斷是否往相反的方向移動(dòng)*/
snake.direction=3;
else
if(key == RIGHT &&snake.direction != 2)
snake.direction=1;
else
if(key == LEFT && snake.direction != 1)
snake.direction = 2;
else
if(key == DOWN && snake.direction != 3)
snake.direction = 4;
}/*endwhile(1)*/
}
/*游戲結(jié)束*/
void GameOver(void)
{
cleardevice();
PrScore();
setcolor(RED);
settextstyle(0, 0, 4);
outtextxy(200, 200, "GAME OVER");
getch();
}
/*輸出成績(jī)*/
void PrScore(void)
{
char str[10];
setfillstyle(SOLID_FILL, YELLOW);
bar(50, 15, 220, 35);
setcolor(6);
settextstyle(0,0,2);
sprintf(str, "score:%d", score);
outtextxy(55, 20, str);
}
/*圖形結(jié)束*/
void Close(void)
{
getch();
closegraph();
}
/*
貪吃蛇程序
by
champking
*/
#define
N
200
#include
<graphics.h>
#include
<stdlib.h>
#include
<dos.h>
#define
LEFT
0x4b00
#define
RIGHT
0x4d00
#define
DOWN
0x5000
#define
UP
0x4800
#define
ESC
0x011b
int
i,key;
int
score
=
0;/*得分*/
int
gamespeed
=
100000;/*游戲速度自己調(diào)整*/
struct
Food
{
int
x;/*食物的橫坐標(biāo)*/
int
y;/*食物的縱坐標(biāo)*/
int
yes;/*判斷是否要出現(xiàn)食物的變量*/
}food;/*食物的結(jié)構(gòu)體*/
struct
Snake
{
int
x[N];
int
y[N];
int
node;/*蛇的節(jié)數(shù)*/
int
direction;/*蛇移動(dòng)方向*/
int
life;/*
蛇的生命,0活著,1死亡*/
}snake;
void
Init(void);/*圖形驅(qū)動(dòng)*/
void
Close(void);/*圖形結(jié)束*/
void
DrawK(void);/*開(kāi)始畫(huà)面*/
void
GameOver(void);/*結(jié)束游戲*/
void
GamePlay(void);/*玩游戲具體過(guò)程*/
void
PrScore(void);/*輸出成績(jī)*/
/*主函數(shù)*/
void
main(void)
{
Init();/*圖形驅(qū)動(dòng)*/
DrawK();/*開(kāi)始畫(huà)面*/
GamePlay();/*玩游戲具體過(guò)程*/
Close();/*圖形結(jié)束*/
}
/*圖形驅(qū)動(dòng)*/
void
Init(void)
{
int
gd
=
DETECT,
gm;
initgraph(&gd,
&gm,
"c:\\tc");
cleardevice();
}
/*開(kāi)始畫(huà)面,左上角坐標(biāo)為(50,40),右下角坐標(biāo)為(610,460)的圍墻*/
void
DrawK(void)
{
/*setbkcolor(LIGHTGREEN);*/
setcolor(11);
setlinestyle(SOLID_LINE,
0,
THICK_WIDTH);/*設(shè)置線型*/
for(i
=
50;
i
<=
600;
i
+=
10)/*畫(huà)圍墻*/
{
rectangle(i,
40,
i
+
10,
49);
/*上邊*/
rectangle(i,
451,
i
+
10,
460);/*下邊*/
}
for(i
=
40;
i
<=
450;
i
+=
10)
{
rectangle(50,
i,
59,
i
+
10);
/*左邊*/
rectangle(601,
i,
610,
i
+
10);/*右邊*/
}
}
/*玩游戲具體過(guò)程*/
void
GamePlay(void)
{
randomize();/*隨機(jī)數(shù)發(fā)生器*/
food.yes
=
1;/*1表示需要出現(xiàn)新食物,0表示已經(jīng)存在食物*/
snake.life
=
0;/*活著*/
snake.direction
=
1;/*方向往右*/
snake.x[0]
=
100;
snake.y[0]
=
100;/*蛇頭*/
snake.x[1]
=
110;
snake.y[1]
=
100;
snake.node
=
2;/*節(jié)數(shù)*/
PrScore();/*輸出得分*/
while(1)/*可以重復(fù)玩游戲,壓ESC鍵結(jié)束*/
{
while(!kbhit())/*在沒(méi)有按鍵的情況下,蛇自己移動(dòng)身體*/
{
if(food.yes
==
1)/*需要出現(xiàn)新食物*/
{
food.x
=
rand()
%
400
+
60;
food.y
=
rand()
%
350
+
60;
while(food.x
%
10
!=
0)/*食物隨機(jī)出現(xiàn)后必須讓食物能夠在整格內(nèi),這樣才可以讓蛇吃到*/
food.x++;
while(food.y
%
10
!=
0)
food.y++;
food.yes
=
0;/*畫(huà)面上有食物了*/
}
if(food.yes
==
0)/*畫(huà)面上有食物了就要顯示*/
{
setcolor(GREEN);
rectangle(food.x,
food.y,
food.x
+
10,
food.y
-
10);
}
for(i
=
snake.node
-
1;
i
>
0;
i--)/*蛇的每個(gè)環(huán)節(jié)往前移動(dòng),也就是貪吃蛇的關(guān)鍵算法*/
{
snake.x[i]
=
snake.x[i-1];
snake.y[i]
=
snake.y[i-1];
}
/*1,2,3,4表示右,左,上,下四個(gè)方向,通過(guò)這個(gè)判斷來(lái)移動(dòng)蛇頭*/
switch(snake.direction)
{
case
1:
snake.x[0]
+=
10;
break;
case
2:
snake.x[0]
-=
10;
break;
case
3:
snake.y[0]
-=
10;
break;
case
4:
snake.y[0]
+=
10;
break;
}
for(i
=
3;
i
<
snake.node;
i++)/*從蛇的第四節(jié)開(kāi)始判斷是否撞到自己了,因?yàn)樯哳^為兩節(jié),第三節(jié)不可能拐過(guò)來(lái)*/
{
if(snake.x[i]
==
snake.x[0]
&&
snake.y[i]
==
snake.y[0])
{
GameOver();/*顯示失敗*/
snake.life
=
1;
break;
}
}
if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||
snake.y[0]>455)/*蛇是否撞到墻壁*/
{
GameOver();/*本次游戲結(jié)束*/
snake.life=1;
/*蛇死*/
}
if(snake.life
==
1)/*以上兩種判斷以后,如果蛇死就跳出內(nèi)循環(huán),重新開(kāi)始*/
break;
if(snake.x[0]
==
food.x
&&
snake.y[0]
==
food.y)/*吃到食物以后*/
{
setcolor(0);/*把畫(huà)面上的食物東西去掉*/
rectangle(food.x,
food.y,
food.x
+
10,
food.y
-
10);
snake.x[snake.node]
=-
20;
snake.y[snake.node]
=-
20;
/*新的一節(jié)先放在看不見(jiàn)的位置,下次循環(huán)就取前一節(jié)的位置*/
snake.node++;/*蛇的身體長(zhǎng)一節(jié)*/
food.yes
=
1;/*畫(huà)面上需要出現(xiàn)新的食物*/
score
+=
10;
PrScore();/*輸出新得分*/
}
setcolor(4);/*畫(huà)出蛇*/
for(i
=
0;
i
<
snake.node;
i++)
rectangle(snake.x[i],
snake.y[i],
snake.x[i]
+
10,
snake.y[i]
-
10);
delay(gamespeed);
setcolor(0);/*用黑色去除蛇的的最后一節(jié)*/
rectangle(snake.x[snake.node-1],
snake.y[snake.node-1],
snake.x[snake.node-1]
+
10,
snake.y[snake.node
-
1]
-
10);
}
/*endwhile(!kbhit)*/
if(snake.life
==
1)/*如果蛇死就跳出循環(huán)*/
break;
key
=
bioskey(0);/*接收按鍵*/
if(key
==
ESC)/*按ESC鍵退出*/
break;
else
if(key
==
UP&&snake.direction!=4)
/*判斷是否往相反的方向移動(dòng)*/
snake.direction=3;
else
if(key
==
RIGHT
&&snake.direction
!=
2)
snake.direction=1;
else
if(key
==
LEFT
&&
snake.direction
!=
1)
snake.direction
=
2;
else
if(key
==
DOWN
&&
snake.direction
!=
3)
snake.direction
=
4;
}/*endwhile(1)*/
}
/*游戲結(jié)束*/
void
GameOver(void)
{
cleardevice();
PrScore();
setcolor(RED);
settextstyle(0,
0,
4);
outtextxy(200,
200,
"GAME
OVER");
getch();
}
/*輸出成績(jī)*/
void
PrScore(void)
{
char
str[10];
setfillstyle(SOLID_FILL,
YELLOW);
bar(50,
15,
220,
35);
setcolor(6);
settextstyle(0,0,2);
sprintf(str,
"score:%d",
score);
outtextxy(55,
20,
str);
}
/*圖形結(jié)束*/
void
Close(void)
{
getch();
closegraph();
}
相關(guān)評(píng)說(shuō):
利通區(qū)裝配: ______ 在內(nèi)存中定義一個(gè)數(shù)組,存儲(chǔ)當(dāng)前局面(如果棋盤(pán)小(<15)可以選用unsigned char類(lèi)型,否則用int,蛇身就用1,2,3,4,5這樣的數(shù)字序列表示,每走一格,根據(jù)當(dāng)前方向?qū)⑾乱桓駭?shù)字變一下,把尾巴也處理一下,),每一秒刷新一下(向前走一格),每刷新一下,就重繪一遍當(dāng)前局面(可以用prinrf函數(shù),也可以用繪圖函數(shù)), 總之方法很多很多,自己下來(lái)可以思索一下
利通區(qū)裝配: ______ 我可以給你思路,自己去寫(xiě),因?yàn)榫W(wǎng)上的代碼都是tc環(huán)境下的,現(xiàn)在基本不用那個(gè),你必須需要一個(gè)能在debug窗口中畫(huà)矩形的函數(shù),以及其他一些清除的函數(shù),調(diào)用api吧 然后就是按鍵檢測(cè)的api 檢測(cè)好之后,就是循環(huán)了 蛇用一個(gè)結(jié)構(gòu)體數(shù)組定義,然后每一次移動(dòng),后面的位置都等于前面的一個(gè)位置,而且因?yàn)樯哳^移動(dòng)一次所以蛇尾要用底色覆蓋掉,每次重畫(huà)只是畫(huà)蛇,并不重畫(huà)框架
利通區(qū)裝配: ______ if snake[head].pos_x == snake[tail].pos_x && snake[head].pos_y == snake[tail].pos_y 代表頭尾相碰了 那么修改這個(gè)body中的實(shí)現(xiàn)代碼 原來(lái)肯定是顯示游戲結(jié)束 清除上下文 掛了一類(lèi)的,現(xiàn)在改成你想要的
利通區(qū)裝配: ______ 很土很簡(jiǎn)單的實(shí)現(xiàn)方式 顯示:在屏幕上的指定坐標(biāo)打印一些斷續(xù)的點(diǎn)(或其他字符),每個(gè)點(diǎn)之間用空格或者其他字符來(lái)分隔.移動(dòng):打印第一次后間隔一段時(shí)間,如0.5秒或1秒等,clrscr清屏,順序移動(dòng)貪吃蛇上所有節(jié)點(diǎn)坐標(biāo)后再次打印 ,簡(jiǎn)...
利通區(qū)裝配: ______ C語(yǔ)言貪吃蛇源代碼必須經(jīng)過(guò)相應(yīng)的C/C++編譯器編譯成EXE文件后才能運(yùn)行.由于我們通常使用的操作系統(tǒng)是Windows系統(tǒng),而在該系統(tǒng)下最長(zhǎng)用的C/C++編譯器是VC++編譯器,目前在大專(zhuān)院校常用的版本還是VC++6.0 下面就以VC++6.0來(lái)說(shuō)明編譯過(guò)程:1.在VC++6.0中通過(guò)“File”菜單下的 “Open”子菜單打開(kāi)貪吃蛇代碼
利通區(qū)裝配: ______ 了解貪吃蛇設(shè)計(jì)思路 上圖中的紅色空心方框(□)表示邊框,是貪吃蛇的邊界,貪吃 蛇不能碰到它,否則就“死掉” ,游戲結(jié)束.綠色實(shí)心方框(■)表示 貪吃蛇的活動(dòng)范圍,貪吃蛇可以自由移動(dòng),食物(蘋(píng)果)也會(huì)隨機(jī)出 現(xiàn)在這個(gè)區(qū)域. 我...
利通區(qū)裝配: ______ // Snake.h : main header file for the SNAKE application//#if !defined(AFX_SNAKE_H__2EBD7F04_452B_11D7_B6CA_0050BAE90E03__INCLUDED_)#define AFX_SNAKE_...
利通區(qū)裝配: ______ C++ #include using namespace std; char num[16] = { '0', '1', '2', '3', '4', '5...
利通區(qū)裝配: ______ 簡(jiǎn)單說(shuō)呢,你需要安裝C的開(kāi)發(fā)環(huán)境(需要注意你的代碼是哪個(gè)C:C++、C#、Turb C、MS C等),然后只需要啟動(dòng)C的主程序,將你的代碼Copy/Post到里面,在菜單中找到“運(yùn)行”之類(lèi)的命令就可以進(jìn)行編譯、聯(lián)接、與運(yùn)行了. GoodLuck!
利通區(qū)裝配: ______ 當(dāng)然可以邊游戲了,漢字可以用點(diǎn)陣顯示,如果是windows c 的話顯示漢字就更簡(jiǎn)單了!游戲窗體可以用windows c 編程實(shí)現(xiàn)! 給你一個(gè)貪吃蛇的游戲吧,在tc 下編譯成功!可以q聊:969370950 #include #include #include #include ...