高级光能
// 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;
}