问题标题: 酷町堂:有游戏推荐——推箱子

0
1
已解决
刘欣然
刘欣然
高级光能
高级光能

// ConsoleApplication2.cpp : 定义控制台应用程序的入口点。

//

 

#include "stdafx.h"

#include<iostream>

#include<windows.h>

#define KEY_DOWN(vk_code) GetAsyncKeyState(vk_code) & 0x8000 ? 1 : 0

using namespace std;

 

void Map();

void PlayerMove();

void Menu();

void BoxMove();

 

//extern int Array[15][20];

//定义菜单状况

int nMenuState = 1;

//定义选关设置

int nSetState = 1;

//定义关卡状态

int PassState = 1;

//定义选关情况

bool bslect = false;

 

int Array1[15][20] = {

 { 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,0,0,0,0,0,0,0,0,0,0,1 },

 { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },

 { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },

 { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },

 { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },

 { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },

 { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },

 { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },

 { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },

 { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },

 { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },

 { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },

 { 1,0,0,0,0,0,0,0,0,0,0,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 },

};

int Array2[15][20] = {

 { 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,0,0,0,0,0,0,0,0,0,0,1 },

 { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },

 { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },

 { 1,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,1 },

 { 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1 },

 { 1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1 },

 { 1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1 },

 { 1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1 },

 { 1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1 },

 { 1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1 },

 { 1,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,1 },

 { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },

 { 1,0,0,0,0,0,0,0,0,0,0,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 },

};

int Array3[15][20] = {

 { 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,0,0,0,0,0,0,0,0,0,0,1 },

 { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },

 { 1,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,1 },

 { 1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1 },

 { 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1 },

 { 1,0,0,0,0,0,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,1 },

 { 1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1 },

 { 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1 },

 { 1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1 },

 { 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1 },

 { 1,0,0,0,0,0,0,1,1,1,1,1,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 },

};

int Array[15][20] = {};

 

 

struct Player {

 int P_row;

 int P_col;

 int P_rowBk;

 int P_colBk;

 Player() {

 P_row = 0;

 P_col = 0;

 P_rowBk = 0;

 P_colBk = 0;

 }

 Player(int x = 10, int y = 10) {

 P_row = x;

 P_col = y;

 P_rowBk = x;

 P_colBk = y;

 }

 void BackUp() {

 P_rowBk = P_row;

 P_colBk = P_col;

 }

 void restore() {

 P_row = P_rowBk;

 P_col = P_colBk;

 }

};

//Player splayer(1, 1); //初始化玩家坐标

Player splayer = {1,1};

 

struct Box {

 int box_x;

 int box_y;

 int box_xx;//用来备份坐标

 int box_yy;

 Box() {

 box_x = 0;

 box_y = 0;

 box_xx = 0;

 box_yy = 0;

 }

 Box(int x = 10, int y = 10) {

 box_x = x;

 box_y = y;

 box_xx = box_x;

 box_yy = box_y;

 }

 void BackUp() {

 box_xx = box_x;

 box_yy = box_y;

 }

 void restore() {

 box_x = box_xx;

 box_y = box_yy;

 }

};

//第一关箱子坐标初始化

Box sbox[3] = {

 { 5,5 },

 { 6,6 },

 { 7,7 }

};

 

//坑结构体

struct Destinate {

 int Des_x;

 int Des_y;

 Destinate(int a, int b) {

 Des_x = a;

 Des_y = b;

 }

};

Destinate sdestinate[3] = {

 { 8,8 },

 { 9,9 },

 { 10,10 }

};

 

//选关设置

void SetChoise() {

 while (1) {

 system("cls");

 if (KEY_DOWN(VK_UP)) {

 //cout << "向上被按下" << endl;

 --nSetState;

 if (nSetState < 1) { nSetState = 3; }

 }

 if (KEY_DOWN(VK_DOWN)) {

 //cout << "向下被按下" << endl;

 ++nSetState;

 if (nSetState > 3) { nSetState = 1; }

 }

  

 switch (nSetState) {

 case 1: cout << "********游戏选关设置********" << endl;

 cout << " -> 1、关卡一" << endl;

 cout << " 2、关卡二" << endl;

 cout << " 3、关卡三" << endl;

 system("pause");

 break;

 case 2: cout << "********游戏选关设置********" << endl;

 cout << " 1、关卡一" << endl;

 cout << " -> 2、关卡二" << endl;

 cout << " 3、关卡三" << endl;

 system("pause");

 break;

 case 3: cout << "********游戏选关设置********" << endl;

 cout << " 1、关卡一" << endl;

 cout << " 2、关卡二" << endl;

 cout << " -> 3、关卡三" << endl;

 system("pause");

 break;

 }

 if (KEY_DOWN(VK_RETURN)) {

 if (1 == nSetState) {

 memcpy(Array, Array1, sizeof(Array));

 splayer.P_row = 1;

 splayer.P_col = 1;

 PassState = 1;

 for (int i = 0; i < 3; i++) {

 sbox[i].box_x = 5 + i;

 sbox[i].box_y = 5 + i;

 sdestinate[i].Des_x = 8 + i;

 sdestinate[i].Des_y = 8 + i;

 }

 }

 else if (2 == nSetState) {

 memcpy(Array, Array2, sizeof(Array));

 splayer.P_row = 1;

 splayer.P_col = 1;

 PassState = 2;

 for (int i = 0; i < 3; i++) {

 sbox[i].box_x = 5 + i;

 sbox[i].box_y = 5 + i;

 sdestinate[i].Des_x = 3 + i;

 sdestinate[i].Des_y = 3;

 }

 }

 else if (3 == nSetState) {

 memcpy(Array, Array3, sizeof(Array));

 splayer.P_row = 1;

 splayer.P_col = 1;

 PassState = 3;

 memcpy(Array, Array3, sizeof(Array));

 for (int i = 0; i < 3; i++) {

 sbox[i].box_x = 10;

 sbox[i].box_y = 7 + i;

 sdestinate[i].Des_x = 2 + i;

 sdestinate[i].Des_y = 2;

 }

 }

 bslect = true;

 break;

 }

 }

}

//判断玩家移动

void PlayerMove() {

 splayer.BackUp();

 if (KEY_DOWN(VK_UP)) {

 --splayer.P_row;

 }

 if (KEY_DOWN(VK_DOWN)) {

 ++splayer.P_row;

 }

 if (KEY_DOWN(VK_LEFT)) {

 --splayer.P_col;

 }

 if (KEY_DOWN(VK_RIGHT)) {

 ++splayer.P_col;

 }

 if (1 == Array[splayer.P_row][splayer.P_col]) {//判断玩家是否越墙

 splayer.restore();

 }

}

//判断箱子移动

void BoxMove() {

 for (int i = 0; i < 3; i++) {

 sbox[i].BackUp();

 }

 int skew_x = 0; //临时偏移量

 int skew_y = 0;

 for (int s = 0; s < 3; s++) { //利用坐标偏移量求箱子新位置

 if (splayer.P_row == sbox[s].box_x && splayer.P_col == sbox[s].box_y) {

 skew_x = sbox[s].box_x - splayer.P_rowBk;

 skew_y = sbox[s].box_y - splayer.P_colBk;

 sbox[s].box_x = sbox[s].box_x + skew_x;

 sbox[s].box_y = sbox[s].box_y + skew_y;

 /*sbox[s].restore();*/

 }

 }

 for (int a = 0; a < 3; a++) {

 for (int b = 0; b < 3; b++) {

 if (a != b && (sbox[a].box_x == sbox[b].box_x && sbox[a].box_y == sbox[b].box_y)) {

 splayer.restore();

 sbox[a].restore();

 }

 }

 }

 for (int s = 0; s < 3; s++) { //判断箱子是否越界

 if (1 == Array[sbox[s].box_x][sbox[s].box_y]) {

 splayer.restore();

 sbox[s].restore();

 }

 }

}

 

//判断胜利

void JudgeWin() {

 int nCorrectNum = 0; //判断箱子推到正确位置的数量

 for (int i = 0; i < 3; i++) {

 for (int j = 0; j < 3; j++) {

 if (sdestinate[i].Des_x == sbox[j].box_x && sdestinate[i].Des_y == sbox[j].box_y) {

 ++nCorrectNum;

 break;

 }

 }

 if (3 <= nCorrectNum) {

 //system("cls");

 cout << "You Win!" << endl;

 ++PassState;

 if (2 == PassState) {

 memcpy(Array, Array2, sizeof(Array));

 //更新玩家位置

 splayer.P_row = 1;

 splayer.P_col = 1;

 //更新箱子和坑状态

 for (int i = 0; i < 3; i++) {

 sbox[i].box_x = 5 + i;

 sbox[i].box_y = 5 + i;

 sdestinate[i].Des_x = 3 + i;

 sdestinate[i].Des_y = 3;

 }

 }

 if (3 == PassState) {

 splayer.P_row = 1;

 splayer.P_col = 1;

 memcpy(Array, Array3, sizeof(Array));

 for (int i = 0; i < 3; i++) {

 sbox[i].box_x = 10;

 sbox[i].box_y = 7 + i;

 sdestinate[i].Des_x = 2 + i;

 sdestinate[i].Des_y = 2;

 }

 }

 

 //system("pause");

 break;

 }

 /*system("pause");*/

 }

  

}

 

//打印游戏菜单

void Menu() {

 if (KEY_DOWN(VK_UP)) {

 //cout << "向上被按下" << endl;

 --nMenuState;

 if (nMenuState < 1) { nMenuState = 3; }

 }

 

 if (KEY_DOWN(VK_DOWN)) {

 //cout << "向下被按下" << endl;

 ++nMenuState;

 if (nMenuState > 3) { nMenuState = 1; }

 }

 

 switch (nMenuState) {

 case 1: system("cls");

 cout << "********游戏界面菜单********" << endl;

 cout << " -> 1、游戏开始" << endl;

 cout << " 2、游戏设置" << endl;

 cout << " 3、退出游戏" << endl << endl;

 cout << " ->按小键盘↑↓←→移动<- " << endl;

 cout << " ->按F1 F2 F3可切换关卡<- " << endl;

 system("pause");

 break;

 case 2: system("cls");

 cout << "********游戏界面菜单********" << endl;

 cout << " 1、游戏开始" << endl;

 cout << " -> 2、游戏设置" << endl;

 cout << " 3、退出游戏" << endl << endl;

 cout << " ->按小键盘↑↓←→移动<- " << endl;

 cout << " ->按F1 F2 F3可切换关卡<- " << endl;

 system("pause");

 break;

 case 3: system("cls");

 cout << "********游戏界面菜单********" << endl;

 cout << " 1、游戏开始" << endl;

 cout << " 2、游戏设置" << endl;

 cout << " -> 3、退出游戏" << endl << endl;

 cout << " ->按小键盘↑↓←→移动<- " << endl;

 cout << " ->按F1 F2 F3可切换关卡<- " << endl;

 system("pause");

 break;

 }

}

 

void Map() {

 while (1) {

 system("cls");

 PlayerMove();

 BoxMove();

 JudgeWin();

 if (4 == PassState) {

 cout << "恭喜通关" << endl;

 PassState = 1;

 memcpy(Array, Array1, sizeof(Array));

 //更新玩家位置

 splayer.P_row = 1;

 splayer.P_col = 1;

 //更新箱子和坑状态

 for (int i = 0; i < 3; i++) {

 sbox[i].box_x = 5 + i;

 sbox[i].box_y = 5 + i;

 sdestinate[i].Des_x = 8 + i;

 sdestinate[i].Des_y = 8 + i;

 }

 system("pause");

 break;

 }

 if (KEY_DOWN(VK_F1)) {

 memcpy(Array, Array1, sizeof(Array));

 PassState = 1;

 //更新玩家位置

 splayer.P_row = 1;

 splayer.P_col = 1;

 //更新箱子和坑状态

 for (int i = 0; i < 3; i++) {

 sbox[i].box_x = 5 + i;

 sbox[i].box_y = 5 + i;

 }

 }

 if (KEY_DOWN(VK_F2)) {

 memcpy(Array, Array2, sizeof(Array));

 PassState = 2;

 //更新玩家位置

 splayer.P_row = 1;

 splayer.P_col = 1;

 //更新箱子和坑状态

 for (int i = 0; i < 3; i++) {

 sbox[i].box_x = 3 + i;

 sbox[i].box_y = 5;

 sdestinate[i].Des_x = 3 + i;

 sdestinate[i].Des_y = 3;

 }

 }

 if (KEY_DOWN(VK_F3)) {

 memcpy(Array, Array3, sizeof(Array));

 PassState = 3;

 //更新玩家位置

 splayer.P_row = 1;

 splayer.P_col = 1;

 //更新箱子和坑状态

 for (int i = 0; i < 3; i++) {

 sbox[i].box_x = 10;

 sbox[i].box_y = 7 + i;

 sdestinate[i].Des_x = 2 + i;

 sdestinate[i].Des_y = 2;

 }

 }

 //打印地图

 for (int i = 0; i < 15; i++) {

 for (int j = 0; j < 20; j++) {

 bool bDrawBox = false; //判断箱子

 for (int m = 0; m < 3; m++) {

 if (i == sbox[m].box_x && j == sbox[m].box_y) {

 bDrawBox = true;

 break;

 }

 }

 bool bDrawDes = false; //判断坑

 for (int m = 0; m < 3; m++) {

 if (i == sdestinate[m].Des_x && j == sdestinate[m].Des_y) {

 bDrawDes = true;

 break;

 }

 }

 if (1 == Array[i][j]) {

 cout << "■";

 }

 else if (i == splayer.P_row && j == splayer.P_col) {

 cout << "♀";

 }

 else if (true == bDrawBox) { //将true放在前面,不然出现全是箱子都不知道怎么错的……

 cout << "箱";

 }

 else if (true == bDrawDes) {

 cout << "坑";

 }

 else {

 cout << " ";

 }

 }

 cout << endl;

 }

 system("pause");

 }

}

 

 

 

int _tmain(int argc, _TCHAR* argv[])

{

 memcpy(Array, Array1, sizeof(Array));

 while (1) {

 //if (KEY_DOWN(VK_RETURN)){

 // if (1 == nMenuState) {

 // Map();

 // }

 // else if (2 == nMenuState) {

 // SetChoise();

 // /* cout << "wwww";

 // system("pause");*/

 // }

 // else if (3 == nMenuState)

 // return 0;

 //}

 if (3 == nMenuState && KEY_DOWN(VK_RETURN)) { //可以

 return 0;

 }

 else if (2 == nMenuState && KEY_DOWN(VK_RETURN)) {

 SetChoise();

 if (bslect) {

 Map();

 }

 }

 else if (1 == nMenuState && KEY_DOWN(VK_RETURN)) {

 Map();

 }

 //if (KEY_DOWN(VK_RETURN) && 3 == nMenuState) { //KEY_DOWN(VK_RETURN)不能进行与或运算 ??

 // return 0;

 //}

 //else if (KEY_DOWN(VK_RETURN) && 1 == nMenuState) {

 // Map();

 //}

 else {

 Menu();

 }

 }

 //Map();

 system("pause");

 return 0;

}


0
已采纳
潘晨皓
潘晨皓
高级天翼
高级天翼

#include "stdafx.h"

编译错误

潘晨皓在2020-02-16 20:11:16追加了内容

望采纳

0
徐紫尘
徐紫尘
高级光能
高级光能

编译错误!!!

望改进

0
我要回答