前言
基于C++编写的推箱子小游戏,功能尚未完善,今后应该会更新。编译通过,运行的环境:vs2019,Devc++,其它编译器没有测试一、实现功能
设置:空地0:空格,墙1:■,人5:♀,
箱子7:●,目标点8:○,成功9:◎
人与标记点重合6。
实现了人物的上下左右移动,与箱子的碰撞检测,与目标点的碰撞,与墙的碰撞,过关成功判定,跳到下一关。
二、演示
1.代码
代码如下(示例):
#include<iostream>
#include<stdlib.h>//system("cls") 头文件
#include"conio.h"//_getch()头文件,要加"_"
using namespace std;
/*推箱子*/
/*
空地0:空格,墙1:■,人5:♀,
箱子7:●,目标点8:○,成功9:◎
人与标记点重合6:
后期添加选关,菜单,悔步
*/
int hero_x=0;
int hero_y=0;
int aa = 0, bb = 0;//因为上下左右方向的函数差不多的,
//定义aa,bb两个量作为地图的行偏移量和列偏移量,以达到化简程序的目的
int guanShu = 0;//现在是第几关
int arr[2][10][10] = {
{
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1,},
{1, 0, 0, 0, 0, 0, 0, 0, 0, 1,},
{1, 0, 0, 0, 0, 8, 0, 0, 0, 1,},
{1, 0, 0, 0, 0, 0, 0, 0, 0, 1,},
{1, 0, 0, 0, 0, 0, 0, 0, 0, 1,},
{1, 0, 7, 0, 7, 0, 0, 0, 5, 1,},
{1, 0, 0, 0, 0, 0, 0, 0, 0, 1,},
{1, 0, 0, 8, 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,},
},
{
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1,},
{1, 0, 0, 0, 0, 0, 0, 0, 0, 1,},
{1, 0, 0, 0, 0, 0, 0, 0, 0, 1,},
{1, 0, 0, 0, 7, 0, 0, 0, 0, 1,},
{1, 0, 0, 0, 5, 0, 0, 0, 0, 1,},
{1, 0, 0, 0, 0, 0, 0, 0, 0, 1,},
{1, 0, 0, 0, 0, 0, 0, 0, 0, 1,},
{1, 0, 0, 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 main() {
void map(int);
void action(int);
void tiShi();
tiShi();
action(0);
return 0;
}
void map( int n) {//地图函数,打印函数
for (int i=0;i<10;i++) {
for (int j=0;j<10;j++) {
switch (arr[n][i][j]) {
case 0:cout << " "; break;//空地
case 1:cout << "■"; break;//墙
case 5:
case 6:cout << "♀"; break;//5,6是人
case 7:cout << "●"; break;//箱子
case 8:cout << "○"; break;//目标点
case 9:cout << "◎"; break;//成功
}
}
cout << endl;//打印一排换行
}
}
void site(int n) {//找到当前人物的位置
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
if (arr[n][i][j] == 5||arr[n][i][j]==6) {
hero_x = i;
hero_y = j;
break;
}
}
}
}
void action(int n) {
void site(int);//声明
void map(int);//地图函数的声明
void direction(int n);//方向移动函数
void win(int);//判断成功
map(n);//刚开始时调用一次地图
while (1) {
char ch;
ch=_getch();//用getchar,回车也是字符
if (ch == 't') break;//按t退出
switch (ch) {
case 'w':
case 'W':aa = -1; bb = 0; direction(n); break;
case 's':
case 'S':aa = 1; bb = 0; direction(n); break;
case 'a':
case 'A':aa = 0; bb = -1; direction(n); break;
case 'd':
case 'D':aa = 0; bb = 1; direction(n); break;
}
system("cls");//清除控制台内容
map(n);//移动一次,打印一次地图
win(n);
}
}
void direction(int n) {//向上移动函数
void site(int);//声明
site(n);
int x, y;//先传入位置
x = hero_x;
y = hero_y;
if (arr[n][x+aa][y+bb]==0 ||arr[n][x+aa][y+bb] == 8 || ((arr[n][x+aa][y+bb] == 7||arr[n][x+aa][y+bb]==9 )&& (arr[n][x+2*aa][y+2*bb] != 7 && arr[n][x+2*aa][y+2*bb] != 1))) {
//上个位置是空地或是成功点或是箱子
if (arr[n][x][y] == 5) {
switch (arr[n][x+aa][y+bb]) {//人物的上一个位置
case 0:
arr[n][x][y] = 0;
arr[n][x+aa][y+bb] = 5;
break;
case 8:
arr[n][x][y] = 0;
arr[n][x+aa][y+bb] = 6;
break;
case 7:
if (arr[n][x+2*aa][y+2*bb] == 0) {//上两格位置是空地
arr[n][x][y] = 0;
arr[n][x+aa][y+bb] = 5;
arr[n][x+2*aa][y+2*bb] = 7;
}
else {//上两格位置是目的地
arr[n][x][y] = 0;
arr[n][x+aa][y+bb] = 5;
arr[n][x+2*aa][y+2*bb] = 9;
}
break;
case 9:
if (arr[n][x+2*aa][y+2*bb] == 0) {//上两格位置是空地
arr[n][x][y] = 0;
arr[n][x+aa][y+bb] = 6;
arr[n][x+2*aa][y+2*bb] = 7;
}
else {//上两格位置是目的地
arr[n][x][y] = 0;
arr[n][x+aa][y+bb] = 6;
arr[n][x+2*aa][y+2*bb] = 9;
}
break;
}
}
else if (arr[n][x][y] == 6) {//现在在目标点上
switch (arr[n][x+aa][y+bb]) {//人物的上一个位置
case 0:
arr[n][x][y] = 8;
arr[n][x+aa][y+bb] = 5;
break;
case 8:
arr[n][x][y] = 8;
arr[n][x+aa][y+bb] = 6;
break;
case 7:
if (arr[n][x+2*aa][y+2*bb] == 0) {//下两格位置是空地
arr[n][x][y] = 8;
arr[n][x+aa][y+bb] = 5;
arr[n][x+2*aa][y+2*bb] = 7;
}
else {//下两格位置是目的地
arr[n][x][y] = 8;
arr[n][x+aa][y+bb] = 6;
arr[n][x+2*aa][y+2*bb] = 9;
}
break;
case 9:
if (arr[n][x+2*aa][y+2*bb] == 0) {//上两格位置是空地
arr[n][x][y] = 8;
arr[n][x+aa][y+bb] = 6;
arr[n][x+2*aa][y+2*bb] = 7;
}
else {//上两格位置是目的地
arr[n][x][y] = 8;
arr[n][x+aa][y+bb] = 6;
arr[n][x+2*aa][y+2*bb] = 9;
}
break;
}
}
}
}
void win(int n) {
void action(int );//声明行动函数
bool K=true;
for (int i = 0;i<10;i++) {
for (int j = 0;j<10;j++) {
if (arr[n][i][j] == 7) K = false;
}
}
if (K) {
cout << endl<<"===过关===" << endl;
cout << "-->输入T退出<--" << endl;
cout << "***按任意键下一关***" << endl;
char ch;
ch = _getch();
if (ch == 't' || ch == 'T') {
exit(0);//直接退出
}
else {
system("cls");
action(++guanShu);
}
}
}
void tiShi() {
cout << "***----->欢迎游玩推箱子益智小游戏<------***" << endl;
cout << "*** w:上 s:下 a:左 d:右 ***" << endl;
cout << "*** 按T退出 ***" << endl;
cout << "*** 敬请期待更新 ***" << endl;
cout << "*** 2021/4/16 ***" << endl;
cout << "*******************************************" << endl;
}
2.程序运行结果
开始:
过关:
第二关:
总结
本推箱子小游戏全由博主一点一点手敲上去的,如果对你有用,点个
有什么疑惑可以评论哦!