算是做个记录吧,
支持功能:撞墙检测,箱子推动判定(多个箱子和靠墙),得分点设置等
开发用的面向过程的思想
#include <iostream>
using namespace std;
const int NUM = 10;
struct point {
int x;
int y;
}pt[NUM];//表示得分点
struct box {
int x;
int y;
}bx[NUM];//表示箱子
const int bxnum = 2;//箱子个数
int px = 1, py = 5;
int tx, ty;//临时坐标
char maze[NUM][NUM] = {
"########",
"# .. p #",
"# oo #",
"# #",
"########"
};
void getinput();
void updategame();
void draw();
bool ishit(int x, int y);
bool isbox(int x, int y);
int main()
{
pt[0].x = 1;
pt[0].y = 2;
pt[1].x = 1;
pt[1].y = 3;
bx[0].x = 2;
bx[0].y = 2;
bx[1].x = 2;
bx[1].y = 3;
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 8; j++) {
cout << maze[i][j];
}
cout << endl;
}
while (true) {
int ret = 1;//游戏结束为1
getinput();
updategame();
draw();
for (int i = 0; i < bxnum; i++) {
if (isbox(pt[i].x,pt[i].y)==0) {//只要有一个得分点的位置没有箱子,游戏继续
ret = 0;
}
}
if (ret == 1) {
cout << "成功过关!!!" << endl;
break;
}
}
return 0;
}
bool ishit(int x,int y) {//撞墙
int ret = 0;//未撞墙
if (maze[x][y] == '#') {
ret = 1;
}
return ret;
}
bool isbox(int x, int y) {//撞箱子
int ret = 0;//
if (maze[x][y] == 'o') {
ret = 1;
}
return ret;
}
void movebox(int x, int y, int afx, int afy) {
for (int i = 0; i < bxnum; i++) {
if (bx[i].x == x && bx[i].y == y) {
bx[i].x = afx;//箱子被推了
bx[i].y = afy;
}
}
}
void getinput()//wsad移动
{
int isreturn = 0;
tx=px, ty=py;
maze[px][py] = ' ';
char c;
cin >> c;
switch (c) {
case 'w':
px -= 1;
if (isbox(px, py)) {//推箱子
if ((isbox(px - 1, py) || ishit(px - 1, py))) { //推不动:1两个箱子,2箱子撞墙
isreturn = 1;
}
else {//能推动
movebox(px, py, px - 1, py);
}
}
break;
case 's':
px += 1;
if (isbox(px, py)) {//推箱子
if ((isbox(px + 1, py) || ishit(px + 1, py))) { //推不动:1两个箱子,2箱子撞墙
isreturn = 1;
}
else {//能推动
movebox(px, py, px + 1, py);
}
}
break;
case 'a':
py -= 1;
if (isbox(px, py)) {//推箱子
if ((isbox(px, py-1) || ishit(px, py-1))) { //推不动:1两个箱子,2箱子撞墙
isreturn = 1;
}
else {//能推动
movebox(px, py, px, py-1);
}
}
break;
case 'd':
py += 1;
if (isbox(px, py)) {//推箱子
if ((isbox(px, py + 1) || ishit(px, py + 1))) { //推不动:1两个箱子,2箱子撞墙
isreturn = 1;
}
else {//能推动
movebox(px, py, px, py + 1);
}
}
break;
default:
//出错了
break;
}
if (ishit(px, py)) {
isreturn = 1;
}
if (isreturn) {
px = tx;
py = ty;
}
}
void updategame()
{
if (px >= 0 && px < 8 && py >= 0 && py < 8) {//更新p的位置
maze[px][py] = 'p';
}
for (int i = 0; i < bxnum; i++) {//
if (maze[pt[i].x][pt[i].y]!= 'p'&& maze[pt[i].x][pt[i].y]!='o') {//更新得分点位置
maze[pt[i].x][pt[i].y] = '.';
}
}
for (int i = 0; i < bxnum; i++) {//更新箱子位置
maze[bx[i].x][bx[i].y] = 'o';
}
}
void draw() {
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 8; j++) {
cout << maze[i][j];
}
cout << endl;
}
}