1共有5个关卡
2两个箱子和箱子碰墙不动
3按空格初始化该关卡
4撤销上一步
5正确路提示
6关卡编辑器
7关卡存在文件里
8可以读取文件里的地图
9关卡选择
10制作了个很丑的界面
对应之法:
功能一:选择关卡,通过按键1,2,3,4,5选择相应的关卡;
功能二:通过空格重置关卡;
功能三:按z建实现撤回,只可测绘一步;
功能四:在未进行任何步数情况下,按c键,人物可自动向正确方向移动,一直按c键可以直接成功;
功能五:点击非墙区域,区域变墙,点击墙区域,墙变空白;
功能六:按p键,编辑后的地图自动保存到代码定义的文本文件里;
功能七:按o键,自动读取文本文件的地图,且不改变代码里原本的地图信息。
功能八:通过相应的函数,来控制角色和箱子的引动。
#include<stdio.h>
#include<conio.h>
#include<graphics.h>
#include<iostream>
#define b_size 60//像素格的尺寸
#define b_num 8//列数
#define LEVEL_TOTALNUM 5//关卡数
int bs=0;
char s[100];
char levels[LEVEL_TOTALNUM][b_num][b_num + 1] =
{ { "wwwwwwww","wwwtbeew","weeeeeew","weeeeeew","weeeeeew" ,"weepaeew","weeewwww","wwwwwwww" }
,{"wwwwwwww","wwweewww","wpetbwww","weeebeww","wewteeww","weeeeeww","weepwwww","wwwwwwww"},
{"wwwwwwww","wwpeewww","weeweeww","webabeww","weeteeww","wwetewww","wwwwwwww","wwwwwwww"} ,
{"wwwwwwww","wwwwwwww","weeeewww","weeettew","webbbpew","weewetww","wwwwwwww","wwwwwwww"},
{"wwwwwwww","wwwwwwww","wwteewww","weewebpw","weewewew","weaeebtw","weeeewww","wwwwwwww"} };//地图内部数据
char hc[b_num][b_num + 1]= { "wwwwwwww","wwwtbeew","weeeeeew","weeeeeew","weeeeeew" ,"weepaeew","weeewwww","wwwwwwww" };
char mj[5][60] = { "wwwddwa","wwddwaawwdsswaaasdassddwwddsa","sassdwsdddwwasaddsawasaawdsddwwwaassasd",
"waaaassdwawwdddsdssawdwawaaassdddwdsawwaasddaaassdwawdd","adssaasaawsddwasaawwwdwddsswwaasasssddwddaasaawdwwsssddwa"};
struct player{
int i;
int j;
}player;//用户的结构体
int currentlevelnum = 0;//关卡数减1
char level[b_num][b_num + 1];//当前关卡的数据
int targetNum, achieveNum;//目标数,达成目标数
int pi = 0, pj = 0;
void jm() {
cleardevice();
//initgraph(b_num * b_size, b_num * b_size);
setbkcolor(RGB(150, 150, 150));
setfillcolor(RGB(200, 0, 0));
fillrectangle(50, 50, 450,100);
fillrectangle(50,100,450,150);
fillrectangle(50,150,450,200);
fillrectangle(50,200,450,250);
fillrectangle(50,250,450,300);
outtextxy(50, 50, _T("进入第一关按1"));
outtextxy(50,100, _T("进入第二关按2"));
outtextxy(50,150, _T("进入第三关按3"));
outtextxy(50, 200, _T("进入第四关按4"));
outtextxy(50,250, _T("进入第五关按5"));
FlushBatchDraw();
}
void startup() {
initgraph(b_num * b_size, b_num * b_size);
setbkcolor(RGB(150, 150, 150));
int i, j;
bs = 0;
for (i = 0; i < b_num; i++) {
for (j = 0; j < b_num; j++) {
level[i][j] = levels[currentlevelnum][i][j];
}
}
targetNum = 0, achieveNum = 0;
for (i = 0; i < b_num; i++) {
for (j = 0; j < b_num; j++) {
if (level[i][j] == 'p') {
player.i = i;
player.j = j;
level[i][j] = 'e';
}
else if (level[i][j] == 't' || level[i][j] == 'a') {
targetNum++;
}
}
}
BeginBatchDraw();
}
void show() {
int i, j;
cleardevice();
for (i = 0; i < b_num; i++) {
for (j = 0; j < b_num; j++) {
if (level[i][j] == 'e') {
setfillcolor(RGB(150, 150, 150));
setlinecolor(RGB(150, 150, 150));
fillrectangle(b_size * j, b_size * i, b_size * (j+1), b_size * (i+1));
}
else if (level[i][j] == 'w') {
setfillcolor(RGB(150, 0, 0));
setlinecolor(RGB(150, 150, 150));
fillrectangle(b_size * j, b_size * i, b_size * (j+1), b_size *(i+1));
}
else if (level[i][j] == 'b') {
setfillcolor(RGB(255, 255, 0));
setlinecolor(RGB(150, 150, 150));
fillrectangle(b_size * j, b_size * i, b_size * (j+1), b_size *(i+1));
}
else if (level[i][j] == 't') {
setfillcolor(RGB(255, 255, 255));
setlinecolor(RGB(150, 150, 150));
fillrectangle(b_size * (j + 0.3), b_size * (i + 0.3), b_size * (j + 0.7), b_size * (i + 0.7));
}
else if (level[i][j] == 'a') {
setfillcolor(RGB(255, 255, 0));
setlinecolor(RGB(150, 150, 150));
fillrectangle(b_size * j, b_size * i, b_size *(j+1),b_size * (i+1));
setfillcolor(RGB(255, 255, 255));
fillrectangle(b_size * (j+0.3), b_size * (i+0.3), b_size * (j+0.7), b_size *( i+0.7));
}
}
}
j = player.j;
i = player.i;
setfillcolor(RGB(255, 0, 0));
setlinecolor(RGB(80, 80, 75));
fillcircle((j + 0.5) * b_size, (i + 0.5) * b_size, 0.4 * b_size);
setfillcolor(RGB(80, 80, 80));
fillcircle((j + 0.3) * b_size, (i + 0.45) * b_size, 0.08 * b_size);
fillcircle((j + 0.7) * b_size, (i + 0.45) * b_size, 0.08 * b_size);
setlinestyle(PS_SOLID, 3);
line((j + 0.35) * b_size, (i + 0.7) * b_size, (j + 0.65) * b_size, (i + 0.7) * b_size);
setlinestyle(PS_SOLID, 1);
if (achieveNum == targetNum) {
setbkmode(TRANSPARENT);
settextcolor(RGB(0, 255, 255));
TCHAR s[20];
if (currentlevelnum < LEVEL_TOTALNUM - 1) {
settextstyle(50, 0, _T("宋体"));
_stprintf(s, _T("开始第%d关"), currentlevelnum + 2);//开始第%d关
outtextxy(120, 160, s);
outtextxy(10, 250, _T("按空格重玩当前关"));
}
else {
settextstyle(80, 0, _T("宋体"));;
outtextxy(80, 200, _T("游戏胜利"));
}
FlushBatchDraw();
Sleep(2600);
}
FlushBatchDraw();
}
void mouse() {
MOUSEMSG m;
if (MouseHit()) {
m = GetMouseMsg();
if (m.uMsg == WM_LBUTTONDOWN) {
int gi = (int)m.y / 60;
int gj = (int)m.x / 60;
if (level[gi][gj] != 'w')
level[gi][gj] = 'w';
else if (level[gi][gj] == 'w')
level[gi][gj] = 'e';
show();
}
}
}
void pc() {
int i = 0, j = 0;
FILE* fp = fopen("C:\\c++测试\\推箱子关卡编辑器.txt", "w");
for (i = 0; i < b_num; i++) {
for (j = 0; j < b_num; j++) {
s[i *8 + j] = level[i][j];
}
}
fputs(s, fp);
fclose(fp);
}
void read() {
int i = 0, j = 0;
FILE* fp = fopen("C:\\c++测试\\推箱子关卡编辑器.txt", "r");
while (!feof(fp)) {
fgets(s, 80, fp);
}
fclose(fp);
for (i = 0; i < b_num; i++) {
for (j = 0; j < b_num; j++) {
level[i][j] = s[i * 8 + j];
}
}
show();
}
void update() {
mouse();
int i = 0, j = 0;
if (kbhit() && (achieveNum < targetNum)) {
char input = _getch();
if (input != 'z') {
for (i = 0; i < b_num; i++) {
for (j = 0; j < b_num; j++) {
hc[i][j] = level[i][j];
}
}
pi = player.i;
pj = player.j;
if (input == 'c') {
input = mj[currentlevelnum][bs];
bs++;
}
if (input == 'p') {
pc();
}
if (input == 'o') {
read();
}
if (input == ' ') {
startup();
}
else if (input == '1') {
currentlevelnum = 0;
startup();
}
else if (input == '2') {
currentlevelnum = 1;
startup();
}
else if (input == 'q') {
jm();
_getch();
}
else if (input == '3') {
currentlevelnum = 2;
startup();
}
else if (input == '4') {
currentlevelnum = 3;
startup();
}
else if (input == '5') {
currentlevelnum = 4;
startup();
}
if (input == 'a' || input == 's' || input == 'd' || input == 'w') {
int goal_i = player.i, goal_j = player.j;
int goalnext_i = goal_i, goalnext_j = goal_j;
if (input == 'a') {
goal_j = goal_j - 1;
goalnext_j = goal_j - 1;
}
else if (input == 'd') {
goal_j = goal_j + 1;
goalnext_j = goal_j + 1;
}
else if (input == 's') {
goal_i = goal_i + 1;
goalnext_i = goal_i + 1;
}
else if (input == 'w') {
goal_i = goal_i - 1;
goalnext_i = goal_i - 1;
}
if (level[goal_i][goal_j] == 'e' || level[goal_i][goal_j] == 't') {
player.i = goal_i;
player.j = goal_j;
}
else if (level[goal_i][goal_j] == 'b' && level[goalnext_i][goalnext_j] == 'e') {
player.i = goal_i;
player.j = goal_j;
level[goal_i][goal_j] = 'e';
level[goalnext_i][goalnext_j] = 'b';
}
else if (level[goal_i][goal_j] == 'b' && level[goalnext_i][goalnext_j] == 't') {
player.i = goal_i;
player.j = goal_j;
level[goal_i][goal_j] = 'e';
level[goalnext_i][goalnext_j] = 'a';
}
else if (level[goal_i][goal_j] == 'a' && level[goalnext_i][goalnext_j] == 'e') {
player.i = goal_i;
player.j = goal_j;
level[goal_i][goal_j] = 't';
level[goalnext_i][goalnext_j] = 'b';
}
else if (level[goal_i][goal_j] == 'a' && level[goalnext_i][goalnext_j] == 't') {
player.i = goal_i;
player.j = goal_j;
level[goal_i][goal_j] = 't';
level[goalnext_i][goalnext_j] = 'a';
}
else
return;
}
achieveNum = 0;
int i, j;
for (i = 0; i < b_num; i++) {
for (j = 0; j < b_num; j++) {
if (level[i][j] == 'a') {
achieveNum++;
}
}
}
if (achieveNum == targetNum) {
show();
if (currentlevelnum < LEVEL_TOTALNUM - 1) {
currentlevelnum++;
startup();
}
}
}
else if(input=='z') {
for (i = 0; i < b_num; i++) {
for (j = 0; j < b_num+1; j++) {
level[i][j] = hc[i][j];
}
bs--;
player.i = pi;
player.j = pj;
}
//show();
}
}
}
int main() {
startup();
show();
jm();
_getch();
while (1) {
show();
update();
}
return 0;
}
第五关