经典推箱子游戏无敌版

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;
}

第五关

猜你喜欢

转载自blog.csdn.net/m0_53394907/article/details/124530133