最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

用c++寫控制臺(tái)貪吃蛇游戲完整步驟

 更新時(shí)間:2025年12月05日 09:46:50   作者:fish_xk  
用C++制作貪吃蛇游戲是一個(gè)經(jīng)典的編程練習(xí),它涉及多個(gè)方面的編程知識(shí),包括數(shù)據(jù)結(jié)構(gòu)、圖形界面、事件處理等,這篇文章主要介紹了用c++寫控制臺(tái)貪吃蛇游戲的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

效果圖

要使用的東西。

1.鏈表,2.結(jié)構(gòu)體,3.系統(tǒng)操作。

創(chuàng)建界面

了解界面的生成和輸入

先本地化環(huán)境用于在控制臺(tái)輸出中文setlocale(LC_ALL, "");要包含#include <locale.h>

要使用 system函數(shù),要包括頭文件windows.h。

void cj() {
    setlocale(LC_ALL, "");  // 設(shè)置本地化環(huán)境
    system("mode con cols=100 lines=40");  // 調(diào)整控制臺(tái)窗口尺寸
    system("pause");  // 防止窗口自動(dòng)關(guān)閉
}

查看光標(biāo)發(fā)現(xiàn)光標(biāo)的長寬不匹配,調(diào)整cols和lines,來判斷那個(gè)是長的。

發(fā)現(xiàn)調(diào)整cols后長變了所以cols是窗口的長。

調(diào)整后發(fā)現(xiàn)2個(gè)長等于一個(gè)寬,所以我們設(shè)置時(shí)要設(shè)置2的倍數(shù)長

設(shè)置我們的游戲界面為25*25,加上邊框長乘2,54*27,再加上提示,36長。湊個(gè)整

100*30.

發(fā)現(xiàn)輸出都從左上角開始,所以需要定位光標(biāo)位置來輸出,后續(xù)的內(nèi)容也要運(yùn)用光標(biāo)的定位,所以我們要定義一個(gè)函數(shù)來表示光標(biāo)定位。

HANDLE houtput = GetStdHandle(STD_OUTPUT_HANDLE);

// 獲取控制臺(tái)輸出句柄
// 使用GetStdHandle(STD_OUTPUT_HANDLE)獲取標(biāo)準(zhǔn)輸出設(shè)備句柄

COORD pos = {x, y};  // 定義光標(biāo)位置坐標(biāo)(左上角為原點(diǎn)(0,0))

SetConsoleCursorPosition(houtput, pos);  // 將光標(biāo)定位到指定坐標(biāo)

void dw(int x, int y) {
    HANDLE houtput = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD pos = {x, y};
    SetConsoleCursorPosition(houtput, pos);
}

構(gòu)建歡迎界面,(簡介版)

dw(40, 15);
wprintf(L"歡迎來到貪吃蛇游戲");//用wprintf來輸出寬字符,L表示后面的是寬字符,如中文等。
dw(40, 16);
system("pause");

到下一個(gè)界面我們要清空當(dāng)前界面。

system("cls");來清空界面

system("cls");  // 清屏操作
dw(40, 16);     // 調(diào)用dw函數(shù),參數(shù)為40和16
system("pause");// 暫停程序執(zhí)行

下一步設(shè)置我們的提示

按W.S.A.D移動(dòng),F(xiàn)4加速,F(xiàn)5減速,space暫停,Esc退出。

定位要的位置輸出數(shù)據(jù),調(diào)整位置讓它 看起居中。

dw(24, 15);
wprintf(L"按W.S.A.D移動(dòng),F(xiàn)4加速,F(xiàn)5減速,space暫停,Esc退出。");
dw(40, 16);
printf("加速能得到更高的分?jǐn)?shù)");
dw(40, 17);
system("pause");

構(gòu)建游戲界面

構(gòu)建蛇的活動(dòng)范圍墻

發(fā)現(xiàn)高度不夠擴(kuò)高一點(diǎn)到40;下移墻,在頂上標(biāo)識(shí)提示詞表明游戲界面。

system("cls");
int i = 0, j = 0;
for (i = 3; i < 30; i++)
{
    dw(0, i);
    for (j = 0; j < 27; j++) {
        if (i == 3 || i == 29 || j == 0 || j == 26)
            wprintf(L"墻");
        else
            wprintf(L"  ");
    }
    printf("\n");
}
dw(14, 1);
wprintf(L"游戲界面");
dw(0, 32);
system("pause");

右邊加入提示詞

dw(60, 6);
wprintf(L"時(shí)間:%.2f", sj);
dw(60, 10);
wprintf(L"不能撞墻,不能碰到自己");
dw(60, 11);
wprintf(L"按W.S.A.D移動(dòng)\n");
dw(60, 12);
wprintf(L"F4加速,F5減速\n");
dw(60, 13);
wprintf(L"space暫停,Esc退出");
dw(60, 14);
wprintf(L"fish_xk制作");

發(fā)現(xiàn)函數(shù)太長了,分別封裝成函數(shù)。

float sj = 0;
void dw(int x, int y) {
    HANDLE houtput = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD pos = { x,y };
    SetConsoleCursorPosition(houtput, pos);
}
void help() {
    dw(60, 6);
    wprintf(L"時(shí)間:%.2f", sj);
    dw(60, 10);
    wprintf(L"不能撞墻,不能碰到自己");
    dw(60, 11);
    wprintf(L"按W.S.A.D移動(dòng)\n");
    dw(60, 12);
    wprintf(L"F4加速,F5減速\n");
    dw(60, 13);
    wprintf(L"space暫停,Esc退出");
    dw(60, 14);
    wprintf(L"fish_xk制作");
    system("pause");
}
void ks() {
    setlocale(LC_ALL, "");
    system("mode con cols=100 lines=40");
    dw(40, 15);
    wprintf(L"歡迎來到貪吃蛇游戲");
    dw(40, 16);
    system("pause");
    system("cls");
}
void zj() {
    dw(24, 15);
    wprintf(L"按W.S.A.D移動(dòng),F(xiàn)4加速,F(xiàn)5減速,space暫停,Esc退出。");
    dw(40, 16);
    printf("加速能得到更高的分?jǐn)?shù)");
    dw(40, 17);
    system("pause");
    system("cls");
}
void yxjm() {
int i = 0, j = 0;
    for (i = 3; i < 30; i++)
    {
        dw(0, i);
        for (j = 0; j < 27; j++) {
            if (i == 3 || i == 29 || j == 0 || j == 26)
                wprintf(L"墻");
            else
                wprintf(L"  ");
        }
        printf("\n");
    }
    dw(22, 1);
    wprintf(L"游戲界面");
    dw(0, 32);
}
void cj() {
    ks();
    zj();
    yxjm();
    help();
}

這樣就完成了所有的界面的制作。

游戲本體

創(chuàng)建蛇

蛇由一個(gè)個(gè)節(jié)點(diǎn)組成,用鏈表來創(chuàng)建。重命名一下方便使用

typedef struct snakebody {
    struct tcs* next;
    int x;
    int y;
}snake,st;

有蛇,有果子,有速度。用一個(gè)結(jié)構(gòu)體來表示。

蛇可以用頭節(jié)點(diǎn)來表示。

果可以看作一個(gè)在外的蛇身。

typedef struct tcs{
    snake* head;
    int v;
    snake* guo;
}tcs;

還要有狀態(tài),方向,總分?jǐn)?shù),單個(gè)果子的權(quán)重。

typedef struct snakebody{
    struct tcs* next;
    int x;
    int y;
}snake;
enum gamezt {
    OK=1,
    FAIL,
    DIE_BYWALL,
    DIE_BYSELF
};
enum snakefx {
    UP = 1,
    DOWN,
    LEFT,
    RIGHT
};
typedef struct tcs{
    snake* head;//蛇
    snake* guo;//果
    int v;//速度
    enum gamezt zt;//狀態(tài)
    enum snakefx fx;//方向
    int food_weight;//單個(gè)分?jǐn)?shù)
    int score;//總分?jǐn)?shù)
}tcs;

初始化一下蛇的身體。

尾插鏈表來初始蛇身

void push(snake**ps,int x,int y) {//插入蛇的節(jié)點(diǎn)
    snake* news = (snake*)malloc(sizeof(snake));//開辟節(jié)點(diǎn)
    news->next = NULL;
    news->x = x;
    news->y = y;
    if (*ps == NULL) {
        *ps = news;
    }
    else
    {
        snake* pos = *ps;
        while (pos->next) {//鏈接到末尾
            pos = pos->next;
        }
        pos->next = news;
    }
}

snake* body = (snake*)malloc(sizeof(snake));
body = NULL;
int i;
for (i = 22; i < 27; i = i + 1) {
    push(&body,22+(i-22)*2, 16);
}
ps->head = body;
print(ps);

void print(snake*ps) {//打印蛇
	assert(ps);
	snake* cur = ps;
	while (cur) {//遍歷鏈表
		dw(cur->x, cur->y);
		wprintf(L"蛇");
		cur = cur->next;
	}
}
tcs* cjsnake() {//返回蛇的頭位置
	tcs*ps = (tcs*)malloc(sizeof(tcs));
	snake* body = (snake*)malloc(sizeof(snake));
	body = NULL;
	int i;
	for (i = 22; i < 27; i = i + 1) {//循環(huán)添加5個(gè)節(jié)點(diǎn)
		push(&body,22+(i-22)*2, 16);
	}
	ps->head = body;
	print(ps->head);//打印開始的蛇身
	cjguo(ps);
	ps->v = 200;
	ps->zt = OK;
	ps->fx = LEFE;
	ps->score = 0;
	ps->food_weight = 10;
	return ps;
}

下一步生成果子,要有隨機(jī)數(shù)要包含#include<time.h>

設(shè)置隨機(jī)數(shù)

srand(time(NULL))

void cjguo(tcs* ps) {
    snake* news = (snake*)malloc(sizeof(snake));
    news->next = NULL;
    snake* cur = ps->head;
    ag:
    news->x = (rand()%25+1+1)*2;//第一個(gè)+1是保證1到25,后一個(gè)+1,是不能是墻
    news->y = (rand() % 25 + 1+4 );
    cur = ps->head;
    while (cur){
        if (cur->x == news->x && cur->y == news->y)//如果和蛇重疊重新生成。
            goto ag;
        cur = cur->next;
    }
    ps->guo = news;
    dw(news->x, news->y);
    wprintf(L"果");//打印果的位置
}

設(shè)置其他數(shù)據(jù)

    ps->v = 200;//速度
    ps->zt = OK;//狀態(tài)
    ps->fx = LEFT;//方向
    ps->score = 0;//成績
    ps->food_weight = 10;//每個(gè)果子的分?jǐn)?shù)

創(chuàng)建完畢

蛇的行走

while (cur->zt == OK) {
dw(60, 6);
wprintf(L"時(shí)間:%.2f秒", sj);
dw(60, 8);
printf("得分:%d", cur->score);
dw(60, 9);
printf("食物分值:%d", cur->food_weight);
snakedong(cur);//行動(dòng)的函數(shù)
sj+=cur->v/1000.0;//行動(dòng)時(shí)間
Sleep(cur->v);//行動(dòng)間隔
}

設(shè)置循環(huán)判斷游戲狀態(tài)??梢栽偌尤霑r(shí)間

設(shè)置程序的休息時(shí)間,來實(shí)現(xiàn)運(yùn)動(dòng)間隔。

要控制程序,需要讀取輸入信息,所以定義一個(gè)讀取的宏

#define KEY_PRESS(vk)   ((GetAsyncKeyState(vk)&1)?1:0)

讀取一個(gè)虛擬鍵盤值,判斷是否按過。

if (KEY_PRESS(0x53) && snake->fx != UP) {//識(shí)別W
	snake->fx = DOWN;
}
else if (KEY_PRESS(0x57) && snake->fx != DOWN) {//識(shí)別S
	snake->fx = UP;
}
else if (KEY_PRESS(0x41) && snake->fx != RIGHT) {//識(shí)別A
	snake->fx = LEFE;
}
else if (KEY_PRESS(0x44) && snake->fx != LEFE) {//識(shí)別B
	snake->fx = RIGHT;
}
else if (KEY_PRESS(VK_SPACE)) {//識(shí)別空格
	while (1) {
		Sleep(200);
		if (KEY_PRESS(VK_SPACE)) {//循環(huán)停止游戲
			break;
		}
	}
}
else if (KEY_PRESS(VK_ESCAPE)) {//識(shí)別ESC
	snake->zt = END_NORMAL;
}
else if (KEY_PRESS(VK_F4)) {//識(shí)別F4
	snake->v = snake->v - 10;
	snake->food_weight = snake->food_weight + 5;
}
else if (KEY_PRESS(VK_F5)) {//識(shí)別F5
	snake->v = snake->v + 10;
	snake->food_weight = snake->food_weight - 5;
}

加入一個(gè)全局變量防止加速過頭

根據(jù)蛇的方向來改變蛇的身體坐標(biāo)

snake* toupush(snake*ps,int x,int y) {//插入頭部,到達(dá)的節(jié)點(diǎn)
	snake* news = (snake*)malloc(sizeof(snake));
	news->next = ps;
	news->x = x;
	news->y = y;
	dw(news->x, news->y);
	wprintf(L"蛇");
	ps = news;
	return ps;
}
snake* pop(snake* ps) {//沒吃到果子,刪除多出來的節(jié)點(diǎn)
	snake* tail = ps;
	while (tail->next->next) {
		tail = tail->next;
	}
	dw(tail->next->x, tail->next->y);
	wprintf(L"  ");
	free(tail->next);
	tail->next = NULL;
	return ps;
}
if (snake->fx == UP) {//向上
	snake->head=toupush(snake->head, snake->head->x, snake->head->y - 1);
}
else if (snake->fx == DOWN) {//向下
	snake->head=toupush(snake->head, snake->head->x, snake->head->y + 1);
}
else if (snake->fx == LEFE) {//向左
	snake->head=toupush(snake->head, snake->head->x-2, snake->head->y );
}
else if (snake->fx == RIGHT) {//向右
	snake->head=toupush(snake->head, snake->head->x+2, snake->head->y );
}
if (snake->head->x != snake->guo->x || snake->head->y != snake->guo->y)//是否吃到果子
	snake->head=pop(snake->head);//沒吃到,刪除尾節(jié)點(diǎn)
else {
	free(snake->guo);//釋放果子的節(jié)點(diǎn)
	snake->guo = NULL;
	cjguo(snake);//重新生成果子
	snake->score += snake->food_weight;//加分
}

吃到果子就不刪尾,分?jǐn)?shù)加權(quán)重,沒吃到就刪尾。

編寫失敗條件。

if (snake->head->x == 0 || snake->head->x == 52 || snake->head->y == 4 || snake->head->y == 29)//到達(dá)墻體
	snake->zt = DIE_BYWALL;//改變狀態(tài)
st* self = snake->head->next;
	while (self) {//遍歷自身,看是否相交
		if (snake->head->x == self->x && snake->head->y == self->y)
			snake->zt = DIE_BYSELF;//如相交更新狀態(tài)
		self = self->next;
	}

結(jié)束后輸出分?jǐn)?shù)

system("cls");
dw(40, 15);
if (cur->zt == DIE_BYSELF)
	wprintf(L"失敗于撞到自己");
if (cur->zt == DIE_BYWALL)
	wprintf(L"失敗于撞墻");
if (cur->zt == END_NORMAL)
	wprintf(L"正常退出");
dw(40, 16);
wprintf(L"你堅(jiān)持的時(shí)間是%.2f秒", sj);
dw(40, 17);
wprintf(L"你的得分是%d",cur->score);

隱藏光標(biāo)

void gbyc() {
	//獲取標(biāo)準(zhǔn)輸出設(shè)備的句柄;
	HANDLE houtput = GetStdHandle(STD_OUTPUT_HANDLE);
	//定義一個(gè)光標(biāo)結(jié)構(gòu)體
	CONSOLE_CURSOR_INFO cursor_info = { 0 };
	//獲取houtput句柄相關(guān)的控制臺(tái)上的光標(biāo)信息,存放cursor_info
	GetConsoleCursorInfo(houtput, &cursor_info);
	//設(shè)置吧光標(biāo)的占比
	cursor_info.bVisible = false;//光標(biāo)消失
	//設(shè)置和houtput句柄相關(guān)的控制臺(tái)的光標(biāo)信息
	SetConsoleCursorInfo(houtput, &cursor_info);
}
void ck() {
	//創(chuàng)建窗口
	setlocale(LC_ALL, "");
	COORD pos = { 0,0 };
	system("mode con cols=100 lines=40");
	system("title.貪吃蛇");
	gbyc();
	//打印開始界面
}

到這里已經(jīng)全部完成了。

總結(jié)

到此這篇關(guān)于用c++寫控制臺(tái)貪吃蛇游戲完整步驟的文章就介紹到這了,更多相關(guān)c++寫控制臺(tái)貪吃蛇內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

宁明县| 武夷山市| 囊谦县| 静宁县| 农安县| 衡南县| 大宁县| 蕲春县| 德昌县| 淄博市| 韩城市| 淮南市| 莱州市| 托里县| 康保县| 大兴区| 保靖县| 亳州市| 平邑县| 鄂托克前旗| 镇赉县| 望都县| 枣阳市| 泰来县| 兴和县| 赤城县| 天峻县| 云和县| 花莲市| 桂平市| 托里县| 长寿区| 桃园县| 渝中区| 奉化市| 固原市| 龙胜| 双鸭山市| 清徐县| 罗田县| 凤阳县|