您好,登錄后才能下訂單哦!
如何利用C語(yǔ)言編寫(xiě)貪吃蛇?對(duì)于C語(yǔ)言的初學(xué)者來(lái)講,沒(méi)有什么比利用C語(yǔ)言來(lái)編寫(xiě)貪吃蛇項(xiàng)目更讓人有成就感的了。貪吃蛇項(xiàng)目可以說(shuō)是C語(yǔ)言最經(jīng)典的實(shí)戰(zhàn)項(xiàng)目之一。下面我們來(lái)看看利用C語(yǔ)言編寫(xiě)貪吃蛇的方法吧。
1、貪食蛇的設(shè)計(jì)思路
初始化分為歡迎界面、創(chuàng)建地圖、初始化蛇身和創(chuàng)建食物。然后通過(guò)按鍵識(shí)別操作,進(jìn)行判斷。一方面蛇每次移動(dòng),蛇的節(jié)點(diǎn)坐標(biāo)更新。另一方面是否滿足游戲結(jié)束條件,即撞墻,撞到自己,用戶結(jié)束游戲。要么是吃到食物或沒(méi)吃到食物。
2、實(shí)現(xiàn)代碼:
#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
#include <time.h>
#include <conio.h>
#include <stdlib.h>
//方向鍵的ASCLL值:上72,左75,右77,下80
//背景顏色的代碼: 0=黑色 1藍(lán)色 2 綠色 3湖藍(lán)色 4紅色 5紫色 6黃色 7白色 8灰色 9淡藍(lán)色
//**改變當(dāng)前光標(biāo)方塊的背景顏色和字體顏色**//
void BackGround(unsigned int ForeColor = 7, unsigned int BackGroundColor = 0) {
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); //獲取控制臺(tái)的句柄
SetConsoleTextAttribute(handle, ForeColor + BackGroundColor * 0x10);//改變當(dāng)前光標(biāo)的背景和字體顏色
}
//**改變光標(biāo)的位置**//
void gotoxy(int x, int y) {
HANDLE handle;
COORD coord; //獲取坐標(biāo)軸結(jié)構(gòu)體
coord.X = x;
coord.Y = y;
handle = GetStdHandle(STD_OUTPUT_HANDLE); //獲取控制臺(tái)句柄,值為-11
SetConsoleCursorPosition(handle, coord); //移動(dòng)光標(biāo)到x,y處
}
//**初始化地圖數(shù)據(jù)**//
void restart(int bk[20][20], int look[4], int move[20][20]) {
//bk為總的地圖數(shù)據(jù)記錄整個(gè)地圖,為1時(shí)表示墻體,為2時(shí)表示果實(shí),為3時(shí)表示蛇
//look記錄數(shù)據(jù),為0時(shí)表示朝向,為1時(shí)表示長(zhǎng)度,為3時(shí)表示勝負(fù)情況,為4表示分?jǐn)?shù)
//move記錄蛇走過(guò)的路程,用來(lái)打印蛇時(shí)判斷用
int pp, qq; //用來(lái)記錄獲取的隨機(jī)坐標(biāo)
//接下來(lái)要初始化整個(gè)地圖//
for(int i=0;i<=16;i++)
for (int j = 0; j <= 16; j++) {
if (i == 0 || i == 16 || j == 0 || j == 16) bk[i][j] = 1;//1表示墻體
else bk[i][j] = 0; //0表示什么都沒(méi)有
move[i][j] = 0; //該數(shù)組用來(lái)記錄蛇移動(dòng)的軌跡
}
//將蛇初始化在8,8坐標(biāo)上
bk[8][8] = 3;
move[8][8] = 1;//則此時(shí)8,8,上的軌跡就應(yīng)該記錄為1
move[0][0] = 1;//用此來(lái)記錄步數(shù)
pp = rand() % 15 + 1;//范圍是1-15
qq = rand() % 15 + 1;
bk[pp][qq] = 2;//表示這個(gè)位置有果實(shí)了
look[0] = 1;//表示朝向,向上
look[1] = 1;//表示長(zhǎng)度
look[2] = 0;//當(dāng)為1是表示失敗
look[3] = 0;//記錄得分
//接下來(lái)要繪制地圖//
for(int i=0;i<=16;i++)
for (int j = 0; j <= 16; j++) {
gotoxy(i * 2, j);//光標(biāo)移動(dòng),每個(gè)光標(biāo)都是矩形
switch (bk[i][j]) {
case 0:
BackGround(0, 0);
break;//如果沒(méi)有東西打印黑色
case 1:
BackGround(0, 1);
break;//墻打印藍(lán)色
case 2:
BackGround(0, 2);
break;//果實(shí)打印綠色
case 3:
BackGround(0, 3);
break;//蛇打印湖藍(lán)色
default:
break;
}
printf(" ");//地圖中直接就是涂空格符
}
//接下來(lái)要顯示積分//
gotoxy(35, 0);
BackGround(7, 0);//用白字黑底打印
printf("現(xiàn)在得分是:%d,請(qǐng)?jiān)俳釉賲?span>!^_^", look[2]);
}
//**運(yùn)動(dòng)主體**//
void map(int bk[20][20], int look[4], int xy[2], int move[20][20]) {
//bk是地圖信息,look作數(shù)據(jù)記錄,xy記錄坐標(biāo),move記錄蛇的運(yùn)動(dòng)軌跡
int b[10], qq=0, pp=0;//b用來(lái)吸收輸入,qq和pp用來(lái)隨機(jī)初始化果實(shí)坐標(biāo)
if (kbhit()) {//記錄按下的是哪個(gè)方向鍵
b[0] = getch();//用b來(lái)記錄
if (b[0] == 224) b[0] = getch();//如果為224表示為方向鍵,但是要再一次獲取才行
if (b[0] == 72 && look[0] != 2)
//如果輸入的為上并且朝向不為下
look[0] = 1;
if (b[0] == 80 && look[0] != 1)
look[0] = 2;
if (b[0] == 75 && look[0] != 4)
look[0] = 3;
if (b[0] == 77 && look[0] != 3)
look[0] = 4;
}
switch (look[0]) {
case 1:
//往上走
xy[1]--;
break;
case 2:
//往下走
xy[1]++;
break;
case 3:
//往左走
xy[0]--;
break;
case 4:
//往右走
xy[0]++;
break;
}
//接下來(lái)蛇就開(kāi)始走動(dòng)了//
move[0][0]++;//蛇的步數(shù)加一
move[xy[0]][xy[1]] = move[0][0];//記錄當(dāng)前格子中蛇的軌跡
gotoxy(35, 2);
BackGround(7, 0);
printf("橫坐標(biāo):%d,縱坐標(biāo):%d", xy[0],xy[1]);
gotoxy(xy[0] * 2, xy[1]);//這里蛇頭就往前移動(dòng)了
BackGround(0, 3);//與蛇體一個(gè)顏色
printf(" ");
//如果吃了果實(shí)//
if (bk[xy[0]][xy[1]] == 2) {
look[2]++;//分?jǐn)?shù)加一
look[1]++;//長(zhǎng)度加一
//更新分?jǐn)?shù)
gotoxy(35, 0);
BackGround(7, 0);
printf("現(xiàn)在得分是:%d,請(qǐng)?jiān)俳釉賲?span>!^_^", look[2]);
while (bk[pp][qq] != 0) {
pp = rand() % 15 + 1;
qq = rand() % 15 + 1;
}
bk[pp][qq] = 2;//將這個(gè)地方變?yōu)楣麑?shí)
gotoxy(pp * 2, qq);
BackGround(0, 2);
printf(" ");
}
//如果撞了墻或者自己//
if (bk[xy[0]][xy[1]] == 1 || bk[xy[0]][xy[1]] == 3) {
look[3] = 1;//表示已經(jīng)輸了
gotoxy(6, 6);
BackGround(7, 0);
printf("你輸了,最后得分:%d", look[2]);
}
bk[xy[0]][xy[1]] = 3;//使這個(gè)位置變成蛇
//接下來(lái)要檢測(cè)蛇然后刷新蛇的位置//
for(int i=0;i<=16;i++)
for (int j = 0; j <= 16; j++) {
if (move[i][j] == move[xy[0]][xy[1]] - look[1]){
//如果符合這個(gè)條件,則表示蛇已經(jīng)移動(dòng)出這個(gè)位置了
//要?jiǎng)h除這個(gè)位置的蛇尾巴
//一次只有一個(gè)方塊會(huì)符合要求吧?
bk[i][j] = 0;
gotoxy(i * 2, j);
BackGround(0, 0);
printf(" ");
break;//一次只找一個(gè)
}
}
end:;
}
int main() {
int bk[20][20], xy[2], move[20][20], look[4];
xy[1] = xy[0] = 8;
srand((unsigned) time(NULL));//初始化隨機(jī)種子
system("pause");
restart(bk, look, move);
while (look[3] == 0) {
Sleep(200);//休眠400ms一次
map(bk, look, xy, move);
}
system("pause");
printf("游戲結(jié)束,謝謝游玩!^_^");
return 0;
}
看完上文你知道如何利用C語(yǔ)言編寫(xiě)貪吃蛇了嗎?如果還是不太了解,可以關(guān)注億速云的其他資訊內(nèi)容,一定會(huì)找到合適你的哦。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。