国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

在控制臺(tái)實(shí)現(xiàn)貪吃蛇

這篇具有很好參考價(jià)值的文章主要介紹了在控制臺(tái)實(shí)現(xiàn)貪吃蛇。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。


本文通過C語言在Windows環(huán)境下的控制臺(tái)實(shí)現(xiàn)貪吃蛇小游戲,實(shí)現(xiàn)的基本功能包括地圖的繪制,蛇的移動(dòng)(這個(gè)過程到底是吃到食物還是沒有吃到食物),以及貪吃蛇是否撞墻,或撞到自身,通過貪吃蛇是否吃到食物來計(jì)算當(dāng)前的得分,還將實(shí)現(xiàn)加速減速的功能以及暫停游戲的功能

前備知識(shí)

這部分主要介紹實(shí)現(xiàn)貪吃蛇小游戲中所使用的Win32API。需要注意使用這些API需要包含頭文件Windows.h

Win32API

由于本游戲是在Windows系統(tǒng)下的控制臺(tái)中進(jìn)行的,所以需要用到一些win32API,Windows 這個(gè)多作業(yè)系統(tǒng)除了協(xié)調(diào)應(yīng)用程序的執(zhí)行、分配內(nèi)存、管理資源之外, 它同時(shí)也是?個(gè)很大的服務(wù)中心,調(diào)用這個(gè)服務(wù)中心的各種服務(wù)(每?種服務(wù)就是?個(gè)函數(shù)),可以幫應(yīng)用程序達(dá)到開啟
視窗、描繪圖形、使用周邊設(shè)備等目的,由于這些函數(shù)服務(wù)的對(duì)象是應(yīng)用程序(Application), 所以便稱之為 Application Programming Interface,簡(jiǎn)稱 API 函數(shù)。WIN32 API也就是Microsoft Windows32位平臺(tái)的應(yīng)用程序編程接口。

COORD這個(gè)結(jié)構(gòu)體的聲明如下:

typedef struct _COORD {
  SHORT X;
  SHORT Y;
} COORD, *PCOORD;

在控制臺(tái)實(shí)現(xiàn)貪吃蛇,C語言,c語言,游戲
可通過一下的形式給COORD類型的變量進(jìn)行賦值

COORD pos={15,20}

GetStdHandle 函數(shù)

GetStdHandle是?個(gè)Windows API函數(shù)。它?于從?個(gè)特定的標(biāo)準(zhǔn)設(shè)備(標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出或標(biāo)準(zhǔn)錯(cuò)誤)中取得?個(gè)句柄(用來標(biāo)識(shí)不同設(shè)備的數(shù)值),使用這個(gè)句柄可以操作設(shè)備。檢索指定標(biāo)準(zhǔn)設(shè)備的句柄(標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出或標(biāo)準(zhǔn)錯(cuò)誤)。

HANDLE WINAPI GetStdHandle(_In_ DWORD nStdHandle);

在控制臺(tái)實(shí)現(xiàn)貪吃蛇,C語言,c語言,游戲
對(duì)于我們實(shí)現(xiàn)的這個(gè)貪吃蛇來說,我們需要的輸出設(shè)備,在貪吃蛇中使用的方式如下:

HANDLE houtput GetStdHandle(STD_OUTPUT_HANDLE);

GetConsoleCursorInfo 函數(shù)

檢索有關(guān)指定控制臺(tái)屏幕緩沖區(qū)的游標(biāo)大小和可見性的信息。

BOOL WINAPI GetConsoleCursorInfo(_In_  HANDLE  hConsoleOutput, _Out_ PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
);

使用示例:

HANDLE houtput = GetStdHandle(STD_OUTPUT_HANDLE);//獲得輸出設(shè)備的句柄
CONSOLE_CURSOR_INFO curserinfo;
GetConsoleCursorInfo(houtput,&curserinfo)//從輸出中句柄中獲得光標(biāo)的信息,將信息存放在curserinfo中

CONSOLE_CURSOR_INFO 結(jié)構(gòu)體形式如下:
在控制臺(tái)實(shí)現(xiàn)貪吃蛇,C語言,c語言,游戲
dwSize
由游標(biāo)填充的字符單元的百分比。 該值介于 1 到 100 之間。 游標(biāo)外觀各不相同,范圍從完全填充單元到顯示為單元底部的橫線。
bVisible
游標(biāo)的可見性。 如果游標(biāo)可見,則此成員為 TRUE。

SetConsoleCursorInfo 函數(shù)

為指定的控制臺(tái)屏幕緩沖區(qū)設(shè)置光標(biāo)的大小和可見性。
在控制臺(tái)實(shí)現(xiàn)貪吃蛇,C語言,c語言,游戲
示例:

HANDLE houtput = GetStdHandle(STD_OUTPUT_HANDLE);
//隱藏光標(biāo)操作
CONSOLE_CURSOR_INFO CursorInfo;
GetConsoleCursorInfo(houtput, &CursorInfo);//獲取控制臺(tái)光標(biāo)信息
CursorInfo.bVisible = false; //隱藏控制臺(tái)光標(biāo)
SetConsoleCursorInfo(hOutput, &CursorInfo);//設(shè)置控制臺(tái)光標(biāo)狀態(tài)

SetConsoleCursorPosition 函數(shù)

設(shè)置指定控制臺(tái)屏幕緩沖區(qū)中的光標(biāo)位置。
在控制臺(tái)實(shí)現(xiàn)貪吃蛇,C語言,c語言,游戲

COORD pos = { 10, 5};
HANDLE hOutput = NULL;
//獲取標(biāo)準(zhǔn)輸出的句柄(?來標(biāo)識(shí)不同設(shè)備的數(shù)值)
houtput = GetStdHandle(STD_OUTPUT_HANDLE);
//設(shè)置標(biāo)準(zhǔn)輸出上光標(biāo)的位置為pos
SetConsoleCursorPosition(hOutput, pos);

由于在貪吃蛇中,我們需要在屏幕上不斷打印,所以我們需要不斷的調(diào)整光標(biāo)位置,因此我們根據(jù)SetConsoleCursorPosition 函數(shù)寫一個(gè)調(diào)整屏幕光標(biāo)位置的函數(shù)。

void setpos(short x,short y)
{
	//首先需要獲得輸出設(shè)備的句柄
	HANDLE houtpot=GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos={x,y};
	//設(shè)置光標(biāo)位置
	SetConsoleCursorPosition(houtpot,pos);
}

getAsyncKeyState 函數(shù)

GetAsyncKeyState 的返回值是short類型,在上?次調(diào)用 GetAsyncKeyState 函數(shù)后,如果返回的16位的short數(shù)據(jù)中,最高位是1,說明按鍵的狀態(tài)是按下,如果最高是0,說明按鍵的狀態(tài)是抬起;如果最低位被置為1則說明,該按鍵被按過,否則為0。 如果我們要判斷?個(gè)鍵是否被按過,可以檢測(cè)GetAsyncKeyState返回值的最低值是否為1。
在貪吃蛇中我們定義一個(gè)宏來確定一個(gè)鍵是否被按下,VK表示的是虛擬鍵值

#define KEY_PRESS(VK) ( (GetAsyncKeyState(VK) & 0x1) ? 1 : 0 )

控制臺(tái)窗口的大小以及字符打印介紹

可以使用cmd命令來設(shè)置控制臺(tái)窗口的長(zhǎng)寬:比如設(shè)計(jì)控制臺(tái)窗口的大小30行,100列,可以在控制臺(tái)窗口輸入以下指令:

mode con cols=100 lines=30

通過一下指令設(shè)置控制臺(tái)窗口的名字:

title snack

以上兩個(gè)控制臺(tái)命令可在控制臺(tái)窗口執(zhí)行,也可在C語言中通過system函數(shù)來執(zhí)行

#include<stdio.h>
int main()
{
	system("mode con cols=100 lines=30");
	system("title snack");
	getchar();
	return 0;
}

在控制臺(tái)實(shí)現(xiàn)貪吃蛇,C語言,c語言,游戲
往system函數(shù)傳入上面的指令,可以實(shí)現(xiàn)窗口大小的調(diào)整以及控制臺(tái)名字的改變。加入getchar這個(gè)的函數(shù)的目的是為了讓程序停下來,以使得能夠看見當(dāng)前的效果,不然程序結(jié)束窗口的名字還是會(huì)變成原來的名字。

控制臺(tái)中的坐標(biāo)

COORD是Windows API中定義的一個(gè)結(jié)構(gòu)體,這個(gè)結(jié)構(gòu)體表示在控制臺(tái)屏幕緩沖區(qū)上的坐標(biāo),坐標(biāo)系(0,0)表示緩沖區(qū)頂部左側(cè)單元格。
在控制臺(tái)實(shí)現(xiàn)貪吃蛇,C語言,c語言,游戲在控制臺(tái)實(shí)現(xiàn)貪吃蛇,C語言,c語言,游戲

寬字符及本地化介紹

打印蛇使用寬字符■,打印食物使用寬字符◆,打印墻體使用寬字符□,普通的字符是占?個(gè)字節(jié)的,這類寬字符是占用2個(gè)字節(jié)。為了使C語言適應(yīng)國(guó)際化,C語言的標(biāo)準(zhǔn)中不斷加入了國(guó)際化的支持。比如:加入了寬字符的類型wchar_t 和寬字符的輸?和輸出函數(shù),加入了<locale.h>頭文件,其中提供了允許程序員針對(duì)特定地區(qū)(通常是國(guó)家或者說某種特定語言的地理區(qū)域)調(diào)整程序行為的函數(shù)。
在控制臺(tái)實(shí)現(xiàn)貪吃蛇,C語言,c語言,游戲
通過修改地區(qū),程序可以改變它的行為來適應(yīng)世界的不同區(qū)域。但地區(qū)的改變可能會(huì)影響庫(kù)的許多部
分,其中?部分可能是我們不希望修改的。所以C語言支持針對(duì)不同的類項(xiàng)進(jìn)行修改,下?的?個(gè)宏,
指定?個(gè)類項(xiàng):
? LC_COLLATE:影響字符串比較函數(shù) strcoll() 和 strxfrm() 。
? LC_CTYPE:影響字符處理函數(shù)的行為。
? LC_MONETARY:影響貨幣格式。
? LC_NUMERIC:影響 printf() 的數(shù)字格式。
? LC_TIME:影響時(shí)間格式 strftime() 和 wcsftime() 。
? LC_ALL - 針對(duì)所有類項(xiàng)修改,將以上所有類別設(shè)置為給定的語言環(huán)境。

setlocale 函數(shù)介紹:

在控制臺(tái)實(shí)現(xiàn)貪吃蛇,C語言,c語言,游戲setlocale 函數(shù)用于修改當(dāng)前地區(qū),可以針對(duì)?個(gè)類項(xiàng)修改,也可以針對(duì)所有類項(xiàng)。 setlocale 的第?個(gè)參數(shù)可以是前?說明的類項(xiàng)中的?個(gè),那么每次只會(huì)影響?個(gè)類項(xiàng),如果第?個(gè)參數(shù)是LC_ALL,就會(huì)影響所有的類項(xiàng)。 C標(biāo)準(zhǔn)給第?個(gè)參數(shù)僅定義了2種可能取值:“C”(正常模式)和" "(本地模式)。在C語言程序執(zhí)行開始前都會(huì)執(zhí)行下面語句:

setlocale(LC_ALL, "C");

當(dāng)?shù)貐^(qū)設(shè)置為"C"時(shí),庫(kù)函數(shù)按正常?式執(zhí)行。
當(dāng)程序運(yùn)行起來后想改變地區(qū),就只能顯示調(diào)?setlocale函數(shù)。用" "作為第2個(gè)參數(shù),調(diào)用setlocale
函數(shù)就可以切換到本地模式,這種模式下程序會(huì)適應(yīng)本地環(huán)境。
比如:切換到我們的本地模式后就支持寬字符(漢字)的輸出等。

setlocale(LC_ALL, "");//切換到本地環(huán)境

寬字符打印

如果想在控制臺(tái)屏幕上打印寬字符,首先需要進(jìn)行本地化設(shè)置,在寬字符前需要加上L,不然C語言會(huì)將其當(dāng)成窄字符處理,寬字符的打印用wprintf函數(shù),打印單個(gè)寬字符所用的占位符為**%lc**,打印寬字符串所用的占位符是**%ls**。
示例:

wprintf(L"%ls","歡迎來到貪吃蛇小游戲\n");

?個(gè)普通字符占?個(gè)字符的位置但是打印?個(gè)漢字字符,占用2個(gè)字符的位置(在屏幕上就是行占用2個(gè)字符,也就是2個(gè)坐標(biāo))。屏幕上打印的蛇,食物以及相應(yīng)的提示信息都是寬字符,所以我們需要計(jì)算一下這個(gè)控制臺(tái)屏幕上的坐標(biāo)。本文介紹的貪吃蛇小游戲使用的是58列,27行。由于坐標(biāo)是從0開始算的,所以x的坐標(biāo)范圍為[0,57],y的坐標(biāo)范圍為[0,26]。我們通過在這個(gè)范圍的邊界四周設(shè)置墻體,所以對(duì)于食物x坐標(biāo)范圍為[2,54],y坐標(biāo)為[1,25]。食物隨機(jī)創(chuàng)建的位置不能和蛇身重合也不能出現(xiàn)在墻上。由于蛇身的打印或食物的打印都是用寬字符,所以蛇身和食物的橫坐標(biāo)x需要是2的倍數(shù),否則顯示會(huì)出現(xiàn)問題。

貪吃蛇的實(shí)現(xiàn)

貪吃蛇的實(shí)現(xiàn)分為三個(gè)部分,其大邏輯是游戲的開始,游戲的運(yùn)行以及游戲的結(jié)束。在游戲的開始需要對(duì)游戲進(jìn)行初始化之類的,這包括窗口大小的調(diào)整,窗口的名字,以及控制臺(tái)屏幕光標(biāo)的隱藏,歡迎界面,貪吃蛇地圖的繪制,蛇和食物創(chuàng)建及初始化。
在游戲運(yùn)行中,需要判斷是否按過相應(yīng)的控制鍵(在這個(gè)小游戲的設(shè)置中我們使用↑.↓.←.→.來控制蛇的移動(dòng),F3為加速,F4為減速),并且加速將能獲得更高的分?jǐn)?shù),減速獲得的分?jǐn)?shù)更少。在游戲的結(jié)束,需要對(duì)貪吃蛇小游戲中的參數(shù)進(jìn)行處理,如釋放動(dòng)態(tài)開辟的蛇的節(jié)點(diǎn),以及食物等。

貪吃蛇結(jié)構(gòu)的定義

貪吃蛇的實(shí)現(xiàn)是用鏈表來實(shí)現(xiàn)的,其結(jié)構(gòu)如下:

//定義一個(gè)蛇的節(jié)點(diǎn),食物的節(jié)點(diǎn)也和這是一樣的
typedef struct snacknode
{
	short x;
	short y;
	struct snacknode* next;
}snacknode;

貪吃蛇小游戲需要定義一個(gè)枚舉類型來表示當(dāng)前游戲的狀態(tài),如下:

typedef enum state
{
	//正常進(jìn)行
	Normal,
	//撞墻
	Kill_by_wall,
	//撞到自己
	Kill_by_self,
	//正常退出
	Normal_exit
}state;

通過這幾種狀態(tài)來表示當(dāng)前游戲的狀態(tài)。
對(duì)于貪吃蛇的移動(dòng)的方向也需要進(jìn)行定義,我們也采用枚舉來進(jìn)行定義,如下:

//蛇移動(dòng)的方向
typedef enum direction
{
	//向上移動(dòng)
	Up,
	//向下移動(dòng)
	Down,
	//向左移動(dòng)
	Left,
	//向右移動(dòng)
	Right
}direction;

光有上面還是不行,如果進(jìn)行傳參的話參數(shù)量太多,所以我們將這個(gè)貪吃蛇小游戲的參數(shù)都放到一個(gè)結(jié)構(gòu)體中,如下:

//定義貪吃蛇整個(gè)數(shù)據(jù),其中包括蛇頭,食物,游戲狀態(tài),食物的分?jǐn)?shù),當(dāng)前的得分,蛇移動(dòng)的方向,加速減速(這個(gè)其實(shí)就是睡眠時(shí)間)
typedef struct snack
{
	snacknode* snackhead;//蛇頭
	snacknode* food;//食物
	state snack_state;//游戲狀態(tài)
	int food_score;//當(dāng)前食物的分?jǐn)?shù)
	int total_score;//當(dāng)前的得分
	int sleep_time;//通過sleep_time的長(zhǎng)短來控制蛇的移動(dòng)速度
	direction dir;//蛇移動(dòng)的方向
}snack;

GameStart函數(shù)

這個(gè)是游戲開始函數(shù),需要對(duì)對(duì)蛇的參數(shù)進(jìn)行初始化以及打印相應(yīng)的提示信息。
在游戲開始的時(shí)候,我們需要將控制臺(tái)窗口的名字改為snack,并且調(diào)整窗口大小為30行100列,為了更好的顯示我們還需要對(duì)控制臺(tái)窗口的光標(biāo)進(jìn)行隱藏。這些完成之后需要打印歡迎界面,以及打印貪吃蛇小游戲的地圖,并且初始化蛇的狀態(tài),打印蛇以及食物。

//游戲開始
void GameStart(snack* s)
{
	//設(shè)置窗口大小,設(shè)置窗口名字
	system("mode con cols=100 lines=30");
	system("title snack");
	//獲取控制臺(tái)的句柄
	HANDLE houtput = GetStdHandle(STD_OUTPUT_HANDLE);
	CONSOLE_CURSOR_INFO curserinfo;
	//通過句柄獲取控制臺(tái)中的光標(biāo)
	GetConsoleCursorInfo(houtput, &curserinfo);//從句柄中獲取鼠標(biāo)的信息,將這個(gè)信息存儲(chǔ)到curseinfo中
	curserinfo.bVisible = false;
	//將光標(biāo)隱藏
	SetConsoleCursorInfo(houtput, &curserinfo);
	//打印歡迎界面
	Welcomeshow();
	//打印地圖
	Mapshow();
	//初始化蛇
	Initsnack(s);
	//打印蛇和食物
	Showsnack(s);
	Showfood(s);
}

Welcomeshow函數(shù)(歡迎界面)

歡迎界面的打印,需要將光標(biāo)設(shè)置到合適的位置,其代碼如下:

//打印歡迎界面
void Welcomeshow()
{
	setpos(40, 15);
	wprintf(L"歡迎來到貪吃蛇小游戲\n");
	setpos(43, 25);//用來控制 請(qǐng)按任意鍵繼續(xù). . .這個(gè)字符打印的位置
	system("pause");
	system("cls");
	setpos(25, 15);
	wprintf(L"用↑.↓.←.→.來控制蛇的移動(dòng),F3為加速,F4為減速\n");
	setpos(43, 25);//用來控制 請(qǐng)按任意鍵繼續(xù). . .這個(gè)字符打印的位置
	system("pause");
	system("cls");
	setpos(40, 15);
	wprintf(L"加速將能獲得更高的分?jǐn)?shù)\n");
	setpos(43, 25);//用來控制 請(qǐng)按任意鍵繼續(xù). . .這個(gè)字符打印的位置
	system("pause");
	system("cls");
}

Mapshow函數(shù)(地圖打?。?/h4>

這個(gè)函數(shù)的實(shí)現(xiàn)也需要將光標(biāo)的位置放到合適的位置,由于我們實(shí)現(xiàn)的是27行,58列的地圖,而地圖的的字符也是用寬字符□打印的(占兩個(gè)字節(jié)),所以打印上和下的時(shí)候每次i都加2需要注意邊界條件。雖說是27行,58列的地圖但對(duì)于打印上,其x坐標(biāo)為0到56,y坐標(biāo)為0。對(duì)于打印下需要注意x坐標(biāo)為0到56,y坐標(biāo)為26。對(duì)于打印左,x坐標(biāo)為0,y坐標(biāo)為1到25(為什么不是0到26呢?這是由于前面打印上和下的時(shí)候已經(jīng)打印過了)。對(duì)于打印右,x坐標(biāo)為56,y坐標(biāo)為0到25(為什么不是0到26呢?這是由于前面打印上和下的時(shí)候已經(jīng)打印過了)。

#define snackprint L"■"//蛇打印的樣式
#define foodprint L"◆"//食物打印的樣式
#define wallprint L'□'//墻體打印的樣式
//打印地圖,創(chuàng)建27行,58列的地圖
void Mapshow()
{
	//打印上
	int i = 0;
	for (i = 0; i < 58; i+=2)
	{
		setpos(i, 0);
		wprintf(L"%lc", wallprint);
	}
	//打印下
	for (i = 0; i < 58; i += 2)
	{
		setpos(i, 26);
		wprintf(L"%lc", wallprint);
	}
	//打印左
	for (i = 1; i < 26; i++)
	{
		setpos(0, i);
		wprintf(L"%lc", wallprint);
	}
	//打印右
	for (i = 1; i < 26; i++)
	{
		setpos(56, i);
		wprintf(L"%lc", wallprint);
	}
	setpos(40,27);
}

Initsnack初始化

貪吃蛇節(jié)點(diǎn)的底層是鏈表,我們?cè)谧铋_始的時(shí)候創(chuàng)建5個(gè)節(jié)點(diǎn)表示貪吃蛇的初試長(zhǎng)度,貪吃蛇的最開始的方向是朝右行駛的,在這個(gè)初試化的時(shí)候還需要?jiǎng)?chuàng)建食物(食物的位置不能和擋槍蛇的節(jié)點(diǎn)重疊只能出現(xiàn)在墻體內(nèi))

#define POS_X 24//蛇初試的x坐標(biāo)
#define POS_Y 5//蛇初試的y坐標(biāo)
//初始化蛇以及狀態(tài),最開始蛇身為5
void Initsnack(snack* s)
{
	s->snackhead = NULL;
	//創(chuàng)建蛇的鏈表
	for (int i = 0; i < 5; i++)
	{
		snacknode* newnode = (snacknode*)malloc(sizeof(snacknode));//創(chuàng)建蛇節(jié)點(diǎn)
		if (newnode == NULL)
		{
			perror("Initsnack->malloc");
			return;
		}
		newnode->next = s->snackhead;
		s->snackhead = newnode;
		newnode->x = POS_X + i * 2;
		newnode->y = POS_Y;
	}
	//創(chuàng)建食物
	CreatFood(s);
	//初始化狀態(tài)
	s->dir = Right;
	s->sleep_time = 300;
	s->snack_state = Normal;
	s->food_score = 10;
}
CreatFood函數(shù)(創(chuàng)建食物)
void CreatFood(snack* s)
{
	snacknode* food = (snacknode*)malloc(sizeof(snacknode));
	if (food == NULL)
	{
		perror("CreatFood->malloc");
		return;
	}
	short x;
	short y;
again:
	do
	{
		x = rand() % 53 + 2;
		y = rand() % 25 + 1;
	} while (x % 2 != 0);
	//此時(shí)x的坐標(biāo)滿足是2的倍數(shù)
	//現(xiàn)在還需要滿足生成的食物不是蛇的身體或蛇頭
	snacknode* cur = s->snackhead;
	while (cur)
	{
		if (cur->x == x && cur->y == y)
		{
			//表示與蛇身重疊了,跳到前面生成隨機(jī)坐標(biāo),繼續(xù)生成
			goto again;
		}
		cur = cur->next;
	}
	//此時(shí)表示食物生成成功
	food->x = x;
	food->y = y;
	s->food = food;
}

貪吃蛇和食物的打印

//打印蛇
void Showsnack(snack* s)
{
	snacknode* cur = s->snackhead;
	//打印蛇
	while (cur)
	{
		setpos(cur->x, cur->y);
		wprintf(snackprint);
		cur = cur->next;
	}
}
//打印食物
void Showfood(snack* s)
{
	snacknode* cur = s->food;
	setpos(cur->x, cur->y);
	wprintf(foodprint);
}

GameRun函數(shù)

這個(gè)函數(shù)主要是完成游戲運(yùn)行的邏輯,首先需要打印相應(yīng)的提示信息,然后需要檢測(cè)是否有相應(yīng)的功能鍵按下,如果有相應(yīng)的鍵按下需要修改貪吃蛇相應(yīng)的參數(shù)。由于程序運(yùn)行的很快,為了能夠看到效果所以需要用Sleep這個(gè)函數(shù)來對(duì)其進(jìn)行休眠來體現(xiàn)視覺效果,同時(shí)這個(gè)Sleep函數(shù)也間接性地控制了貪吃蛇移動(dòng)的速度。然后便是蛇的移動(dòng)的函數(shù)了。最后就是kill函數(shù)來判斷蛇是否還是正常的狀態(tài),其實(shí)可以將這個(gè)函數(shù)理解為每次蛇走完看是否是正常的狀態(tài)。代碼如下:

//游戲運(yùn)行
void GameRun(snack* s)
{
	do
	{
		Printhelpinfo(s);
		//檢測(cè)是否有相應(yīng)的功能鍵按下
		if (KEY_PRESS(VK_UP) && s->dir != Down)
		{
			s->dir = Up;
		}
		else if (KEY_PRESS(VK_DOWN) && s->dir != Up)
		{
			s->dir = Down;
		}
		else if (KEY_PRESS(VK_LEFT) && s->dir != Right)
		{
			s->dir = Left;
		}
		else if (KEY_PRESS(VK_RIGHT) && s->dir != Left)
		{
			s->dir = Right;
		}
		else if (KEY_PRESS(VK_SPACE))
		{
			stop();
		}
		else if (KEY_PRESS(VK_ESCAPE))
		{
			s->snack_state = Normal_exit;
			break;
		}
		else if (KEY_PRESS(VK_F3))//加速
		{
			if (s->sleep_time > 100)
			{
				s->sleep_time -= 50;
				s->food_score += 2;
			}
		}
		else if (KEY_PRESS(VK_F4))//減速
		{
			if (s->food_score > 2)
			{
				s->sleep_time += 50;
				s->food_score -= 2;
			}
		}
		Sleep(s->sleep_time);
		//蛇的移動(dòng)
		snackmove(s);
		//判斷蛇是否撞墻或撞到自己
		kill(s);
	} while (s->snack_state == Normal);//正常模式就繼續(xù)
}

snackmove函數(shù)(貪吃蛇移動(dòng))

貪吃蛇的移動(dòng)其實(shí)就是根據(jù)當(dāng)前貪吃蛇移動(dòng)方向,算出貪吃蛇蛇移動(dòng)到下一個(gè)節(jié)點(diǎn)的位置,不管下一個(gè)位置是不是食物都將下一個(gè)節(jié)點(diǎn)的結(jié)構(gòu)體snacknode給創(chuàng)建出來,然后將下一個(gè)節(jié)點(diǎn)的坐標(biāo)給這個(gè)節(jié)點(diǎn),如果下一個(gè)位置是食物則將該位置變?yōu)樾碌纳哳^。如果不是食物依然將這個(gè)位置變?yōu)樯哳^,但最后一個(gè)位置不打印并且將最后一個(gè)位置的節(jié)點(diǎn)給釋放點(diǎn)。代碼如下:

//蛇的移動(dòng)
void snackmove(snack* s)
{
	snacknode* next = (snacknode*)malloc(sizeof(snacknode));
	if (next == NULL)
	{
		perror("snackmove->malloc");
		return;
	}
	if (s->dir == Up)
	{
		next->x = s->snackhead->x;
		next->y = s->snackhead->y - 1;
	}
	else if (s->dir == Down)
	{
		next->x = s->snackhead->x;
		next->y = s->snackhead->y + 1;
	}
	else if (s->dir == Left)
	{
		next->x = s->snackhead->x-2;
		next->y = s->snackhead->y;
	}
	else if (s->dir == Right)
	{
		next->x = s->snackhead->x+2;
		next->y = s->snackhead->y;
	}
	//蛇的下一個(gè)位置是食物
	if (next_is_food(s,next))
	{
		next->next = s->snackhead;
		s->snackhead = next;
		snacknode* snacktail = s->snackhead;
		while (snacktail!= NULL)
		{
			setpos(snacktail->x, snacktail->y);
			wprintf(snackprint);
			snacktail = snacktail->next;
		}
		free(s->food);//將食物節(jié)點(diǎn)釋放掉
		s->food = NULL;
		s->total_score += s->food_score;
		CreatFood(s);//創(chuàng)建新食物
		Showfood(s);
	}
	//蛇的下一個(gè)位置不是食物
	else
	{
		next->next = s->snackhead;
		s->snackhead = next;
		snacknode* snacktailpre = s->snackhead;
		while (snacktailpre->next->next != NULL)
		{
			setpos(snacktailpre->x, snacktailpre->y);
			wprintf(snackprint);
			snacktailpre = snacktailpre->next;
		}
		setpos(snacktailpre->x, snacktailpre->y);
		wprintf(snackprint);
		snacknode* del = snacktailpre->next;//釋放蛇的尾節(jié)點(diǎn)
		snacktailpre->next = NULL;
		setpos(del->x, del->y);
		printf("  ");
		free(del);
		del = NULL;
	}
}
next_is_food函數(shù)
//判斷下一個(gè)節(jié)點(diǎn)是否是食物,蛇移動(dòng)的下一個(gè)節(jié)點(diǎn)為食物就返回true,否則返回false
bool next_is_food(snack* s, snacknode* next)
{
	if (s->food->x == next->x && s->food->y == next->y)
	{
		return true;
	}
	return false;
}

kill函數(shù)(判斷蛇的狀態(tài))

//撞到自己或撞到墻
void kill(snack* s)
{
	//首先判斷是否撞到自己
	snacknode* head = s->snackhead;
	snacknode* cur = s->snackhead->next;
	while (cur)
	{
		if (cur->x == head->x && cur->y == head->y)
		{
			//將狀態(tài)設(shè)置成Kill_by_self
			s->snack_state = Kill_by_self;
			return;
		}
		cur = cur->next;
	}
	if (head->x == 0 || head->x == 56 || head->y == 0 || head->y == 26)
	{
		s->snack_state = Kill_by_wall;
	}
}

GameEnd函數(shù)

該函數(shù)是用來處理游戲結(jié)束之后的善后工作的,如判斷貪吃蛇是什么情況導(dǎo)致游戲結(jié)束的,并打印相應(yīng)的提示信息。并且將開辟的動(dòng)態(tài)內(nèi)存給釋放掉。
代碼如下:

//游戲結(jié)束
void GameEnd(snack* s)
{
	//此時(shí)表示不是正常模式,已經(jīng)退出游戲了
	if (s->snack_state == Normal_exit)
	{
		setpos(20, 10);
		wprintf(L"正常退出\n");
	}
	else if (s->snack_state == Kill_by_self)
	{
		setpos(20, 10);
		wprintf(L"很遺憾你咬到自己了\n");
	}
	else if (s->snack_state == Kill_by_wall)
	{
		setpos(20, 10);
		wprintf(L"很遺憾你撞到墻了\n");
	}
	//將動(dòng)態(tài)內(nèi)存給釋放
	snacknode* cur = s->snackhead;
	while (cur)
	{
		snacknode* del = cur;
		cur = cur->next;
		free(del);
	}
	s->snackhead = NULL;
	//食物的那個(gè)內(nèi)存也需要釋放掉
	free(s->food);
	s->food = NULL;
}

完整的代碼如下

SnackGame.h文件代碼如下:

#pragma once
#include<stdio.h>
#include<windows.h>
#include<assert.h>
#include<stdlib.h>
#include<locale.h>
#include<stdbool.h>
#include<time.h>
//#include"vld.h"

//定義按鍵是否被按下的宏,如果按下就是1否則就是0
#define KEY_PRESS(VK) ( (GetAsyncKeyState(VK) & 0x1) ? 1 : 0 )

#define POS_X 24//蛇初試的x坐標(biāo)
#define POS_Y 5//蛇初試的y坐標(biāo)

#define snackprint L"■"//蛇打印的樣式
#define foodprint L"◆"//食物打印的樣式
#define wallprint L'□'//墻體打印的樣式


//定義一個(gè)蛇的節(jié)點(diǎn)
typedef struct snacknode
{
	short x;
	short y;
	struct snacknode* next;
}snacknode;

typedef enum state
{
	//正常進(jìn)行
	Normal,
	//撞墻
	Kill_by_wall,
	//撞到自己
	Kill_by_self,
	//正常退出
	Normal_exit
}state;

//蛇移動(dòng)的方向
typedef enum direction
{
	//向上移動(dòng)
	Up,
	//向下移動(dòng)
	Down,
	//向左移動(dòng)
	Left,
	//向右移動(dòng)
	Right
}direction;


//定義貪吃蛇整個(gè)數(shù)據(jù),其中包括蛇頭,食物,游戲狀態(tài),食物的分?jǐn)?shù),當(dāng)前的得分,蛇移動(dòng)的方向,加速減速(這個(gè)其實(shí)就是睡眠時(shí)間)
typedef struct snack
{
	snacknode* snackhead;
	snacknode* food;
	state snack_state;
	int food_score;
	int total_score;
	int sleep_time;
	direction dir;
}snack;

//設(shè)置坐標(biāo)
void setpos(short x, short y);

//打印歡迎界面
void Welcomeshow();

//打印地圖,創(chuàng)建27行,58列的地圖
void Mapshow();

//初始化蛇,最開始蛇身為5
void Initsnack(snack* s);

//創(chuàng)建食物
void CreatFood(snack* s);

//打印蛇和食物
void Showsnack(snack* s);

//打印食物
void Showfood(snack* s);

//打印幫助信息
Printhelpinfo(snack* s);

//暫停游戲
void stop();

//蛇的移動(dòng)
void snackmove(snack* s);

//判斷下一個(gè)節(jié)點(diǎn)是否是食物
bool next_is_food(snack* s, snacknode* next);

//撞到自己或撞到墻
void kill(snack* s);

test.c代碼如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include"SnackGame.h"
//游戲開始
void GameStart(snack* s)
{
	//設(shè)置窗口大小,設(shè)置窗口名字
	system("mode con cols=100 lines=30");
	system("title snack");
	//獲取控制臺(tái)的句柄
	HANDLE houtput = GetStdHandle(STD_OUTPUT_HANDLE);
	CONSOLE_CURSOR_INFO curserinfo;
	//通過句柄獲取控制臺(tái)中的光標(biāo)
	GetConsoleCursorInfo(houtput, &curserinfo);//從句柄中獲取鼠標(biāo)的信息,將這個(gè)信息存儲(chǔ)到curseinfo中
	curserinfo.bVisible = false;
	//將光標(biāo)隱藏
	SetConsoleCursorInfo(houtput, &curserinfo);
	//打印歡迎界面
	Welcomeshow();
	//打印地圖
	Mapshow();
	//初始化蛇
	Initsnack(s);
	//打印蛇和食物
	Showsnack(s);
	Showfood(s);
}

//游戲運(yùn)行
void GameRun(snack* s)
{
	//setpos(40, 27);
	//system("pause");
	do
	{
		Printhelpinfo(s);
		//檢測(cè)是否有相應(yīng)的功能鍵按下
		if (KEY_PRESS(VK_UP) && s->dir != Down)
		{
			s->dir = Up;
		}
		else if (KEY_PRESS(VK_DOWN) && s->dir != Up)
		{
			s->dir = Down;
		}
		else if (KEY_PRESS(VK_LEFT) && s->dir != Right)
		{
			s->dir = Left;
		}
		else if (KEY_PRESS(VK_RIGHT) && s->dir != Left)
		{
			s->dir = Right;
		}
		else if (KEY_PRESS(VK_SPACE))
		{
			stop();
		}
		else if (KEY_PRESS(VK_ESCAPE))
		{
			s->snack_state = Normal_exit;
			break;
		}
		else if (KEY_PRESS(VK_F3))//加速
		{
			if (s->sleep_time > 100)
			{
				s->sleep_time -= 50;
				s->food_score += 2;
			}
		}
		else if (KEY_PRESS(VK_F4))//減速
		{
			if (s->food_score > 2)
			{
				s->sleep_time += 50;
				s->food_score -= 2;
			}
		}
		Sleep(s->sleep_time);
		//蛇的移動(dòng)
		snackmove(s);
		//判斷蛇是否撞墻或撞到自己
		kill(s);
	} while (s->snack_state == Normal);//正常模式就繼續(xù)
}

//游戲結(jié)束
void GameEnd(snack* s)
{
	//此時(shí)表示不是正常模式,已經(jīng)退出游戲了
	if (s->snack_state == Normal_exit)
	{
		setpos(20, 10);
		wprintf(L"正常退出\n");
	}
	else if (s->snack_state == Kill_by_self)
	{
		setpos(20, 10);
		wprintf(L"很遺憾你咬到自己了\n");
	}
	else if (s->snack_state == Kill_by_wall)
	{
		setpos(20, 10);
		wprintf(L"很遺憾你撞到墻了\n");
	}
	//將動(dòng)態(tài)內(nèi)存給釋放
	snacknode* cur = s->snackhead;
	while (cur)
	{
		snacknode* del = cur;
		cur = cur->next;
		free(del);
	}
	s->snackhead = NULL;
	//食物的那個(gè)內(nèi)存也需要釋放掉
	free(s->food);
	s->food = NULL;
}


void Gametest()
{
	srand((unsigned int)time(NULL));
	char input = 'y';
	do
	{
		if (input == 'y' || input == 'Y')
		{
			system("cls");
			//創(chuàng)建蛇
			snack s = { 0 };
			//游戲開始,進(jìn)行相應(yīng)的初始化
			GameStart(&s);
			//游戲運(yùn)行
			GameRun(&s);
			// 游戲結(jié)束,進(jìn)行后續(xù)的處理
			GameEnd(&s);
			setpos(0, 27);
			wprintf(L"是否要再玩Y/N:");
			setpos(15, 27);
			input = getchar();
			while (getchar() != '\n');
		}
		else if(input != 'y' || input != 'Y'|| input == 'n' || input == 'N')
		{
			setpos(0, 27);
			setpos(0, 27);
			wprintf(L"輸入錯(cuò)誤請(qǐng)重新輸入Y/N:");
			setpos(25, 27);
			input = getchar();
			while(getchar()!='\n');
		}
	} while (input != 'n' && input != 'N');
}

int main()
{
	setlocale(LC_ALL, "");//切換到本地環(huán)境
	Gametest();
	return 0;
}

SnackGame.c文件代碼如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include"SnackGame.h"

//設(shè)置光標(biāo)的坐標(biāo)
void setpos(short x, short y)
{
	COORD pos = { x,y };
	HANDLE houtput = NULL;
	//首先獲取控制臺(tái)中的句柄
	houtput = GetStdHandle(STD_OUTPUT_HANDLE);
	//設(shè)置光標(biāo)的位置pos
	SetConsoleCursorPosition(houtput, pos);
}

//打印歡迎界面
void Welcomeshow()
{
	setpos(40, 15);
	wprintf(L"歡迎來到貪吃蛇小游戲\n");
	setpos(43, 25);//用來控制 請(qǐng)按任意鍵繼續(xù). . .這個(gè)字符打印的位置
	system("pause");
	system("cls");
	setpos(25, 15);
	wprintf(L"用↑.↓.←.→.來控制蛇的移動(dòng),F3為加速,F4為減速\n");
	setpos(43, 25);//用來控制 請(qǐng)按任意鍵繼續(xù). . .這個(gè)字符打印的位置
	system("pause");
	system("cls");
	setpos(40, 15);
	wprintf(L"加速將能獲得更高的分?jǐn)?shù)\n");
	setpos(43, 25);//用來控制 請(qǐng)按任意鍵繼續(xù). . .這個(gè)字符打印的位置
	system("pause");
	system("cls");
}

//打印地圖,創(chuàng)建27行,58列的地圖
void Mapshow()
{
	//打印上
	int i = 0;
	for (i = 0; i < 58; i+=2)
	{
		setpos(i, 0);
		wprintf(L"%lc", wallprint);
	}
	//打印下
	for (i = 0; i < 58; i += 2)
	{
		setpos(i, 26);
		wprintf(L"%lc", wallprint);
	}
	//打印左
	for (i = 1; i < 26; i++)
	{
		setpos(0, i);
		wprintf(L"%lc", wallprint);
	}
	//打印右
	for (i = 1; i < 26; i++)
	{
		setpos(56, i);
		wprintf(L"%lc", wallprint);
	}
	setpos(40,27);
}

//創(chuàng)建食物
void CreatFood(snack* s)
{
	snacknode* food = (snacknode*)malloc(sizeof(snacknode));
	if (food == NULL)
	{
		perror("CreatFood->malloc");
		return;
	}
	short x;
	short y;
again:
	do
	{
		x = rand() % 53 + 2;
		y = rand() % 25 + 1;
	} while (x % 2 != 0);
	//此時(shí)x的坐標(biāo)滿足是2的倍數(shù)
	//現(xiàn)在還需要滿足生成的食物不是蛇的身體或蛇頭
	snacknode* cur = s->snackhead;
	while (cur)
	{
		if (cur->x == x && cur->y == y)
		{
			//跳到前面生成隨機(jī)坐標(biāo),繼續(xù)生成
			goto again;
		}
		cur = cur->next;
	}
	//此時(shí)表示食物生成成功
	food->x = x;
	food->y = y;
	s->food = food;
}

//初始化蛇以及狀態(tài),最開始蛇身為5
void Initsnack(snack* s)
{
	s->snackhead = NULL;
	//創(chuàng)建蛇的鏈表
	for (int i = 0; i < 5; i++)
	{
		snacknode* newnode = (snacknode*)malloc(sizeof(snacknode));//創(chuàng)建蛇節(jié)點(diǎn)
		if (newnode == NULL)
		{
			perror("Initsnack->malloc");
			return;
		}
		newnode->next = s->snackhead;
		s->snackhead = newnode;
		newnode->x = POS_X + i * 2;
		newnode->y = POS_Y;
	}
	//創(chuàng)建食物
	CreatFood(s);
	//初始化狀態(tài)
	s->dir = Right;
	s->sleep_time = 300;
	s->snack_state = Normal;
	s->food_score = 10;
}

//打印蛇
void Showsnack(snack* s)
{
	snacknode* cur = s->snackhead;
	//打印蛇
	while (cur)
	{
		setpos(cur->x, cur->y);
		wprintf(snackprint);
		cur = cur->next;
	}
}
//打印食物
void Showfood(snack* s)
{
	snacknode* cur = s->food;
	setpos(cur->x, cur->y);
	wprintf(foodprint);
}

//打印幫助信息
Printhelpinfo(snack* s)
{
	setpos(64, 10);
	wprintf(L"得分:");
	printf("%3d", s->total_score);
	wprintf(L",每個(gè)食物得分:");
	printf("%3d", s->food_score);
	wprintf(L"分\n");
	setpos(64, 15);
	wprintf(L"不能穿墻,不能咬到自己");
	setpos(64, 16);
	wprintf(L"用↑.↓.←.→分別控制蛇的移動(dòng)\n");
	setpos(64, 17);
	wprintf(L"F3為加速,F(xiàn)4為減速\n");
	setpos(64, 18);
	wprintf(L"速度越快食物分?jǐn)?shù)越高\(yùn)n");
	setpos(64, 19);
	wprintf(L"速度越慢食物分?jǐn)?shù)越低\n");
	setpos(64, 20);
	wprintf(L"ESC:退出游戲.,space暫停游戲\n");
}

//暫停游戲
void stop()
{
	while (1)
	{
		Sleep(500);
		if (KEY_PRESS(VK_SPACE))
			break;
	}
}

//判斷下一個(gè)節(jié)點(diǎn)是否是食物,蛇移動(dòng)的下一個(gè)節(jié)點(diǎn)為食物就返回true,否則返回false
bool next_is_food(snack* s, snacknode* next)
{
	if (s->food->x == next->x && s->food->y == next->y)
	{
		return true;
	}
	return false;
}

//蛇的移動(dòng)
void snackmove(snack* s)
{
	snacknode* next = (snacknode*)malloc(sizeof(snacknode));
	if (next == NULL)
	{
		perror("snackmove->malloc");
		return;
	}
	if (s->dir == Up)
	{
		next->x = s->snackhead->x;
		next->y = s->snackhead->y - 1;
	}
	else if (s->dir == Down)
	{
		next->x = s->snackhead->x;
		next->y = s->snackhead->y + 1;
	}
	else if (s->dir == Left)
	{
		next->x = s->snackhead->x-2;
		next->y = s->snackhead->y;
	}
	else if (s->dir == Right)
	{
		next->x = s->snackhead->x+2;
		next->y = s->snackhead->y;
	}
	//蛇的下一個(gè)位置是食物
	if (next_is_food(s,next))
	{
		next->next = s->snackhead;
		s->snackhead = next;
		snacknode* snacktail = s->snackhead;
		while (snacktail!= NULL)
		{
			setpos(snacktail->x, snacktail->y);
			wprintf(snackprint);
			snacktail = snacktail->next;
		}
		free(s->food);
		s->food = NULL;
		s->total_score += s->food_score;
		CreatFood(s);//創(chuàng)建新食物
		Showfood(s);
	}
	//蛇的下一個(gè)位置不是食物
	else
	{
		next->next = s->snackhead;
		s->snackhead = next;
		snacknode* snacktailpre = s->snackhead;
		while (snacktailpre->next->next != NULL)
		{
			setpos(snacktailpre->x, snacktailpre->y);
			wprintf(snackprint);
			snacktailpre = snacktailpre->next;
		}
		setpos(snacktailpre->x, snacktailpre->y);
		wprintf(snackprint);
		snacknode* del = snacktailpre->next;
		snacktailpre->next = NULL;
		setpos(del->x, del->y);
		printf("  ");
		free(del);
		del = NULL;
	}
}

//撞到自己或撞到墻
void kill(snack* s)
{
	//首先判斷是否撞到自己
	snacknode* head = s->snackhead;
	snacknode* cur = s->snackhead->next;
	while (cur)
	{
		if (cur->x == head->x && cur->y == head->y)
		{
			//將狀態(tài)設(shè)置成Kill_by_self
			s->snack_state = Kill_by_self;
			return;
		}
		cur = cur->next;
	}
	if (head->x == 0 || head->x == 56 || head->y == 0 || head->y == 26)
	{
		s->snack_state = Kill_by_wall;
	}
}

測(cè)試結(jié)果如下:

在控制臺(tái)實(shí)現(xiàn)貪吃蛇,C語言,c語言,游戲
在控制臺(tái)實(shí)現(xiàn)貪吃蛇,C語言,c語言,游戲
在控制臺(tái)實(shí)現(xiàn)貪吃蛇,C語言,c語言,游戲
在控制臺(tái)實(shí)現(xiàn)貪吃蛇,C語言,c語言,游戲
在控制臺(tái)實(shí)現(xiàn)貪吃蛇,C語言,c語言,游戲
在控制臺(tái)實(shí)現(xiàn)貪吃蛇,C語言,c語言,游戲
本文介紹了貪吃蛇小游戲的簡(jiǎn)易實(shí)現(xiàn),主要是通過鏈表來對(duì)其進(jìn)行處理的。感謝大家的觀看,如有錯(cuò)誤不足之處歡迎大家批評(píng)指正?。?!文章來源地址http://www.zghlxwxcb.cn/news/detail-860150.html

到了這里,關(guān)于在控制臺(tái)實(shí)現(xiàn)貪吃蛇的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 超好玩C++控制臺(tái)打飛機(jī)小游戲,附源碼

    超好玩C++控制臺(tái)打飛機(jī)小游戲,附源碼

    我終于決定還是把這個(gè)放出來。 視頻在這:https://v.youku.com/v_show/id_XNDQxMTQwNDA3Mg==.html 具體信息主界面上都有寫。 按空格暫停,建議暫停后再升級(jí)屬性。 記錄最高分的文件進(jìn)行了加密。 有boss(上面視頻2分47秒)。 挺好玩的。 可能有bug,不想改了,整體體驗(yàn)不錯(cuò)就行了。 更多

    2024年02月05日
    瀏覽(20)
  • 【C#項(xiàng)目實(shí)戰(zhàn)】控制臺(tái)游戲勇士斗惡龍(1)——游戲初始設(shè)置以及開始界面

    【C#項(xiàng)目實(shí)戰(zhàn)】控制臺(tái)游戲勇士斗惡龍(1)——游戲初始設(shè)置以及開始界面

    君兮_的個(gè)人主頁 即使走的再遠(yuǎn),也勿忘啟程時(shí)的初心 C/C++ 游戲開發(fā) Hello,米娜桑們,這里是君兮_,最近開始正式的步入學(xué)習(xí)游戲開發(fā)的正軌,想要通過寫博客的方式來分享自己學(xué)到的知識(shí)和經(jīng)驗(yàn),這就是開設(shè)本專欄的目的。希望這些獨(dú)立的C#小項(xiàng)目能對(duì)做游戲的你有所幫助,

    2024年02月09日
    瀏覽(25)
  • OpenKruiseGame × KubeSphere 聯(lián)合發(fā)布游戲服運(yùn)維控制臺(tái),推動(dòng)云原生游戲落地

    OpenKruiseGame × KubeSphere 聯(lián)合發(fā)布游戲服運(yùn)維控制臺(tái),推動(dòng)云原生游戲落地

    作者:云原生游戲社區(qū) 近日,云原生游戲開源社區(qū)旗下 OpenKruiseGame(以下簡(jiǎn)稱:OKG)基于 KubeSphere 4.0 LuBan 架構(gòu)開發(fā)的游戲服運(yùn)維控制臺(tái) OKG Dashboard 正式發(fā)布!現(xiàn)已上架 KubeSphere Marketplace 云原生應(yīng)用擴(kuò)展市場(chǎng),支持免費(fèi)使用。 OpenKruiseGame(OKG) 是 CloudNativeGame 社區(qū)聯(lián)合阿里云

    2024年01月24日
    瀏覽(32)
  • 【C#實(shí)戰(zhàn)】控制臺(tái)游戲 勇士斗惡龍(3)——營(yíng)救公主以及結(jié)束界面

    【C#實(shí)戰(zhàn)】控制臺(tái)游戲 勇士斗惡龍(3)——營(yíng)救公主以及結(jié)束界面

    君兮_的個(gè)人主頁 即使走的再遠(yuǎn),也勿忘啟程時(shí)的初心 C/C++ 游戲開發(fā) Hello,米娜桑們,這里是君兮_,最近開始正式的步入學(xué)習(xí)游戲開發(fā)的正軌,想要通過寫博客的方式來分享自己學(xué)到的知識(shí)和經(jīng)驗(yàn),這就是開設(shè)本專欄的目的。希望這些獨(dú)立的C#小項(xiàng)目能對(duì)做游戲的你有所幫助,

    2024年02月09日
    瀏覽(19)
  • C語言——修改控制臺(tái)背景色和字體顏色

    C語言——修改控制臺(tái)背景色和字體顏色

    可以用庫(kù)函數(shù)system(“color NUM1NUM2”)實(shí)現(xiàn) 需要頭文件 stdlib.h NUM1,NUM2均為16進(jìn)制數(shù) NUM1控制控制臺(tái)背景色,NUM2控制前景色(即打印的字符的顏色) NUM1,NUM2之間 不能有空格 注:整個(gè)程序中, 只有最后一個(gè)system(“color ”)生效,因此不能多處局部變色。 NUM1, NUM2可以為以下任何值

    2024年01月17日
    瀏覽(33)
  • java實(shí)現(xiàn)控制臺(tái)購(gòu)書系統(tǒng)

    java實(shí)現(xiàn)控制臺(tái)購(gòu)書系統(tǒng)

    目錄 代碼 實(shí)現(xiàn)思路 0x1 創(chuàng)建Book圖書 0X2 讀取圖書 0x3 書籍判斷? 0x4 訂單計(jì)算 總結(jié) 就是增刪改查,定義圖書為class類,但是圖書Bokk class的有參構(gòu)造函數(shù)為數(shù)組類型實(shí)例化。,這樣可以將書籍的編號(hào)名稱,單擊庫(kù)存依次存入,使用就通過數(shù)組books[]的索引來拿到每一項(xiàng)的值,通過遍歷數(shù)組

    2024年01月21日
    瀏覽(22)
  • C++制作安裝包【1】—— 控制臺(tái)實(shí)現(xiàn)

    C++制作安裝包【1】—— 控制臺(tái)實(shí)現(xiàn)

    之前用NSIS的時(shí)候發(fā)現(xiàn)不方便自制UI,找了其他的安裝包開發(fā)框架,開發(fā)手感還是不好,功能殘缺不一。我就想 如何使用純代碼的方式制作安裝包 呢?經(jīng)歷了眾多艱難才終于摸出方法。網(wǎng)上現(xiàn)有的文章都是用NSIS,Windows Installer等等現(xiàn)成框架制作安裝包的。所以我另開一個(gè)專欄

    2024年02月04日
    瀏覽(21)
  • go語言將cmd stdout和stderr作為字符串返回而不是打印到控制臺(tái)

    從 golang 應(yīng)用程序中執(zhí)行 bash 命令,現(xiàn)在 stdout 和 stderr 直接進(jìn)入控制臺(tái): 如果 bash 命令太慢( killInMilliSeconds 參數(shù)),程序應(yīng)該保持其終止 bash 命令的能力。 希望 stdout 和 stderr 作為字符串變量從 runBashCommandAndKillIfTooSlow 函數(shù)返回,而不立即打印到控 制臺(tái),如何實(shí)現(xiàn)。 將輸出設(shè)

    2024年01月23日
    瀏覽(25)
  • springboot+mysql+mybatis如何實(shí)現(xiàn)控制臺(tái)打印sql

    在Spring Boot中使用MyBatis與MySQL,并希望在控制臺(tái)打印SQL語句,你可以通過配置MyBatis的日志級(jí)別來實(shí)現(xiàn)。以下是具體步驟: 添加依賴: 確保你的項(xiàng)目中包含了MyBatis和MySQL的相關(guān)依賴。在 pom.xml 文件中添加如下依賴: 配置application.properties或application.yml: 在 application.properties 或

    2024年02月01日
    瀏覽(22)
  • .NET Core 實(shí)現(xiàn)日志打印輸出在控制臺(tái)應(yīng)用程序中

    .NET Core 實(shí)現(xiàn)日志打印輸出在控制臺(tái)應(yīng)用程序中

    在本文中,我們將探討如何在 .NET Core 應(yīng)用程序中將日志消息輸出到控制臺(tái),從而更好地了解應(yīng)用程序的運(yùn)行狀況。 在 .NET Core 中,日志輸出打印是使用 Microsoft.Extensions.Logging 命名空間中的類和方法實(shí)現(xiàn)的。首先,我們需要確保在項(xiàng)目中添加了以下必要的依賴包: Microsoft.Ex

    2024年02月11日
    瀏覽(697)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包