经典推箱子游戏

1共有5个关卡

2两个箱子和箱子碰墙不动

3按空格初始化该关卡

源码:

#include<stdio.h>
#include<conio.h>
#include<graphics.h>
#define b_size 60//像素格的尺寸
#define b_num 8//列数
#define LEVEL_TOTALNUM 5//关卡数

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"} };//地图内部数据
struct player{
	int i;
     int j;
}player;//用户的结构体
int currentlevelnum = 0;//关卡数减1
char level[b_num][b_num + 1];//当前关卡的数据
int targetNum, achieveNum;//目标数,达成目标数
void startup() {
	initgraph(b_num * b_size, b_num * b_size);
	setbkcolor(RGB(150, 150, 150));
	int i, j;
	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 update() {
	if (kbhit() && (achieveNum < targetNum)) {
		char input = _getch();
		if (input == ' ') {
			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();
			}
		}
	}
}
int main() {
	startup();
	while (1) {
		show();
		update();
	}
	return 0;
}

运行截图:

第一关

 

 第二关

 第三卡

 第四关

 第五关

 游戏胜利

 后续还会更新注解和新功能:关卡存在文件里,关卡编辑器,关卡选择,正确路提示,撤销上一步。

本程序需要用easy-x。

猜你喜欢

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