用C++實(shí)現(xiàn)推箱子
本文實(shí)例為大家分享了C++實(shí)現(xiàn)推箱子游戲的具體代碼,供大家參考,具體內(nèi)容如下
// 1.cpp : 此文件包含 "main" 函數(shù)。程序執(zhí)行將在此處開始并結(jié)束。
//
#include <iostream>
#include <stdio.h>//■
#include <cstdlib>
#include <conio.h>
using std::cout;
const int row = 12;
const int col = 13;
int x = 1;
int y = 11;
int map[row][col] = {
{2,2,2,2,2,2,2,2,2,2,2,2,2},
{2,0,0,0,0,0,0,0,0,0,0,5,2},
{2,0,0,0,0,0,0,0,0,0,3,0,2},
{2,0,0,0,0,0,0,0,0,0,0,0,2},
{2,0,0,0,0,0,0,0,1,0,0,0,2},
{2,0,0,0,0,0,0,0,0,0,0,0,2},
{2,0,0,0,0,0,0,0,0,0,0,0,2},
{2,0,0,0,0,0,0,0,0,0,0,0,2},
{2,0,0,0,0,0,0,0,0,0,0,0,2},
{2,0,0,0,0,0,0,0,0,0,0,0,2},
{2,0,0,0,0,0,0,0,0,0,0,0,2},
{2,2,2,2,2,2,2,2,2,2,2,2,2},
};
void draw() {
int i;
for (i = 0; i < 12; i++)
{
for (int j = 0; j < 13; j++)
{
switch (map[i][j])
{
case 0:
{
cout << " ";//0代表可以走的空格
break;
}
case 1:
{
cout << "★";//1代表箱子,用我就★代替了
break;
}
case 2:
{
cout << "■";//2代表了墻,不能逾越
break;
}
case 3:
{
cout << "☆";
break;
}
case 5:
{
cout << "♀";//5代表了人,可移動
break;
}
}
}
cout << "\n";
}
}
void move(int _x, int _y) {
if (map[x + _x][y + _y] == 2 || map[x + _x][y + _y] == 3 ||
map[x + _x][y + _y] == 5) {//判斷邊界人不能走出墻外
return;
}
if (map[x + _x][y + _y] == 1) {
if (map[x + 2 * _x][y + 2 * _y] == 2) {
return;
}
map[x + _x][y + _y] = 0;
map[x + 2 * _x][y + 2 * _y] = 1;
move(_x, _y);
return;
}
map[x][y] = 0;
x += _x;
y += _y;
map[x][y] = 5;
draw();
}
void step(char o) {
switch (o) {
case 'w': {//就像cf,cs那樣,wsad代表上下左右移動
move(-1, 0);
break;
}
case 's': {
move(1, 0);
break;
}
case 'd': {
move(0, 1);
break;
}
case 'a': {
move(0, -1);
break;
}
}
}
int main()
{
while (true) {
draw();//根據(jù)二維數(shù)組的值來進(jìn)行繪圖
step(_getch());//直接獲取屏幕輸入
system("cls");//清屏來實(shí)現(xiàn)動畫效果
}
}
再為大家分享一段實(shí)現(xiàn)代碼:謝謝原作者的分享
推箱子是一個經(jīng)典的c++題目,用w,a,s,d移動,效果自看
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int i,j;
void draw_map(int map[10][12]); //聲明畫圖函數(shù)
int main()
{
system("title 李柏衡");
char input;
int count=0; //定義記分變量
int map[10][12] = {{2,2,2,2,2,1,1,1,1,1,2,2},
{1,1,1,1,2,1,0,0,0,1,1,2},
{1,0,0,1,1,1,0,1,0,0,1,2},
{1,0,4,3,3,3,3,3,1,0,1,1},
{1,0,0,1,1,3,3,3,4,0,0,1},
{1,0,0,0,0,4,1,1,4,1,0,1},
{1,0,4,1,4,0,0,0,4,0,0,1},
{1,1,0,6,0,1,1,1,4,1,0,1},
{2,1,1,1,1,1,2,1,0,0,0,1},
{2,2,2,2,2,2,2,1,1,1,1,1}
};
while (1) //死循環(huán),等待用戶命令
{
system("CLS");
for (i=0;i<12;i++)
{
printf("%d",i);
}
printf("\n");
/*for (i=1;i<10;i++)
{
printf("%d\n",i);
}*/
printf("\n");
draw_map(map);
printf("當(dāng)前得分:%d\n",count);
//找初始位置
for (i=0;i<10;i++)
{
for (j=0;j<12;j++)
{
if (map[i][j]==6||map[i][j]==9)
break;
}
if (map[i][j]==6||map[i][j]==9)
break;
}
printf("您的當(dāng)前坐標(biāo)(%d,%d)",i,j);
input = getch(); //用getch()函數(shù)無需回車確認(rèn)地獲取用戶輸入,用于控制行走方向。
switch (input)
{
case 'w':
//如果人前面是空地。 //0代表空地 6代表人 //3代表目的地
if(map[i-1][j]==0)
{
map[i-1][j]=6+0; //人往前走一步,ID為人的ID()加上空地的ID()。
if(map[i][j]==9) //如果當(dāng)前人站的位置為目的地,則ID為(即人的ID()加上目的地ID())。
map[i][j]=3; //將人往前走一步后原地的ID修改為空地ID()。
else
map[i][j]=0; //否則原地ID修改為空地ID 。
}
//如果人前面是目的地。
else if((map[i-1][j]==3)||(map[i-1][j]==9))
{
map[i-1][j]=6+3; //人往前走一步,ID為人ID+目的地ID=9。
if(map[i][j]==9) //如果原地也是目的地(ID為)。
map[i][j]=3; //人走后把原地ID修改回目的地ID。
else
map[i][j]=0; //否則原地ID修改為為空地ID
}
//如果人前面是箱子。//4代表箱子 //7箱子進(jìn)入目的地
else if(map[i-1][j]==4)
{
//如果人前面是箱子,而箱子前面是空地。
if (map[i-2][j]==0)
{
map[i-2][j]=4; //人推箱子往前走一步,把空地ID修改為箱子ID()
//下面是對箱子原地進(jìn)行判斷
if(map[i-1][j]==7) //如果箱子原地為目的地。
map[i-1][j]=9; //人站在箱子的原地(目的地)時該地ID應(yīng)該為人的ID+目的地ID=9。
else
map[i-1][j]=6; //否則,人站在了原來的空地上,ID應(yīng)該為+0=6。
//下面是對人原地進(jìn)行判斷
if(map[i][j]==9) //如果之前是目的地。
map[i][j]=3; //人走了之后修改回目的地ID。
else
map[i][j]=0; //否則就是空地。
}
//如果人的前面是箱子,而箱子前面是目的地。
else if (map[i-2][j]==3)
{
map[i-2][j]=7; //ID為(目的地ID()+箱子ID()=7),表示已經(jīng)把箱子推入了目的地。
count++;
//下面是對箱子原先位置的判斷,同上。
if(map[i-1][j]==7)
map[i-1][j]=9;
else
map[i-1][j]=6;
//下面是對人原先位置進(jìn)行判斷,同上。
if(map[i][j]==9)
map[i][j]=3;
else
map[i][j]=0;
}
}
//如果人前面是已經(jīng)進(jìn)入某目的地的箱子(ID=7)。
else if(map[i-1][j]==7)
{
//如果人前面是已經(jīng)進(jìn)入某目的地的箱子,而箱子前面是空地。
if(map[i-2][j]==0)
{
count--;
map[i-2][j]=4; //把箱子重新推到空地上,ID=箱子ID+空地ID=4。
map[i-1][j]=9; //人自然而然的就站在了原先的目的地上了。
//下面是對人原先地進(jìn)行判斷,方法同上。
if(map[i][j]==9)
map[i][j]=3;
else
map[i][j]=0;
}
//如果人前面是已經(jīng)進(jìn)入某目的地的箱子,而箱子前面是另一目的地。
if(map[i-2][j]==3)
{
map[i-2][j]=7; //把箱子推入了另一目的地,自然,ID也應(yīng)是。
map[i-1][j]=9; //人站在了目的地上。
//下面是對人原先站立地進(jìn)行判斷,方法同上。
if(map[i][j]==9)
map[i][j]=3;
else
map[i][j]=0;
}
}
break;
case 's':
//如果人前面是空地。
if(map[i+1][j]==0)
{
map[i+1][j]=6+0; //人往前走一步,ID為人的ID()加上空地的ID()。
if(map[i][j]==9) //如果當(dāng)前人站的位置為目的地,則ID為(即人的ID()加上目的地ID())。
map[i][j]=3; //將人往前走一步后原地的ID修改為空地ID()。
else
map[i][j]=0; //否則原地ID修改為空地ID 。
}
//如果人前面是目的地。
else if(map[i+1][j]==3)
{
map[i+1][j]=6+3; //人往前走一步,ID為人ID+目的地ID=9。
if(map[i][j]==9) //如果原地也是目的地(ID為)。
map[i][j]=3; //人走后把原地ID修改回目的地ID。
else
map[i][j]=0; //否則原地ID修改為為空地ID
}
//如果人前面是箱子。
else if(map[i+1][j]==4)
{
//如果人前面是箱子,而箱子前面是空地。
if (map[i+2][j]==0)
{
map[i+2][j]=4; //人推箱子往前走一步,把空地ID修改為箱子ID()
//下面是對箱子原地進(jìn)行判斷
if(map[i+1][j]==7) //如果箱子原地為目的地。
map[i+1][j]=9; //人站在箱子的原地(目的地)時該地ID應(yīng)該為人的ID+目的地ID=9。
else
map[i+1][j]=6; //否則,人站在了原來的空地上,ID應(yīng)該為+0=6。
//下面是對人原地進(jìn)行判斷
if(map[i][j]==9) //如果之前是目的地。
map[i][j]=3; //人走了之后修改回目的地ID。
else
map[i][j]=0; //否則就是空地。
}
//如果人的前面是箱子,而箱子前面是目的地。
else if (map[i+2][j]==3)
{
map[i-2][j]=7; //ID為(目的地ID()+箱子ID()=7),表示已經(jīng)把箱子推入了目的地。
count++;
//下面是對箱子原先位置的判斷,同上。
if(map[i+1][j]==7)
map[i+1][j]=9;
else
map[i+1][j]=6;
//下面是對人原先位置進(jìn)行判斷,同上。
if(map[i][j]==9)
map[i][j]=3;
else
map[i][j]=0;
}
}
//如果人前面是已經(jīng)進(jìn)入某目的地的箱子(ID=7)。
else if(map[i+1][j]==7)
{
//如果人前面是已經(jīng)進(jìn)入某目的地的箱子,而箱子前面是空地。
if(map[i+2][j]==0)
{
count--;
map[i+2][j]=4; //把箱子重新推到空地上,ID=箱子ID+空地ID=4。
map[i+1][j]=9; //人自然而然的就站在了原先的目的地上了。
//下面是對人原先地進(jìn)行判斷,方法同上。
if(map[i][j]==9)
map[i][j]=3;
else
map[i][j]=0;
}
//如果人前面是已經(jīng)進(jìn)入某目的地的箱子,而箱子前面是另一目的地。
if(map[i+2][j]==3)
{
map[i+2][j]=7; //把箱子推入了另一目的地,自然,ID也應(yīng)是。
map[i+1][j]=9; //人站在了目的地上。
//下面是對人原先站立地進(jìn)行判斷,方法同上。
if(map[i][j]==9)
map[i][j]=3;
else
map[i][j]=0;
}
}
break;
case 'a':
//如果人前面是空地。
if(map[i][j-1]==0)
{
map[i][j-1]=6+0; //人往前走一步,ID為人的ID()加上空地的ID()。
if(map[i][j]==9) //如果當(dāng)前人站的位置為目的地,則ID為(即人的ID()加上目的地ID())。
map[i][j]=3; //將人往前走一步后原地的ID修改為空地ID()。
else
map[i][j]=0; //否則原地ID修改為空地ID 。
}
//如果人前面是目的地。
else if(map[i][j-1]==3)
{
map[i][j-1]=6+3; //人往前走一步,ID為人ID+目的地ID=9。
if(map[i][j]==9) //如果原地也是目的地(ID為)。
map[i][j]=3; //人走后把原地ID修改回目的地ID。
else
map[i][j]=0; //否則原地ID修改為為空地ID
}
//如果人前面是箱子。
else if(map[i][j-1]==4)
{
//如果人前面是箱子,而箱子前面是空地。
if (map[i][j-2]==0)
{
map[i][j-2]=4; //人推箱子往前走一步,把空地ID修改為箱子ID()
//下面是對箱子原地進(jìn)行判斷
if(map[i][j-1]==7) //如果箱子原地為目的地。
map[i][j-1]=9; //人站在箱子的原地(目的地)時該地ID應(yīng)該為人的ID+目的地ID=9。
else
map[i][j-1]=6; //否則,人站在了原來的空地上,ID應(yīng)該為+0=6。
//下面是對人原地進(jìn)行判斷
if(map[i][j]==9) //如果之前是目的地。
map[i][j]=3; //人走了之后修改回目的地ID。
else
map[i][j]=0; //否則就是空地。
}
//如果人的前面是箱子,而箱子前面是目的地。
else if (map[i][j-2]==3)
{
count++;
map[i][j-2]=7; //ID為(目的地ID()+箱子ID()=7),表示已經(jīng)把箱子推入了目的地。
//下面是對箱子原先位置的判斷,同上。
if(map[i][j-1]==7)
map[i][j-1]=9;
else
map[i][j-1]=6;
//下面是對人原先位置進(jìn)行判斷,同上。
if(map[i][j]==9)
map[i][j]=3;
else
map[i][j]=0;
}
}
//如果人前面是已經(jīng)進(jìn)入某目的地的箱子(ID=7)。
else if(map[i][j-1]==7)
{
//如果人前面是已經(jīng)進(jìn)入某目的地的箱子,而箱子前面是空地。
if(map[i][j-2]==0)
{
count--;
map[i][j-2]=4; //把箱子重新推到空地上,ID=箱子ID+空地ID=4。
map[i][j-1]=9; //人自然而然的就站在了原先的目的地上了。
//下面是對人原先地進(jìn)行判斷,方法同上。
if(map[i][j]==9)
map[i][j]=3;
else
map[i][j]=0;
}
//如果人前面是已經(jīng)進(jìn)入某目的地的箱子,而箱子前面是另一目的地。
if(map[i][j-2]==3)
{
map[i][j-2]=7; //把箱子推入了另一目的地,自然,ID也應(yīng)是。
map[i][j-1]=9; //人站在了目的地上。
//下面是對人原先站立地進(jìn)行判斷,方法同上。
if(map[i][j]==9)
map[i][j]=3;
else
map[i][j]=0;
}
}
break;
case 'd':
//如果人前面是空地。
if(map[i][j+1]==0)
{
map[i][j+1]=6+0; //人往前走一步,ID為人的ID()加上空地的ID()。
if(map[i][j]==9) //如果當(dāng)前人站的位置為目的地,則ID為(即人的ID()加上目的地ID())。
map[i][j]=3; //將人往前走一步后原地的ID修改為空地ID()。
else
map[i][j]=0; //否則原地ID修改為空地ID 。
}
//如果人前面是目的地。
else if(map[i][j+1]==3)
{
map[i][j+1]=6+3; //人往前走一步,ID為人ID+目的地ID=9。
if(map[i][j]==9) //如果原地也是目的地(ID為)。
map[i][j]=3; //人走后把原地ID修改回目的地ID。
else
map[i][j]=0; //否則原地ID修改為為空地ID
}
//如果人前面是箱子。
else if(map[i][j+1]==4)
{
//如果人前面是箱子,而箱子前面是空地。
if (map[i][j+2]==0)
{
map[i][j+2]=4; //人推箱子往前走一步,把空地ID修改為箱子ID()
//下面是對箱子原地進(jìn)行判斷
if(map[i][j+1]==7) //如果箱子原地為目的地。
map[i][j+1]=9; //人站在箱子的原地(目的地)時該地ID應(yīng)該為人的ID+目的地ID=9。
else
map[i][j+1]=6; //否則,人站在了原來的空地上,ID應(yīng)該為+0=6。
//下面是對人原地進(jìn)行判斷
if(map[i][j]==9) //如果之前是目的地。
map[i][j]=3; //人走了之后修改回目的地ID。
else
map[i][j]=0; //否則就是空地。
}
//如果人的前面是箱子,而箱子前面是目的地。
else if (map[i][j+2]==3)
{
count++;
map[i][j+2]=7; //ID為(目的地ID()+箱子ID()=7),表示已經(jīng)把箱子推入了目的地。
//下面是對箱子原先位置的判斷,同上。
if(map[i][j+1]==7)
map[i][j+1]=9;
else
map[i][j+1]=6;
//下面是對人原先位置進(jìn)行判斷,同上。
if(map[i][j]==9)
map[i][j]=3;
else
map[i][j]=0;
}
}
//如果人前面是已經(jīng)進(jìn)入某目的地的箱子(ID=7)。
else if(map[i][j+1]==7)
{
//如果人前面是已經(jīng)進(jìn)入某目的地的箱子,而箱子前面是空地。
if(map[i][j+2]==0)
{
count--;
map[i][j+2]=4; //把箱子重新推到空地上,ID=箱子ID+空地ID=4。
map[i][j+1]=9; //人自然而然的就站在了原先的目的地上了。
//下面是對人原先地進(jìn)行判斷,方法同上。
if(map[i][j]==9)
map[i][j]=3;
else
map[i][j]=0;
}
//如果人前面是已經(jīng)進(jìn)入某目的地的箱子,而箱子前面是另一目的地。
if(map[i][j+2]==3)
{
map[i][j+2]=7; //把箱子推入了另一目的地,自然,ID也應(yīng)是。
map[i][j+1]=9; //人站在了目的地上。
//下面是對人原先站立地進(jìn)行判斷,方法同上。
if(map[i][j]==9)
map[i][j]=3;
else
map[i][j]=0;
}
}
break;
}
if(count==8) //如果分?jǐn)?shù)達(dá)到分
{
system("CLS"); //清屏
draw_map(map);
break; //退出死循環(huán)
}
}
printf("\n恭喜你,過關(guān)了??!\n"); //過關(guān)提示
return 0;
}
void draw_map(int map[10][12])
{
for(i=0;i<10;i++)
{
for(j=0;j<12;j++)
{
switch(map[i][j])
{
case 0:
printf(" "); //數(shù)字代表道路
break;
case 1:
printf("#"); //數(shù)字代表墻壁
break;
case 2:
printf(" "); //數(shù)字是游戲邊框的空白部分
break;
case 3:
printf("!"); //數(shù)字代表目的地
break;
case 4:
printf("*"); //數(shù)字代表箱子
break;
case 7:
printf("$"); //數(shù)字代表箱子進(jìn)入目的地
break;
case 6:
printf("@"); //數(shù)字代表人
break;
case 9:
printf("@"); //數(shù)字代表人進(jìn)入目的地
break;
}
}
printf("\n"); //分行輸出
}
}
更多有趣的經(jīng)典小游戲?qū)崿F(xiàn)專題,分享給大家:
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C語言關(guān)鍵字auto與register及static專項(xiàng)詳解
這篇文章主要解釋了c語言中什么是數(shù)據(jù)類型,什么是變量,他們的真正含義是什么。分析了屬性關(guān)鍵字auto,register和static的用法2022-07-07
C語言實(shí)現(xiàn)靜態(tài)順序表的實(shí)例詳解
這篇文章主要介紹了C語言實(shí)現(xiàn)靜態(tài)順序表的實(shí)例詳解的相關(guān)資料,這里提供是幫助大家學(xué)習(xí)理解這部分內(nèi)容,需要的朋友可以參考下2017-08-08
Opencv2.4.9函數(shù)HoughLinesP分析
這篇文章主要為大家詳細(xì)介紹了Opencv2.4.9函數(shù)HoughLinesP,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01
Qt中const?QString轉(zhuǎn)換?char?*可能的坑
本文主要介紹了Qt中const?QString轉(zhuǎn)換?char?*可能的坑,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
詳解C語言中的rename()函數(shù)和remove()函數(shù)的使用方法
這篇文章主要介紹了詳解C語言中的rename()函數(shù)和remove()函數(shù)的使用方法,是C語言入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-09-09
構(gòu)造函數(shù)定義為private或者protected的好處
從語法上來講,一個函數(shù)被聲明為protected或者private,那么這個函數(shù)就不能從“外部”直接被調(diào)用了。對于protected的函數(shù),子類的“內(nèi)部”的其他函數(shù)可以調(diào)用之。而對于private的函數(shù),只能被本類“內(nèi)部”的其他函數(shù)說調(diào)用2013-10-10

