C語(yǔ)言系列之推箱子游戲
本文實(shí)例為大家分享了C語(yǔ)言系列之推箱子游戲的具體代碼,供大家參考,具體內(nèi)容如下
輸入WSAD控制行走,只需要把一個(gè)方向的代碼寫好了,剩下的是三個(gè)方向就是復(fù)制粘貼和簡(jiǎn)單的修改就可以了。
#include <stdio.h>
#include <conio.h> //鍵盤輸入函數(shù)庫(kù)
//0:空地 1:墻 2:箱子要放的位置 5:人與星號(hào)重疊5:箱子與星號(hào)重疊 3:人+-3 4:箱子:+-4
int map[10][10] = {1,1,1,1,1,1,1,1,1,1,
1,0,0,0,0,0,2,0,0,1,
1,0,0,3,4,0,0,0,0,1,
1,0,0,1,1,0,0,0,0,1,
1,0,1,0,0,0,1,0,0,1,
1,0,0,4,0,0,1,0,0,1,
1,0,0,0,0,0,0,0,0,1,
1,0,2,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,0,0,1,
1,1,1,1,1,1,1,1,1,1,
};
int flag=0;
void PrintMap()
{
int i, j;
for (i = 0; i < 10; i++)
{
for (j = 0; j < 10; j++)
{
switch (map[i][j])
{
//0:空地 1:墻 2:箱子要放的位置 3:人 4:箱子 5:箱子到達(dá)目的地
case 0: printf(" "); break;
case 1: printf("■"); break;
case 2: printf("☆"); break;
case 3: printf("♀"); break;
case 4: printf("□"); break;
case 5: printf("★"); break;
default:
break;
}
}
printf("\n");
}
}
void PlayGame()
{
int num = 0;
char temp;
temp = getch();//鍵盤輸入無(wú)回顯函數(shù)
static int x=2,y=3;
switch (temp)
{
case 'W':
if(map[x-1][y] == 0)//如果下一個(gè)的地方為空地
{
if(flag == 0)
{
map[x-1][y] = 3;
map[x][y] = 0;
x--;
}
else
{
map[x-1][y] = 3;
map[x][y] = 2;
x--;
flag = 0;
}
}
else if (map[x-1][y] == 2)//如果下一個(gè)的地方為箱子存放地
{
map[x-1][y] = 3;
map[x][y] = 0;
x--;
if(map[x-1][y] == 0)
{
flag = 1;
}
}
else if(map[x-1][y] == 4)//下一個(gè)去的地方有箱子
{
if(map[x-2][y] == 0 )//x-2是空地時(shí)
{
if(flag == 0)
{
map[x-2][y] = 4;
map[x-1][y] = 3;
map[x][y] = 0;
x--;
}
else
{
map[x-2][y] = 4;
map[x-1][y] = 3;
map[x][y] = 2;
x--;
flag = 0;
}
}
else if(map[x-2][y] == 2)//x-2是箱子的存放地
{
map[x-2][y] = 5;
map[x-1][y] = 3;
map[x][y] = 0;
x--;
}
}
else if (map[x-1][y] == 5)//下一個(gè)去的地方是已經(jīng)在存放點(diǎn)的箱子
{
if(map[x-2][y] != 1)
{
map[x-2][y] = 4;
map[x-1][y] = 3;
map[x][y] = 0;
x--;
if(map[x-2][y] != 1)
{
flag = 1;
}
}
}
break;
case 'S':
if(map[x+1][y] == 0)//如果下一個(gè)的地方為空地
{
if(flag == 0)
{
map[x+1][y] = 3;
map[x][y] = 0;
x++;
}
else
{
map[x+1][y] = 3;
map[x][y] = 2;
x++;
flag = 0;
}
}
else if (map[x+1][y] == 2)//如果下一個(gè)的地方為箱子存放地
{
map[x+1][y] = 3;
map[x][y] = 0;
x++;
if(map[x+1][y] == 0)
{
flag = 1;
}
}
else if(map[x+1][y] == 4)//下一個(gè)去的地方有箱子
{
if(map[x+2][y] == 0 )//x-2是空地時(shí)
{
if(flag == 0)
{
map[x+2][y] = 4;
map[x+1][y] = 3;
map[x][y] = 0;
x++;
}
else
{
map[x+2][y] = 4;
map[x+1][y] = 3;
map[x][y] = 2;
x++;
flag = 0;
}
}
else if(map[x+2][y] == 2)//x-2是箱子的存放地
{
map[x+2][y] = 5;
map[x+1][y] = 3;
map[x][y] = 0;
x++;
}
}
else if (map[x+1][y] == 5)//下一個(gè)去的地方是已經(jīng)在存放點(diǎn)的箱子
{
if(map[x+2][y] != 1)
{
map[x+2][y] = 4;
map[x+1][y] = 3;
map[x][y] = 0;
x++;
if(map[x+2][y] != 1)
{
flag = 1;
}
}
}
break;
case 'A':
if(map[x][y-1] == 0)//如果下一個(gè)的地方為空地
{
if(flag == 0)
{
map[x][y-1] = 3;
map[x][y] = 0;
y--;
}
else
{
map[x][y-1] = 3;
map[x][y] = 2;
y--;
flag = 0;
}
}
else if (map[x][y-1] == 2)//如果下一個(gè)的地方為箱子存放地
{
map[x][y-1] = 3;
map[x][y] = 0;
y--;
if(map[x][y-1] == 0)
{
flag = 1;
}
}
else if(map[x][y-1] == 4)//下一個(gè)去的地方有箱子
{
if(map[x][y-2] == 0 )//x-2是空地時(shí)
{
if(flag == 0)
{
map[x][y-2] = 4;
map[x][y-1] = 3;
map[x][y] = 0;
y--;
}
else
{
map[x][y-2] = 4;
map[x][y-1] = 3;
map[x][y] = 2;
y--;
flag = 0;
}
}
else if(map[x][y-2] == 2)//x-2是箱子的存放地
{
map[x][y-2] = 5;
map[x][y-1] = 3;
map[x][y] = 0;
y--;
}
}
else if (map[x][y-1] == 5)//下一個(gè)去的地方是已經(jīng)在存放點(diǎn)的箱子
{
if(map[x][y-2] != 1)
{
map[x][y-2] = 4;
map[x][y-1] = 3;
map[x][y] = 0;
y--;
if(map[x][y-2] != 1)
{
flag = 1;
}
}
}
break;
case 'D':
if(map[x][y+1] == 0)//如果下一個(gè)的地方為空地
{
if(flag == 0)
{
map[x][y+1] = 3;
map[x][y] = 0;
y++;
}
else
{
map[x][y+1] = 3;
map[x][y] = 2;
y++;
flag = 0;
}
}
else if (map[x][y+1] == 2)//如果下一個(gè)的地方為箱子存放地
{
map[x][y+1] = 3;
map[x][y] = 0;
y++;
if(map[x][y+1] == 0)
{
flag = 1;
}
}
else if(map[x][y+1] == 4)//下一個(gè)去的地方有箱子
{
if(map[x][y+2] == 0 )//x-2是空地時(shí)
{
if(flag == 0)
{
map[x][y+2] = 4;
map[x][y+1] = 3;
map[x][y] = 0;
y++;
}
else
{
map[x][y+2] = 4;
map[x][y+1] = 3;
map[x][y] = 2;
y++;
flag = 0;
}
}
else if(map[x][y+2] == 2)//x-2是箱子的存放地
{
map[x][y+2] = 5;
map[x][y+1] = 3;
map[x][y] = 0;
y++;
}
}
else if (map[x][y+1] == 5)//下一個(gè)去的地方是已經(jīng)在存放點(diǎn)的箱子
{
if(map[x][y+2] != 1)
{
map[x][y+2] = 4;
map[x][y+1] = 3;
map[x][y] = 0;
y++;
if(map[x][y+2] != 1)
{
flag = 1;
}
}
}
break;
default:
break;
}
}
int main()
{
printf(" \r\n請(qǐng)輸入WASD控制行走\(yùn)r\n");
sleep(2);
while ((map[1][6] != 5) || (map[7][2] != 5))
{
PrintMap();
PlayGame();
system("cls");
}
printf(" \n恭喜您成功通關(guān)\n\n\n");
return 0;
}
結(jié)果顯示:

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C/C++常用函數(shù)易錯(cuò)點(diǎn)分析
這篇文章主要介紹了C/C++常用函數(shù)易錯(cuò)點(diǎn)分析,包含了memset、sizeof、getchar三個(gè)常用函數(shù)的分析,需要的朋友可以參考下2014-08-08
C++編程中逗號(hào)運(yùn)算符和條件運(yùn)算符的使用方法講解
這篇文章主要介紹了C++編程中逗號(hào)運(yùn)算符和條件運(yùn)算符的使用方法講解,需要的朋友可以參考下2016-01-01
c++之std::get_time和std::put_time
std::get_time和std::put_time是C++中用于日期和時(shí)間的格式化和解析的函數(shù),它們都包含在<iomanip>頭文件中,std::get_time用于從輸入流中解析日期時(shí)間字符串,而std::put_time則用于將std::tm結(jié)構(gòu)格式化為字符串2024-10-10
簡(jiǎn)單掌握Linux系統(tǒng)中fork()函數(shù)創(chuàng)建子進(jìn)程的用法
fork()函數(shù)只能在類Unix系統(tǒng)下使用,因?yàn)樾枰雞nistd頭文件,這里我們就來(lái)簡(jiǎn)單掌握Linux系統(tǒng)中fork()函數(shù)創(chuàng)建子進(jìn)程的用法,需要的朋友可以參考下2016-06-06
C/C++連接MySQL數(shù)據(jù)庫(kù)詳細(xì)圖文教程
在實(shí)際開發(fā)中我們經(jīng)常需要對(duì)數(shù)據(jù)庫(kù)進(jìn)行訪問(wèn),下面這篇文章主要介紹了C/C++連接MySQL數(shù)據(jù)庫(kù)的詳細(xì)圖文教程,文中通過(guò)代碼以及圖文介紹是非常詳細(xì),需要的朋友可以參考下2024-01-01
華為云開發(fā)工具CodeArts IDE for C/C++開發(fā)使用指南
CodeArts IDE是一個(gè)集成開發(fā)環(huán)境(IDE),它提供了開發(fā)語(yǔ)言和調(diào)試服務(wù),本文主要介紹了華為云開發(fā)工具CodeArts IDE for C/C++ 開發(fā)使用指南,感興趣的可以了解一下2023-08-08
在Centos7中使用vscode和gdb調(diào)試PG插件的方法
這篇文章主要介紹了在Centos7中使用vscode和gdb調(diào)試PG插件,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-09-09
C++實(shí)現(xiàn)進(jìn)程間通信(IPC)的終極指南
進(jìn)程間通信(IPC,Inter-Process Communication),指至少兩個(gè)進(jìn)程或線程間傳送數(shù)據(jù)或信號(hào)的一些技術(shù)或方法,下面小編來(lái)和大家深入介紹一下C++實(shí)現(xiàn)進(jìn)程間通信(IPC)的相關(guān)方法吧2025-04-04

