c++小白如何寫出推箱子

2020-09-29 14:00:11

上次我發了一個移動小遊戲,但我本人都覺得無聊,所以今天發一個推箱子吧(不知道用什麼語氣詞)
首先,請看一下我的上一篇遊戲文章,學一下基礎
移動小遊戲
看完了嗎,好,開始我們今天的實戰吧!
首先,我們要做好地圖和標頭檔案

#include <iostream>
#include <cstdio>
#include <conio.h>
#include <windows.h>
using namespace std;
char a[100][100]={
		"################",
		"#*             #",
		"#     &  !     #",
		"#   &      !   #",
		"#  !      &    #",
		"################",
	};
int main(){
	for(int i=0;i<=15;i++)
		puts(a[i]);
	return 0;
}

這個我們以*為人,&為箱子,!為要把箱子推到的地方
接著,開始移動吧!
但是,我們不僅要讓人走,箱子也要走,所以我們要再添幾個判斷:
如果前面有一個箱子,就推動它;
如果前面有兩個及以上的箱子,就不動;
如果把箱子推到了要推到的地方,就清空箱子
我們可以在按下按鍵的同時判斷
OK,現在我們只要先搞一個while迴圈,再用ch去_getch(),再判斷是什麼鍵和移動
這裡建議用switch:

#include <iostream>
#include <cstdio>
#include <conio.h>
#include <windows.h>
using namespace std;
char ch;
int x=1,y=1;
char a[100][100]={
		"################",
		"#*             #",
		"#     &  !     #",
		"#   &      !   #",
		"#  !      &    #",
		"################",
	};
int main(){
	system("title 推箱子小遊戲");
	for(int i=0;i<=10;i++)
		puts(a[i]);
	while(1){
		ch=_getch();
		switch(ch){
			case 'w':
				if(a[x-1][y]!='#'){
					a[x][y]=' ';
					x--;
					a[x][y]='*';
				}
				break;
			case 's':
				if(a[x+1][y]!='#'){
					a[x][y]=' ';
					x++;
					a[x][y]='*';
				}
				break;
			case 'a':
				if(a[x][y-1]!='#'){
					a[x][y]=' ';
					y--;
					a[x][y]='*';
				}
				break;
			case 'd':
				if(a[x][y+1]!='#'){
					a[x][y]=' ';
					y++;
					a[x][y]='*';
				}
				break;
		}
		system("cls");
		for(int i=0;i<=10;i++)
			puts(a[i]);
	}
	return 0;
}

偵錯一下,讓小人再上面走走,哎呀,走遍整個地圖後,小人怎麼把東西都"吃掉"了啊,這可不行,因為我們少了點判斷:
在每個按鍵的中間加一條判斷,OK,先判斷是不是箱子:

case 'w':
	if(a[x-1][y]==' '){
		a[x][y]=' ';
		x--;
		a[x][y]='*';
	}
	else if(a[x-1][y]=='&'){//如果是箱子 
		if(a[x-2][y]==' '){//如果前面都沒有 
			a[x][y]=' ';//移動 
			x--;
			a[x][y]='*';
			a[x-1][y]='&';
		}
	}
	break;

我這裡示範了上移鍵,如果人前面是空的,那就走,是箱子的話,就再判斷箱子前面是不是空的如果是就移動
好了,那還等啥,擼起袖子加油幹,別的鍵也寫一下吧!
好,先把目前程式碼放出來:

#include <iostream>
#include <cstdio>
#include <conio.h>
#include <windows.h>
using namespace std;
char ch;
int x=1,y=1;
char a[100][100]={
		"################",
		"#*             #",
		"#     &  !     #",
		"#   &      !   #",
		"#  !      &    #",
		"################",
	};
int main(){
	system("title 推箱子小遊戲");
	for(int i=0;i<=10;i++)
		puts(a[i]);
	while(1){
		ch=_getch();
		switch(ch){
			case 'w':
				if(a[x-1][y]==' '){
					a[x][y]=' ';
					x--;
					a[x][y]='*';
				}
				else if(a[x-1][y]=='&'){//如果是箱子 
					if(a[x-2][y]==' '){//如果前面都沒有 
						a[x][y]=' ';//移動 
						x--;
						a[x][y]='*';
						a[x-1][y]='&';
					}
				}
				break;
			case 's':
				if(a[x+1][y]==' '){
					a[x][y]=' ';
					x++;
					a[x][y]='*';
				}
				else if(a[x+1][y]=='&'){//如果是箱子 
					if(a[x+2][y]==' '){//如果前面都沒有 
						a[x][y]=' ';//移動 
						x++;
						a[x][y]='*';
						a[x+1][y]='&';
					}
				}
				break;
			case 'a':
				if(a[x][y-1]==' '){
					a[x][y]=' ';
					y--;
					a[x][y]='*';
				}
				else if(a[x][y-1]=='&'){//如果是箱子 
					if(a[x][y-2]==' '){//如果前面都沒有 
						a[x][y]=' ';//移動 
						y--;
						a[x][y]='*';
						a[x][y-1]='&';
					}
				}
				break;
			case 'd':
				if(a[x][y+1]==' '){
					a[x][y]=' ';
					y++;
					a[x][y]='*';
				}
				else if(a[x][y+1]=='&'){//如果是箱子 
					if(a[x][y+2]==' '){//如果前面都沒有 
						a[x][y]=' ';//移動 
						y++;
						a[x][y]='*';
						a[x][y+1]='&';
					}
				}
				break;
		}
		system("cls");
		for(int i=0;i<=10;i++)
			puts(a[i]);
	}
	return 0;
}

OK,推一推,是不是可以了?但是,我們把它推到"!"時,卻不能動了,因為我們少了一層判斷:

case 'w':
	if(a[x-1][y]==' '){
		a[x][y]=' ';
		x--;
		a[x][y]='*';
	}
	else if(a[x-1][y]=='&'){//如果是箱子 
		if(a[x-2][y]==' '){//如果前面都沒有 
			a[x][y]=' ';//移動 
			x--;
			a[x][y]='*';
			a[x-1][y]='&';
		}
		else if(a[x-2][y]=='!'){//如果前面是"!" 
			a[x][y]=' ';
			x--;//人物移動 
			a[x][y]='*';
			a[x-1][y]=' ';//前方清空 
		}
	}
	break;

可以看到,這裡依然用上移鍵做示範:如果是要推到的地方,就人物移動,再把前方清空,OK,把別的也寫上吧!
好,再把目前的程式碼放出來:

#include <iostream>
#include <cstdio>
#include <conio.h>
#include <windows.h>
using namespace std;
char ch;
int x=1,y=1;
char a[100][100]={
		"################",
		"#*             #",
		"#     &  !     #",
		"#   &      !   #",
		"#  !      &    #",
		"################",
	};
int main(){
	system("title 推箱子小遊戲");
	for(int i=0;i<=10;i++)
		puts(a[i]);
	while(1){
		ch=_getch();
		switch(ch){
			case 'w':
				if(a[x-1][y]==' '){
					a[x][y]=' ';
					x--;
					a[x][y]='*';
				}
				else if(a[x-1][y]=='&'){//如果是箱子 
					if(a[x-2][y]==' '){//如果前面都沒有 
						a[x][y]=' ';//移動 
						x--;
						a[x][y]='*';
						a[x-1][y]='&';
					}
					else if(a[x-2][y]=='!'){//如果前面是"!" 
						a[x][y]=' ';
						x--;//人物移動 
						a[x][y]='*';
						a[x-1][y]=' ';//前方清空 
					}
				}
				break;
			case 's':
				if(a[x+1][y]==' '){
					a[x][y]=' ';
					x++;
					a[x][y]='*';
				}
				else if(a[x+1][y]=='&'){//如果是箱子 
					if(a[x+2][y]==' '){//如果前面都沒有 
						a[x][y]=' ';//移動 
						x++;
						a[x][y]='*';
						a[x+1][y]='&';
					}
					else if(a[x+2][y]=='!'){//如果前面是"!" 
						a[x][y]=' ';
						x++;//人物移動 
						a[x][y]='*';
						a[x+1][y]=' ';//前方清空 
					}
				}
				break;
			case 'a':
				if(a[x][y-1]==' '){
					a[x][y]=' ';
					y--;
					a[x][y]='*';
				}
				else if(a[x][y-1]=='&'){//如果是箱子 
					if(a[x][y-2]==' '){//如果前面都沒有 
						a[x][y]=' ';//移動 
						y--;
						a[x][y]='*';
						a[x][y-1]='&';
					}
					else if(a[x][y-2]=='!'){//如果前面是"!" 
						a[x][y]=' ';
						y--;//人物移動 
						a[x][y]='*';
						a[x][y-1]=' ';//前方清空 
					}
				}
				break;
			case 'd':
				if(a[x][y+1]==' '){
					a[x][y]=' ';
					y++;
					a[x][y]='*';
				}
				else if(a[x][y+1]=='&'){//如果是箱子 
					if(a[x][y+2]==' '){//如果前面都沒有 
						a[x][y]=' ';//移動 
						y++;
						a[x][y]='*';
						a[x][y+1]='&';
					}
					else if(a[x][y+2]=='!'){//如果前面是"!" 
						a[x][y]=' ';
						y++;//人物移動 
						a[x][y]='*';
						a[x][y+1]=' ';//前方清空 
					}
				}
				break;
		}
		system("cls");
		for(int i=0;i<=10;i++)
			puts(a[i]);
	}
	return 0;
}

好了,但是推完了,電腦好像並木有給你驚喜,應為我們還沒寫呢!
我們的思路是:每推好一個箱子就用一個變數(初始化為0)+1(這裡用sum),當sum等於箱子數,就退出迴圈,說出「你勝利了"的臺詞,如這樣:

else if(a[x-2][y]=='!'){//如果前面是"!" 
	a[x][y]=' ';
	x--;//人物移動 
	a[x][y]='*';
	a[x-1][y]=' ';//前方清空 
	sum++;
}

好,再改一下while的條件:while(sum<3)(這裡有3個箱子)一個超級簡單的推箱子就完成了(p≧w≦q)!
下面放一下程式碼:

#include <iostream>
#include <cstdio>
#include <conio.h>
#include <windows.h>
using namespace std;
char ch;
int x=1,y=1,sum=0;
char a[100][100]={
		"################",
		"#*             #",
		"#     &  !     #",
		"#   &      !   #",
		"#  !      &    #",
		"################",
	};
int main(){
	system("title 推箱子小遊戲");
	for(int i=0;i<=10;i++)
		puts(a[i]);
	while(sum<3){
		ch=_getch();
		switch(ch){
			case 'w':
				if(a[x-1][y]==' '){
					a[x][y]=' ';
					x--;
					a[x][y]='*';
				}
				else if(a[x-1][y]=='&'){//如果是箱子 
					if(a[x-2][y]==' '){//如果前面都沒有 
						a[x][y]=' ';//移動 
						x--;
						a[x][y]='*';
						a[x-1][y]='&';
					}
					else if(a[x-2][y]=='!'){//如果前面是"!" 
						a[x][y]=' ';
						x--;//人物移動 
						a[x][y]='*';
						a[x-1][y]=' ';//前方清空 
						sum++;
					}
				}
				break;
			case 's':
				if(a[x+1][y]==' '){
					a[x][y]=' ';
					x++;
					a[x][y]='*';
				}
				else if(a[x+1][y]=='&'){//如果是箱子 
					if(a[x+2][y]==' '){//如果前面都沒有 
						a[x][y]=' ';//移動 
						x++;
						a[x][y]='*';
						a[x+1][y]='&';
					}
					else if(a[x+2][y]=='!'){//如果前面是"!" 
						a[x][y]=' ';
						x++;//人物移動 
						a[x][y]='*';
						a[x+1][y]=' ';//前方清空 
						sum++;
					}
				}
				break;
			case 'a':
				if(a[x][y-1]==' '){
					a[x][y]=' ';
					y--;
					a[x][y]='*';
				}
				else if(a[x][y-1]=='&'){//如果是箱子 
					if(a[x][y-2]==' '){//如果前面都沒有 
						a[x][y]=' ';//移動 
						y--;
						a[x][y]='*';
						a[x][y-1]='&';
					}
					else if(a[x][y-2]=='!'){//如果前面是"!" 
						a[x][y]=' ';
						y--;//人物移動 
						a[x][y]='*';
						a[x][y-1]=' ';//前方清空 
						sum++;
					}
				}
				break;
			case 'd':
				if(a[x][y+1]==' '){
					a[x][y]=' ';
					y++;
					a[x][y]='*';
				}
				else if(a[x][y+1]=='&'){//如果是箱子 
					if(a[x][y+2]==' '){//如果前面都沒有 
						a[x][y]=' ';//移動 
						y++;
						a[x][y]='*';
						a[x][y+1]='&';
					}
					else if(a[x][y+2]=='!'){//如果前面是"!" 
						a[x][y]=' ';
						y++;//人物移動 
						a[x][y]='*';
						a[x][y+1]=' ';//前方清空 
						sum++;
					}
				}
				break;
		}
		system("cls");
		for(int i=0;i<=10;i++)
			puts(a[i]);
	}
	cout<<"你勝利了!";
	return 0;
}

好了,今天的遊戲時間就結束吧,下集——貪吃蛇,讓我們拭目以待吧!