国产精品天干天干,亚洲毛片在线,日韩gay小鲜肉啪啪18禁,女同Gay自慰喷水

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

C/C++編程筆記:C語言鏈表實(shí)現(xiàn)貪吃蛇游戲,項(xiàng)目源碼分享

2020-08-12 19:37 作者:C語言編程__Plus  | 我要投稿

本文是閱讀學(xué)習(xí)了一些其他的貪吃蛇源代碼,并做了簡(jiǎn)單的注釋和修改,里面只用了鏈表數(shù)據(jù)結(jié)構(gòu),非常適合C語言入門者學(xué)習(xí)閱讀。

程序可在VS2013下編譯運(yùn)行。


#include<stdio.h>

#include<time.h>

#include<windows.h>

#include<stdlib.h>

#define U 1

#define D 2

#define L 3

#define R 4? ? //蛇的狀態(tài),U:上 ;D:下;L:左 R:右

typedef struct SNAKE //蛇身的一個(gè)節(jié)點(diǎn)

{

? int x;

? int y;

? struct SNAKE *next;

}snake;

//全局變量//

int score = 0, add = 10;//總得分與每次吃食物得分。

int status, sleeptime = 200;//每次運(yùn)行的時(shí)間間隔

snake *head, *food;//蛇頭指針,食物指針

snake *q;//遍歷蛇的時(shí)候用到的指針

int endGamestatus = 0; //游戲結(jié)束的情況,1:撞到墻;2:咬到自己;3:主動(dòng)退出游戲。

//聲明全部函數(shù)//

void Pos();

void creatMap();

void initSnake();

int biteSelf();

void createFood();

void cantCrossWall();

void snakeMove();

void pause();

void runGame();

void initGame();

void endGame();

void gameStart();

void Pos(int x, int y)//設(shè)置光標(biāo)位置

{

? COORD pos;

? HANDLE hOutput;

? pos.X = x;

? pos.Y = y;

? hOutput = GetStdHandle(STD_OUTPUT_HANDLE);//返回標(biāo)準(zhǔn)的輸入、輸出或錯(cuò)誤的設(shè)備的句柄,也就是獲得輸入、輸出/錯(cuò)誤的屏幕緩沖區(qū)的句柄

? SetConsoleCursorPosition(hOutput, pos);

}

void creatMap()//創(chuàng)建地圖

{

? int i;

? for (i = 0; i<58; i += 2)//打印上下邊框

? {

? ? Pos(i, 0);

? ? printf("■");//一個(gè)方塊占兩個(gè)位置

? ? Pos(i, 26);

? ? printf("■");

? }

? for (i = 1; i<26; i++)//打印左右邊框

? {

? ? Pos(0, i);

? ? printf("■");

? ? Pos(56, i);

? ? printf("■");

? }

}

void initSnake()//初始化蛇身

{

? snake *tail;

? int i;

? tail = (snake*)malloc(sizeof(snake));//從蛇尾開始,頭插法,以x,y設(shè)定開始的位置//

? tail->x = 24;

? tail->y = 5;

? tail->next = NULL;

? for (i = 1; i <= 4; i++)//初始長(zhǎng)度為4

? {

? ? head = (snake*)malloc(sizeof(snake));

? ? head->next = tail;

? ? head->x = 24 + 2 * i;

? ? head->y = 5;

? ? tail = head;

? }

? while (tail != NULL)//從頭到為,輸出蛇身

? {

? ? Pos(tail->x, tail->y);

? ? printf("■");

? ? tail = tail->next;

? }

}

//??

int biteSelf()//判斷是否咬到了自己

{

? snake *self;

? self = head->next;

? while (self != NULL)

? {

? ? if (self->x == head->x && self->y == head->y)

? ? {

? ? ? return 1;

? ? }

? ? self = self->next;

? }

? return 0;

}

void createFood()//隨機(jī)出現(xiàn)食物

{

? snake *food_1;

? srand((unsigned)time(NULL));//為了防止每次產(chǎn)生的隨機(jī)數(shù)相同,種子設(shè)置為time

? food_1 = (snake*)malloc(sizeof(snake));

? while ((food_1->x % 2) != 0)? //保證其為偶數(shù),使得食物能與蛇頭對(duì)其

? {

? ? food_1->x = rand() % 52 + 2;

? }

? food_1->y = rand() % 24 + 1;

? q = head;

? while (q->next == NULL)

? {

? ? if (q->x == food_1->x && q->y == food_1->y) //判斷蛇身是否與食物重合

? ? {

? ? ? free(food_1);

? ? ? createFood();

? ? }

? ? q = q->next;

? }

? Pos(food_1->x, food_1->y);

? food = food_1;

? printf("■");

}

void cantCrossWall()//不能穿墻

{

? if (head->x == 0 || head->x == 56 || head->y == 0 || head->y == 26)

? {

? ? endGamestatus = 1;

? ? endGame();

? }

}

void snakeMove()//蛇前進(jìn),上U,下D,左L,右R

{

? snake * nexthead;

? cantCrossWall();

? nexthead = (snake*)malloc(sizeof(snake));

? if (status == U)

? {

? ? nexthead->x = head->x;

? ? nexthead->y = head->y - 1;

? ? if (nexthead->x == food->x && nexthead->y == food->y)//如果下一個(gè)有食物//

? ? {

? ? ? nexthead->next = head;

? ? ? head = nexthead;

? ? ? q = head;

? ? ? while (q != NULL)

? ? ? {

? ? ? ? Pos(q->x, q->y);

? ? ? ? printf("■");

? ? ? ? q = q->next;

? ? ? }

? ? ? score = score + add;

? ? ? createFood();

? ? }

? ? else? ? ? ? ? ? ? ? ? ? ? ? //如果沒有食物//

? ? {

? ? ? nexthead->next = head;

? ? ? head = nexthead;

? ? ? q = head;

? ? ? while (q->next->next != NULL)

? ? ? {

? ? ? ? Pos(q->x, q->y);

? ? ? ? printf("■");

? ? ? ? q = q->next;

? ? ? }

? ? ? Pos(q->next->x, q->next->y);

? ? ? printf(" ");

? ? ? free(q->next);

? ? ? q->next = NULL;

? ? }

? }

? if (status == D)

? {

? ? nexthead->x = head->x;

? ? nexthead->y = head->y + 1;

? ? if (nexthead->x == food->x && nexthead->y == food->y) //有食物

? ? {

? ? ? nexthead->next = head;

? ? ? head = nexthead;

? ? ? q = head;

? ? ? while (q != NULL)

? ? ? {

? ? ? ? Pos(q->x, q->y);

? ? ? ? printf("■");

? ? ? ? q = q->next;

? ? ? }

? ? ? score = score + add;

? ? ? createFood();

? ? }

? ? else? ? ? ? ? ? ? ? //沒有食物

? ? {

? ? ? nexthead->next = head;

? ? ? head = nexthead;

? ? ? q = head;

? ? ? while (q->next->next != NULL)

? ? ? {

? ? ? ? Pos(q->x, q->y);

? ? ? ? printf("■");

? ? ? ? q = q->next;

? ? ? }

? ? ? Pos(q->next->x, q->next->y);

? ? ? printf(" ");

? ? ? free(q->next);

? ? ? q->next = NULL;

? ? }

? }

? if (status == L)

? {

? ? nexthead->x = head->x - 2;

? ? nexthead->y = head->y;

? ? if (nexthead->x == food->x && nexthead->y == food->y)//有食物

? ? {

? ? ? nexthead->next = head;

? ? ? head = nexthead;

? ? ? q = head;

? ? ? while (q != NULL)

? ? ? {

? ? ? ? Pos(q->x, q->y);

? ? ? ? printf("■");

? ? ? ? q = q->next;

? ? ? }

? ? ? score = score + add;

? ? ? createFood();

? ? }

? ? else? ? ? ? ? ? ? ? //沒有食物

? ? {

? ? ? nexthead->next = head;

? ? ? head = nexthead;

? ? ? q = head;

? ? ? while (q->next->next != NULL)

? ? ? {

? ? ? ? Pos(q->x, q->y);

? ? ? ? printf("■");

? ? ? ? q = q->next;

? ? ? }

? ? ? Pos(q->next->x, q->next->y);

? ? ? printf(" ");

? ? ? free(q->next);

? ? ? q->next = NULL;

? ? }

? }

? if (status == R)

? {

? ? nexthead->x = head->x + 2;

? ? nexthead->y = head->y;

? ? if (nexthead->x == food->x && nexthead->y == food->y)//有食物

? ? {

? ? ? nexthead->next = head;

? ? ? head = nexthead;

? ? ? q = head;

? ? ? while (q != NULL)

? ? ? {

? ? ? ? Pos(q->x, q->y);

? ? ? ? printf("■");

? ? ? ? q = q->next;

? ? ? }

? ? ? score = score + add;

? ? ? createFood();

? ? }

? ? else? ? ? ? ? ? ? ? ? ? //沒有食物

? ? {

? ? ? nexthead->next = head;

? ? ? head = nexthead;

? ? ? q = head;

? ? ? while (q->next->next != NULL)

? ? ? {

? ? ? ? Pos(q->x, q->y);

? ? ? ? printf("■");

? ? ? ? q = q->next;

? ? ? }

? ? ? Pos(q->next->x, q->next->y);

? ? ? printf(" ");

? ? ? free(q->next);

? ? ? q->next = NULL;

? ? }

? }

? if (biteSelf() == 1)? ? //判斷是否會(huì)咬到自己

? {

? ? endGamestatus = 2;

? ? endGame();

? }

}

void pause()//暫停

{

? while (1)

? {

? ? Sleep(300);

? ? if (GetAsyncKeyState(VK_SPACE))

? ? {

? ? ? break;

? ? }

? }

}

void runGame()//控制游戲

{

? Pos(64, 15);

? printf("不能穿墻,不能咬到自己\n");

? Pos(64, 16);

? printf("用↑.↓.←.→分別控制蛇的移動(dòng).");

? Pos(64, 17);

? printf("F1 為加速,F(xiàn)2 為減速\n");

? Pos(64, 18);

? printf("ESC :退出游戲.space:暫停游戲.");

? Pos(64, 20);

? printf("C語言研究中心 www.clang.cc");

? status = R;

? while (1)

? {

? ? Pos(64, 10);

? ? printf("得分:%d ", score);

? ? Pos(64, 11);

? ? printf("每個(gè)食物得分:%d分", add);

? ? if (GetAsyncKeyState(VK_UP) && status != D)

? ? {

? ? ? status = U;

? ? }

? ? else if (GetAsyncKeyState(VK_DOWN) && status != U)

? ? {

? ? ? status = D;

? ? }

? ? else if (GetAsyncKeyState(VK_LEFT) && status != R)

? ? {

? ? ? status = L;

? ? }

? ? else if (GetAsyncKeyState(VK_RIGHT) && status != L)

? ? {

? ? ? status = R;

? ? }

? ? else if (GetAsyncKeyState(VK_SPACE))

? ? {

? ? ? pause();

? ? }

? ? else if (GetAsyncKeyState(VK_ESCAPE))

? ? {

? ? ? endGamestatus = 3;

? ? ? break;

? ? }

? ? else if (GetAsyncKeyState(VK_F1))

? ? {

? ? ? if (sleeptime >= 50)

? ? ? {

? ? ? ? sleeptime = sleeptime - 30;

? ? ? ? add = add + 2;

? ? ? ? if (sleeptime == 320)

? ? ? ? {

? ? ? ? ? add = 2;//防止減到1之后再加回來有錯(cuò)

? ? ? ? }

? ? ? }

? ? }

? ? else if (GetAsyncKeyState(VK_F2))

? ? {

? ? ? if (sleeptime<350)

? ? ? {

? ? ? ? sleeptime = sleeptime + 30;

? ? ? ? add = add - 2;

? ? ? ? if (sleeptime == 350)

? ? ? ? {

? ? ? ? ? add = 1; //保證最低分為1

? ? ? ? }

? ? ? }

? ? }

? ? Sleep(sleeptime);

? ? snakeMove();

? }

}

void initGame()//開始界面

{

? Pos(40, 12);

? system("title C語言研究中心? www.clang.cc");

? printf("歡迎來到貪食蛇游戲!");

? Pos(40, 25);

? printf("? ? ? C語言研究中心 www.clang.cc.\n");

? system("pause");

? system("cls");

? Pos(25, 12);

? printf("用↑.↓.←.→分別控制蛇的移動(dòng), F1 為加速,2 為減速\n");

? Pos(25, 13);

? printf("加速將能得到更高的分?jǐn)?shù)。\n");

? system("pause");

? system("cls");

}

void endGame()//結(jié)束游戲

{

? system("cls");

? Pos(24, 12);

? if (endGamestatus == 1)

? {

? ? printf("對(duì)不起,您撞到墻了。游戲結(jié)束.");

? }

? else if (endGamestatus == 2)

? {

? ? printf("對(duì)不起,您咬到自己了。游戲結(jié)束.");

? }

? else if (endGamestatus == 3)

? {

? ? printf("您的已經(jīng)結(jié)束了游戲。");

? }

? Pos(24, 13);

? printf("您的得分是%d\n", score);

? while (getchar() != 'y')

? {

? ? printf("close?[y]");

? }

? exit(0);

}

void gameStart()//游戲初始化

{

? system("mode con cols=100 lines=30");

? initGame();

? creatMap();

? initSnake();

? createFood();

}

int main()

{

? gameStart();

? runGame();

? endGame();

? return 0;

}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助!

學(xué)習(xí)C/C++編程知識(shí),提升C/C++編程能力,歡迎關(guān)注UP一起來成長(zhǎng)!
另外,UP在主頁(yè)上傳了一些學(xué)習(xí)C/C++編程的視頻教程,有興趣或者正在學(xué)習(xí)的小伙伴一定要去看一看哦!會(huì)對(duì)你有幫助的~

C/C++編程筆記:C語言鏈表實(shí)現(xiàn)貪吃蛇游戲,項(xiàng)目源碼分享的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
鄂托克前旗| 永康市| 礼泉县| 卓资县| 南昌县| 贵南县| 灌南县| 富裕县| 临澧县| 龙井市| 泉州市| 永定县| 依兰县| 三穗县| 隆尧县| 峨边| 高尔夫| 双流县| 兴安县| 延津县| 溧阳市| 宁晋县| 华安县| 霍州市| 山丹县| 靖西县| 金坛市| 娄底市| 应城市| 新建县| 县级市| 安义县| 麻城市| 芷江| 石门县| 和平区| 罗山县| 尉犁县| 洪泽县| 吉林省| 江安县|