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。