C語言實(shí)現(xiàn)簡(jiǎn)單推箱子游戲
使用C語言實(shí)現(xiàn)超簡(jiǎn)單的推箱子游戲,供大家參考,具體內(nèi)容如下
感謝您打開了這篇文章,下面我將講述一下推箱子是如何實(shí)現(xiàn)的。
另外附贈(zèng)適配該程序簡(jiǎn)單好用 專屬推箱子地圖編輯器 讓您在16 * 16大地圖的條件下也能輕松編輯地圖。
鏈接:地圖編輯器
本程序在沒有檢測(cè)到地圖文件的情況下也能獨(dú)自運(yùn)行!代碼中儲(chǔ)存了推箱子游戲第一關(guān)的標(biāo)準(zhǔn)地圖,讓您在沒有地圖文件的情況下也能熟悉整個(gè)程序的流程!
當(dāng)然,擁有地圖文件會(huì)也會(huì)獲得更好的游戲體驗(yàn),請(qǐng)自行編輯。
廢話不多說!
下面進(jìn)入技術(shù)環(huán)節(jié):
C語言版 多功能推箱子
編譯環(huán)境: Windows VS2019
其他編譯器,可通過查看下文的“注意事項(xiàng)”將代碼更正為其他平臺(tái)可正常版本
需求:
控制人物將箱子推至目標(biāo)中,目標(biāo)全部完成進(jìn)入下一關(guān)。
思路:
使用二維數(shù)組儲(chǔ)存不同數(shù)字,數(shù)字包括了地圖中所有的元素,通過按鍵控制人物完成推箱子的操作,達(dá)成關(guān)卡內(nèi)的所有目標(biāo)后,自動(dòng)進(jìn)入下一關(guān)。
做法:
主要邏輯移動(dòng)推箱子部分:按下方向鍵后,雙重循環(huán)找到人物,根據(jù)移動(dòng)方向儲(chǔ)存 人物、人物前面、箱子、箱子前面四大基礎(chǔ)信息,并通過判斷前方數(shù)組值是否是墻壁、目標(biāo)等,進(jìn)行人物移動(dòng)和箱子移動(dòng)操作。
具體詳細(xì)做法我已經(jīng)整理到了代碼注釋當(dāng)中,以便一一對(duì)應(yīng)查看。
使用到知識(shí)點(diǎn):
循環(huán)、二維數(shù)組、讀取文件
難點(diǎn):
在人物和箱子移動(dòng)的同時(shí),有需要注意當(dāng)人物移動(dòng)到了未完成目標(biāo)或已完成目標(biāo)、箱子移動(dòng)到了已完成目標(biāo)的情況,這種情況需要判斷在人物/箱子離開之后,原地又再次變?yōu)樵亍?/p>
說明:
程序前部分有較多代碼用于寫出未檢測(cè)到文件的情況邏輯和關(guān)卡選擇邏輯,如果要直接查看核心代碼請(qǐng)移動(dòng)到operation();操作人物函數(shù)和gbszszhs(char ch);修改二維數(shù)組函數(shù)。
注意:
由于編譯器原因,程序中_kbhit()和_getch()函數(shù)可能在其他編譯器上編譯會(huì)出現(xiàn)錯(cuò)誤,解決辦法是去掉函數(shù)前面的“_”。
同時(shí),要將 文件打開函數(shù)fopen_s(&fp, FLPA, “r”);更改為fp = fopen(FLPA, “r”);
fcanf_s更改為fcanf scanf_s()更改為scanf
運(yùn)行效果:
菜單選擇:

游戲進(jìn)行:

代碼實(shí)現(xiàn):
#include <stdio.h>
#include <windows.h>
#include <conio.h>
//0代表空地,1代表墻,2代表未達(dá)成的目標(biāo),3代表箱子,4代表玩家,5代表已放箱子的目標(biāo),
//6代表人暫時(shí)所在的未達(dá)成的目標(biāo),7代表人暫時(shí)所在的已達(dá)成的目標(biāo),8代表箱子暫時(shí)所在的已達(dá)成的目標(biāo)
#define WH 16 //地圖的寬高
#define BYT 529 //一關(guān)需要跳過的字?jǐn)?shù) 因?yàn)槲募羔樁ㄎ缓瘮?shù)的原因,有時(shí)定位可能會(huì)不準(zhǔn)確,可以通過修改BYT進(jìn)行適配
#define FLPA "C:\\Users\\ASUS\\Desktop\\推箱子地圖.txt" //需要讀取地圖文件的路徑 游戲之前需進(jìn)行設(shè)置!!
//找不到路徑將只能進(jìn)行第一關(guān)游戲
//注意:游戲地圖邊界 不可以 當(dāng)做墻壁使用!
#define INITMAP \
int mapch_init[WH][WH] = { \
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
{0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0}, \
{0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, 0}, \
{0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0}, \
{0, 0, 0, 0, 1, 1, 1, 3, 0, 3, 2, 1, 0, 0, 0, 0}, \
{0, 0, 0, 0, 1, 2, 0, 3, 4, 1, 1, 1, 0, 0, 0, 0}, \
{0, 0, 0, 0, 1, 1, 1, 1, 3, 1, 0, 0, 0, 0, 0, 0}, \
{0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0}, \
{0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0}, \
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
};
int mapch[WH][WH];
//所有函數(shù)之間不是獨(dú)立和順序的,會(huì)互相調(diào)用
void HideCursor(); //隱藏光標(biāo)
void gotoxy(int x, int y);//光標(biāo)定位
void scmbxyhs(); //輸出地圖下方文字信息函數(shù)
void wjzdwjzjjrqk(); //未找到文件直接進(jìn)入第一關(guān)情況
int gkxzhs(); //關(guān)卡選擇函數(shù)
void cwjzjrwkdhs(); //從文件中進(jìn)入關(guān)卡的函數(shù)
void gnxzjm(); //主菜單選擇
void cshhs(); //初始化函數(shù)
void tranmap(); //翻譯并畫出地圖
void detection(); //尋找所有該地圖中未完成的目標(biāo)
void gktgszxhs(); //判斷關(guān)卡是否通過,是進(jìn)行下一關(guān)卡
void operation(); //操作人物主要函數(shù)***
void gbszszhs(char ch); //改變數(shù)組數(shù)值函數(shù)
int updatetime(); //獲取一次電腦現(xiàn)在的時(shí)間
void process(); //主要流程
int main()
{
cshhs(); //初始化函數(shù)
process(); //主要流程
return 0;
}
//游戲開始初始化部分
void scmbxyhs() //輸出地圖提示信息函數(shù)
{
gotoxy(34, 17);
printf("本關(guān)剩余目標(biāo)數(shù):");
gotoxy(34, 19);
printf("本關(guān)已走步數(shù):");
gotoxy(32, 21);
printf("您使用 秒完成了本關(guān)!");
gotoxy(49, 19);
printf("0"); //輸出初始的步數(shù)0
}
void wjzdwjzjjrqk() //未找到文件直接進(jìn)入第一關(guān)情況
{
system("cls");
printf("地圖文件不存在,\n直接進(jìn)入第一關(guān)");
INITMAP //初始地圖數(shù)組
for (int i = 0; i < WH; i ) //如果地圖文件不存在則將初始地圖數(shù)組的值賦給需要使用的地圖
for (int j = 0; j < WH; j ) //將初始地圖數(shù)組的值復(fù)制給當(dāng)前地圖數(shù)組
mapch[i][j] = mapch_init[i][j];
Sleep(2000); //等待兩秒進(jìn)入第一關(guān)
system("cls"); //清屏
tranmap(); //畫出初始地圖
detection(); //目標(biāo)信息
scmbxyhs(); //輸出地圖下方文字信息
}
int n = 1; //輸入關(guān)卡變量**
int maxn = 0; //最大關(guān)數(shù)
int dczdgshs() //最大關(guān)數(shù)
{
FILE* fp = NULL; //因?yàn)橛糜谔崾竞拖拗戚斎肭闆r,所以需要得到最大關(guān)卡數(shù)maxn
fopen_s(&fp, FLPA, "r");
if (fp == NULL)
{
wjzdwjzjjrqk(); //未找到文件直接進(jìn)入第一關(guān)情況
return 0;
}
int temp = 0; //臨時(shí)變量用來統(tǒng)計(jì)地圖文件全字節(jié)數(shù)
rewind(fp); //文件指針移動(dòng)到文件首部
while (!feof(fp)) //文件指針還沒有到文件尾進(jìn)入循環(huán)
{
fgetc(fp); //讀字符函數(shù)從文件開頭讀,向后移動(dòng)文件指針
temp ; //每讀一個(gè)字符則臨時(shí)變量自增,統(tǒng)計(jì)出全文件有幾個(gè)字符
}
fclose(fp); //文件使用完成關(guān)閉文件
maxn = temp / BYT 1; //最大關(guān)數(shù)就是所有字符的數(shù)量除以一關(guān)的字符數(shù)
return 1;
}
int gkxzhs() //選擇關(guān)卡函數(shù)
{
system("cls"); //輸出關(guān)卡選擇提示
gotoxy(26, 8);
printf("請(qǐng)輸入想要挑戰(zhàn)的關(guān)卡:(回車確認(rèn))");
if (!dczdgshs()) //得出最大關(guān)數(shù)函數(shù),返回值為0代表未找到地圖文件,直接進(jìn)入流程
return 0;
gotoxy(36, 10);
printf("請(qǐng)輸入1- %d ", maxn);//輸出提示最大關(guān)數(shù)信息
srgk: //重新選擇關(guān)卡
gotoxy(41, 12);
scanf_s("%d", &n);
if (n<1 || n>maxn) //對(duì)輸入的錯(cuò)誤關(guān)卡信息加以限制
{
gotoxy(36, 12);
printf(" ");
gotoxy(33, 11);
printf("請(qǐng)輸入正確的關(guān)數(shù)");
goto srgk; //如果輸入錯(cuò)誤的關(guān)卡輸出提示信息并返回到輸入的地方重新輸入
}
return 1; //如果找到了文件就返回1
}
void cwjzjrwkdhs() //從文件中進(jìn)入關(guān)卡,適用于可以找到地圖文件的情況
{
//關(guān)數(shù)變量n的默認(rèn)初始化值為1
FILE* fp = NULL;
fopen_s(&fp, FLPA, "rb");
if (fp == NULL)
{
wjzdwjzjjrqk(); //直接進(jìn)入第一關(guān)函數(shù)
return; //地圖文件不存在則直接進(jìn)入第一關(guān)
}
//讀文件進(jìn)入關(guān)卡的代碼,從第一關(guān)進(jìn)入和選擇特定關(guān)從n關(guān)進(jìn)入兩種情況都會(huì)執(zhí)行
//流程如果用到該函數(shù),檢測(cè)已達(dá)成的目標(biāo)和未達(dá)成目標(biāo)的個(gè)數(shù)一直則調(diào)用函數(shù),n關(guān)數(shù)自增1
int skip = (n - 1) * BYT; //到n關(guān)需要跳過的字?jǐn)?shù) 跳過一關(guān)需要的字?jǐn)?shù)為512
fseek(fp, skip, 0); //定位到地圖文件第skip個(gè)字節(jié)處開始讀取
int i, j;
for (i = 0; i < WH; i ) //讀取512個(gè)字符
{
for (j = 0; j < WH; j )
{
fscanf_s(fp, "%d ", &mapch[i][j]);//格式讀函數(shù),直接以整數(shù)格式讀取數(shù)值存入地圖數(shù)組mapch中
printf("%d ", mapch[i][j]);
}
printf("\n");
}
fclose(fp); //讀取文件完畢,將文件關(guān)閉
system("cls");
}
void gnxzjm() //主菜單頁面選擇
{
system("cls");
gotoxy(39, 8);
printf("推箱子");
gotoxy(34, 10);
printf("輸入1 開始新游戲");
gotoxy(34, 12);
printf("輸入2 選擇關(guān)卡");
gotoxy(34, 14);
printf("輸入3 退出游戲");
Head: //用于返回的標(biāo)簽
gotoxy(34, 17);
char chn=_getch(); //選擇游戲模式
if (chn == '3')
{
system("cls"); //退出游戲則輸出提示信息
gotoxy(34, 12);
printf("歡迎下次光臨");
Sleep(2000);
gotoxy(0, 24);
exit(0); //退出游戲
}
else if (chn == '2')
{
if (!gkxzhs()) //進(jìn)入關(guān)卡選擇
return; //如果關(guān)卡選擇函數(shù)返回值為0則代表未找到文件,直接跳出初始化函數(shù)
//如果返回1找到文件則繼續(xù)執(zhí)行該函數(shù)下面的內(nèi)容
}
else if (chn == '1')
n = 1; //如果選擇新游戲,直接從第一關(guān)開始
else
{
gotoxy(34, 16);
printf("請(qǐng)輸入正確的選擇:");
goto Head; //選擇錯(cuò)誤的菜單,則重新返回選擇菜單的地方
}
//選擇1的情況:
cwjzjrwkdhs(); //從文件讀取關(guān)卡的函數(shù)
detection(); //統(tǒng)計(jì)當(dāng)前關(guān)卡的目標(biāo)數(shù)
tranmap(); //畫出地圖
scmbxyhs(); //輸出地圖下方文字信息
}
int detunf;//檢測(cè)未完成目標(biāo)的變量,初始為一個(gè)關(guān)卡中未完成目標(biāo)的個(gè)數(shù),箱子碰到未完成目標(biāo)時(shí),自減
void detection() //檢測(cè)當(dāng)前關(guān)中有多少個(gè)目標(biāo)
{
//detunf
detunf = 0; //從0開始統(tǒng)計(jì)
int i, j;
for (i = 0; i < WH; i )
for (j = 0; j < WH; j )
if (mapch[i][j] == 2)
detunf ;
gotoxy(50,17); //在提示信息的位置輸出剩余目標(biāo)信息
printf("%d", detunf);
}
void cshhs() //總初始化函數(shù)
{
system("title 推箱子");//控制臺(tái)標(biāo)題
system("mode con cols=84 lines=26");//設(shè)置控制臺(tái)大小,第一個(gè)參數(shù)為橫軸,地圖參數(shù)32 16
gnxzjm(); //主菜單頁面選擇
HideCursor(); //隱藏光標(biāo)函數(shù)
dczdgshs(); //找到地圖文件的情況下得出最大關(guān)數(shù)
}
//游戲流程部分
void tranmap() //翻譯地圖
{
gotoxy(26, 1); //輸出地圖時(shí)在控制臺(tái)中間輸出,地圖最上方空一行
int i, j;
for (i = 0; i < WH; i )
{
for (j = 0; j < WH; j )
{
if (mapch[i][j] == 1)
printf("■");
else if (mapch[i][j] == 2)
printf("★");
else if (mapch[i][j] == 3 || mapch[i][j] == 8)
printf("●");
else if (mapch[i][j] == 4 || mapch[i][j] == 6 || mapch[i][j] == 7)
printf("♀");
else if (mapch[i][j] == 5)
printf("--");
else
printf(" ");
}
gotoxy(26, i 1); //根據(jù)數(shù)組的y軸更改地圖輸出的y軸,地圖最上方空一行
}
}
int opnum; //每一關(guān)行走的步數(shù)
int time;
int time_2;
void gktgszxhs() //判斷當(dāng)前關(guān)卡是否通過,是進(jìn)入下一關(guān)
{
if (detunf == 0) //當(dāng)前關(guān)卡目標(biāo)為0時(shí)
{
n ; //關(guān)卡變量自增
if (n > maxn) //如果關(guān)數(shù)n大于了最大關(guān)卡數(shù)則返回主菜單
{
tranmap(); //畫出地圖
gotoxy(26, 22);
printf("您已通關(guān)所有關(guān)卡,3秒后返回主菜單!");
Sleep(3000); //等待三秒
opnum = 0, time = updatetime(),time_2 = 0;//行走的步數(shù),本關(guān)時(shí)間清0,重新獲取當(dāng)前時(shí)間,\
因?yàn)樾枰敵龅膖ime_2是用當(dāng)前時(shí)間-剛開始的時(shí)間
gnxzjm(); //主菜單頁面選擇函數(shù)
}
else
{
tranmap(); //畫出地圖
Sleep(2000); //等候兩秒
cwjzjrwkdhs(); //當(dāng)前關(guān)卡目標(biāo)為0時(shí),從文件中向地圖數(shù)組中讀入下一關(guān)卡的信息
detection(); //統(tǒng)計(jì)當(dāng)前關(guān)卡目標(biāo)個(gè)數(shù)
scmbxyhs(); //輸出地圖下方的信息
opnum = 0, time = updatetime(),time_2 = 0;//注釋見297行
//按鍵結(jié)束之后操控函數(shù)會(huì)調(diào)用畫出地圖函數(shù)
}
}
}
int i, j; //找到后的人的坐標(biāo)
int box_x, box_y; //箱子的坐標(biāo)
int boxnext_x, boxnext_y; //箱子前面的坐標(biāo)
int peonext_x, peonext_y; //人前面的坐標(biāo)
void gbszszhs(char ch) //修改地圖數(shù)組值主要函數(shù)**
{
for (i = 0; i < WH; i ) //遍歷 i是y軸,j是x軸
{
for (j = 0; j < WH; j )
{
if (mapch[i][j] == 4 || mapch[i][j] == 6 || mapch[i][j] == 7) //找到人的位置
{
if (ch == 'w') // 用于確定不同方向上 箱子、箱子前面、人前面的坐標(biāo)
{
box_y = i - 1; box_x = j; //箱子當(dāng)前
boxnext_y = i - 2; boxnext_x = j; //箱子前面
peonext_y = i - 1; peonext_x = j; //人前面
}
else if (ch == 'a')
{
box_y = i; box_x = j - 1;
boxnext_y = i; boxnext_x = j - 2;
peonext_y = i; peonext_x = j - 1;
}
else if (ch == 's')
{
box_y = i 1; box_x = j;
boxnext_y = i 2; boxnext_x = j;
peonext_y = i 1; peonext_x = j;
}
else if (ch == 'd')
{
box_y = i; box_x = j 1;
boxnext_y = i; boxnext_x = j 2;
peonext_y = i; peonext_x = j 1;
}
//排除大的錯(cuò)誤
if (mapch[box_y][box_x] == 3 || mapch[box_y][box_x] == 8) //如果人的前邊是箱子
if (mapch[boxnext_y][boxnext_x] == 1 || mapch[boxnext_y][boxnext_x] == 3 || mapch[boxnext_y][boxnext_x] == 8)
return; //如果箱子前邊是墻或者是箱子直接結(jié)束修改函數(shù)
if (mapch[box_y][box_x] == 1) //人的前邊不能是墻
return; //如果人的前邊是墻直接結(jié)束修改
opnum ; //每次有效操作步數(shù)自增一次,并輸出
gotoxy(49, 19);
printf("%d", opnum);//步數(shù)
//箱子改變
if (mapch[box_y][box_x] == 3 || mapch[box_y][box_x] == 8) //如果人的前邊是箱子
{
//箱子原地改變:
if (mapch[box_y][box_x] == 3) //如果箱子所在的位置是 一般箱子
mapch[box_y][box_x] = 0; //改變?yōu)榭盏?
else if (mapch[box_y][box_x] == 8) //如果箱子所在的位置是 箱子暫時(shí)所在已達(dá)成的目標(biāo)
mapch[box_y][box_x] = 5; //改變?yōu)橐堰_(dá)成的目標(biāo)
//箱子的下一步改變:
if (mapch[boxnext_y][boxnext_x] == 2) //如果箱子前面的格子是未放箱子的目標(biāo)
{
mapch[boxnext_y][boxnext_x] = 5; //則該格子變?yōu)橐逊畔渥拥哪繕?biāo)
detunf--; //本關(guān)目標(biāo)減1
gotoxy(50, 17); //輸出本關(guān)剩余目標(biāo)個(gè)數(shù)
printf("%d", detunf);
}
else if (mapch[boxnext_y][boxnext_x] == 0) //如果箱子前面是空地
mapch[boxnext_y][boxnext_x] = 3; //則變?yōu)槠胀ㄏ渥?
else if (mapch[boxnext_y][boxnext_x] == 5) //如果箱子前面是已經(jīng)放過箱子的目標(biāo)
mapch[boxnext_y][boxnext_x] = 8; //則變?yōu)?箱子暫時(shí)所在已達(dá)成的目標(biāo)
}
//原地改變
if (mapch[i][j] == 6)
mapch[i][j] = 2; //走出去之后原地又變回2 未達(dá)成的目標(biāo)
else if (mapch[i][j] == 7)
mapch[i][j] = 5; //走出去之后原地又變回5 已達(dá)成的目標(biāo)
else if (mapch[i][j] == 4)
mapch[i][j] = 0; //走出去之后原地變回4 人的原型
//人下一步改變
if (mapch[peonext_y][peonext_x] == 0 || mapch[peonext_y][peonext_y] == 3)//如果他的下一步是普通箱子或者空地
mapch[peonext_y][peonext_x] = 4; //人是 普通的人
if (mapch[peonext_y][peonext_x] == 2) //如果他的下一步還是未達(dá)成的目標(biāo)
mapch[peonext_y][peonext_x] = 6; //人是 人暫時(shí)所在未達(dá)成的目標(biāo)
if (mapch[peonext_y][peonext_x] == 5) //如果人的下一步是已經(jīng)達(dá)成的目標(biāo)
mapch[peonext_y][peonext_x] = 7; //人是 人暫時(shí)所在已經(jīng)達(dá)成的目標(biāo)
if (mapch[peonext_y][peonext_x] == 8) //如果人的下一步是 箱子暫時(shí)所在已達(dá)成的目標(biāo)
mapch[peonext_y][peonext_x] = 7; //人還是 暫時(shí)所在已達(dá)成的目標(biāo)
goto L1; //修改完成后不需要遍歷后面的數(shù)組,直接跳出所有循環(huán)
}
}
}
L1: //用于跳出的標(biāo)簽
gktgszxhs(); //關(guān)卡通過則進(jìn)入下一關(guān)
}
void operation() //操作人物函數(shù)
{
char ch = _getch(); //接收輸入的方向 _getch()即使接收
switch (ch)
{
case 'w': //向不同方向移動(dòng)
gbszszhs(ch); //傳遞參數(shù),修改二維數(shù)組
break;
case 'a':
gbszszhs(ch);
break;
case 's':
gbszszhs(ch);
break;
case 'd':
gbszszhs(ch);
break;
}
tranmap(); //重新畫出地圖
}
int updatetime() //獲取一次電腦現(xiàn)在的時(shí)間
{
int now;
SYSTEMTIME system_time;
GetLocalTime(&system_time);
now = system_time.wMinute * 60 system_time.wSecond;
return now;
}
void process() //主要流程
{
time = updatetime(); //初始時(shí)間
while (1)
{
time_2 = updatetime() - time; //每關(guān)的時(shí)間time_2,值為當(dāng)前時(shí)間減去當(dāng)前關(guān)卡開始的時(shí)間
gotoxy(39, 21);
printf("%d s", time_2); //輸出
if(_kbhit())
operation(); //操作人物、修改數(shù)值主要函數(shù)
Sleep(20); //游戲幀率和手感 休眠時(shí)間
}
}
void gotoxy(int x, int y) //光標(biāo)定位
{
COORD pos = { x,y };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}
void HideCursor() //光標(biāo)隱藏
{
CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
主要函數(shù):gbszszhs()里面的邏輯是比較復(fù)雜的,我當(dāng)時(shí)寫這段代碼的時(shí)候也是反反復(fù)復(fù)修改好多次甚至推翻重做才理通順這些邏輯的。
如果對(duì)于程序代碼注釋有我沒寫明白的地方,歡迎在評(píng)論區(qū)下方留言詢問,如果我看到會(huì)盡最大的努力為您解惑。
不足之處:
地圖在屏幕上顯示時(shí)容易出錯(cuò),需要調(diào)整每關(guān)字?jǐn)?shù)。原因并不明確。
因?yàn)樽髡邔?duì)C語言的學(xué)習(xí)還比較淺薄,代碼寫到初始化游戲的兩種模式(有文件和無文件)時(shí)思維有些混亂,導(dǎo)致代碼在這一部分有很多的缺陷,但最終程序的效果還是出來了。
但其實(shí)對(duì)整篇所有代碼而言最重要的部分還是gbszszhs()函數(shù),只要將這個(gè)函數(shù)完全理解并熟練掌握了,那么整個(gè)“推箱子”游戲也就非常簡(jiǎn)單了。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C++小知識(shí):C/C++中不要按值傳遞數(shù)組
今天小編就為大家分享一篇關(guān)于C++小知識(shí):C/C++中不要按值傳遞數(shù)組,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-01-01
C++ deque與vector對(duì)比的優(yōu)缺點(diǎn)
這篇文章主要介紹了C++中deque與vector相比的優(yōu)勢(shì)與劣勢(shì),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-01-01
C++11 移動(dòng)構(gòu)造函數(shù)的使用
本文主要介紹了C++11 移動(dòng)構(gòu)造函數(shù)的使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
C/C++ int數(shù)與多枚舉值互轉(zhuǎn)的實(shí)現(xiàn)
在C/C++在C/C++的開發(fā)中經(jīng)常會(huì)遇到各種數(shù)據(jù)類型互轉(zhuǎn)的情況,本文主要介紹了C/C++ int數(shù)與多枚舉值互轉(zhuǎn)的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2021-08-08
C語言計(jì)算連續(xù)無序數(shù)組中缺省數(shù)字方法詳解
這篇文章主要介紹了C語言計(jì)算連續(xù)無序數(shù)組中缺省數(shù)字方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-02-02
Qt數(shù)據(jù)庫應(yīng)用之實(shí)現(xiàn)通用數(shù)據(jù)庫請(qǐng)求
這篇文章主要為大家介紹了Qt中是如何實(shí)現(xiàn)通用數(shù)據(jù)庫請(qǐng)求的,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Qt有一定幫助,感興趣的小伙伴可以了解一下2022-03-03
c++利用windows函數(shù)實(shí)現(xiàn)計(jì)時(shí)示例
這篇文章主要介紹了c++利用windows函數(shù)實(shí)現(xiàn)計(jì)時(shí)示例,需要的朋友可以參考下2014-05-05

