溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

利用C語(yǔ)言編寫(xiě)貪吃蛇的方法介紹

發(fā)布時(shí)間:2020-03-23 14:52:06 來(lái)源:億速云 閱讀:249 作者:小新 欄目:編程語(yǔ)言

如何利用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ě)貪吃蛇的方法吧。

 利用C語(yǔ)言編寫(xiě)貪吃蛇的方法介紹

利用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)到xy

}

//**初始化地圖數(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)吸收輸入,qqpp用來(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ì)找到合適你的哦。


向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI