学了一两个月C语言了,做完了黑窗口版本的推箱子,今天尝试用easyx图形库,收获很不错.其中还有很多可以改进的地方,希望大家能多多指导
推箱子游戏主要步骤
1.加载图片资源
2.绘制游戏地图
3.按键获取
4.游戏更新与判断是否过关
源码
#include <stdio.h>
#include <easyx.h>
#include <conio.h>
#include <stdbool.h>
#include <stdlib.h>
#define Bk 7
#define box 3
#define dest 2
#define wall 1
#define player 4
#define over 6
#define Okok 5
#define Space 0
IMAGE space; //空地
IMAGE Box; //箱子
IMAGE Dest; //目的地
IMAGE Player; //玩家
IMAGE Wall; //墙
IMAGE Over; //玩家进入目的地
IMAGE okok; //箱子进入目的地
IMAGE bk; //背景
void load(); //加载地图
void showmap(); //输出地图
void getkey();//获取按键
bool isok(); //判断游戏中是否还有箱子
void init(); //重置地图
int level=0;
//初始地图
int map[3][10][10] =
{
{
{7,7,7,7,7,7,7,7,7,7},
{7,7,7,1,1,1,7,7,7,7},
{7,7,7,1,2,1,7,7,7,7},
{7,7,7,1,3,1,1,1,1,7},
{7,1,1,1,0,0,3,2,1,7},
{7,1,2,3,4,3,1,1,1,7},
{7,1,1,1,1,0,1,7,7,7},
{7,7,7,7,1,2,1,7,7,7},
{7,7,7,7,1,1,1,7,7,7},
{7,7,7,7,7,7,7,7,7,7}
},
{
{7,7,7,7,7,7,7,7,7,7},
{7,7,1,1,7,7,1,1,7,7},
{7,1,2,0,1,1,0,2,1,7},
{1,0,0,0,3,0,0,3,0,1},
{1,0,3,0,4,0,0,0,0,1},
{7,1,2,0,3,0,3,0,1,7},
{7,7,1,0,0,0,2,1,7,7},
{7,7,7,1,2,0,1,7,7,7},
{7,7,7,7,1,1,7,7,7,7},
{7,7,7,7,7,7,7,7,7,7}
},
{
{7,7,7,7,7,7,7,7,7,7},
{7,1,1,1,1,1,1,1,1,7},
{7,1,2,0,0,0,3,2,1,7},
{7,1,0,3,0,0,0,0,1,7},
{7,1,0,0,0,4,0,0,1,7},
{7,1,0,3,0,0,0,0,1,7},
{7,1,0,0,0,0,0,3,1,7},
{7,1,2,0,0,0,0,2,1,7},
{7,1,1,1,1,1,1,1,1,7},
{7,7,7,7,7,7,7,7,7,7}
}
};
//预留一个地图,方便通关后重新继续游戏
int map1[3][10][10] =
{
{
{7,7,7,7,7,7,7,7,7,7},
{7,7,7,1,1,1,7,7,7,7},
{7,7,7,1,2,1,7,7,7,7},
{7,7,7,1,3,1,1,1,1,7},
{7,1,1,1,0,0,3,2,1,7},
{7,1,2,3,4,3,1,1,1,7},
{7,1,1,1,1,0,1,7,7,7},
{7,7,7,7,1,2,1,7,7,7},
{7,7,7,7,1,1,1,7,7,7},
{7,7,7,7,7,7,7,7,7,7}
},
{
{7,7,7,7,7,7,7,7,7,7},
{7,7,1,1,7,7,1,1,7,7},
{7,1,2,0,1,1,0,2,1,7},
{1,0,0,0,3,0,0,3,0,1},
{1,0,3,0,4,0,0,0,0,1},
{7,1,2,0,3,0,3,0,1,7},
{7,7,1,0,0,0,2,1,7,7},
{7,7,7,1,2,0,1,7,7,7},
{7,7,7,7,1,1,7,7,7,7},
{7,7,7,7,7,7,7,7,7,7}
},
{
{7,7,7,7,7,7,7,7,7,7},
{7,1,1,1,1,1,1,1,1,7},
{7,1,2,0,0,0,3,2,1,7},
{7,1,0,3,0,0,0,0,1,7},
{7,1,0,0,0,4,0,0,1,7},
{7,1,0,3,0,0,0,0,1,7},
{7,1,0,0,0,0,0,3,1,7},
{7,1,2,0,0,0,0,2,1,7},
{7,1,1,1,1,1,1,1,1,7},
{7,7,7,7,7,7,7,7,7,7}
}
};
int main()
{
load();
showmap();
getkey();
return 0;
}
//绘制游戏画面
void showmap()
{
int x = -1, y = -1;
for (int i = 0; i < 10; i++)
{
y = i * 60;
for (int j = 0; j < 10; j++)
{
x = j * 60;
switch (map[level][i][j])
{
case Bk:
putimage(x, y, &bk);
break;
case wall:
putimage(x, y, &Wall);
break;
case dest:
putimage(x, y, &Dest);
break;
case box:
putimage(x, y, &Box);
break;
case player:
putimage(x, y, &Player);
break;
case over:
putimage(x, y, &Over);
break;
case Okok:
putimage(x, y, &okok);
break;
case Space:
putimage(x, y, &space);
break;
}
}
printf("\n ");
}
}
//加载图片资源
void load()
{
initgraph(600,600);
loadimage(&bk, "space.png", 60, 60);
loadimage(&Box,"box.png", 60, 60);
loadimage(&Dest, "dest.png", 60, 60);
loadimage(&Player, "player.png", 60, 60);
loadimage(&Over, "over.png", 60, 60);
loadimage(&Wall, "wall.png", 60, 60);
loadimage(&okok, "wallokok.png", 60, 60);
loadimage(&space, "bk.png", 60, 60);
}
//按键获取。。。。游戏更新
void getkey()
{
while (true)
{
int c = 0, e = 0;
for (int i = 0; i < 10; i++)
{
for (int k = 0; k < 10; k++)
{
if (map[level][i][k] == player)
{
c = i;
e = k;
}
}
}
char userKey = _getch();
switch (userKey)
{
case 72:
case 'w':
case 'W':
if (map[level][c - 1][e] == Space||map[level][c-1][e]==dest)
{
map[level][c - 1][e] += player;
map[level][c][e] -= player;
}
else if (map[level][c - 1][e]==box||map[level][c-1][e]==Okok)
{
if (map[level][c - 2][e] == Space || map[level][c - 2][e] == dest)
{
map[level][c - 2][e] += box;
map[level][c - 1][e] -= box;
map[level][c - 1][e] += player;
map[level][c][e] -= player;
}
}
break;
case 80:
case 'S':
case 's':
if (map[level][c + 1][e] == Space || map[level][c + 1][e] == dest)
{
map[level][c + 1][e] += player;
map[level][c][e] -= player;
}
else if (map[level][c + 1][e] == box || map[level][c + 1][e] == Okok)
{
if (map[level][c + 2][e] == Space || map[level][c + 2][e] == dest)
{
map[level][c + 2][e] += box;
map[level][c + 1][e] -= box;
map[level][c + 1][e] += player;
map[level][c][e] -= player;
}
}
break;
case 75:
case 'a':
case 'A':
if (map[level][c][e-1] == Space || map[level][c][e-1] == dest)
{
map[level][c][e-1] += player;
map[level][c][e] -= player;
}
else if (map[level][c][e-1] == box || map[level][c][e-1] == Okok)
{
if (map[level][c][e-2] == Space || map[level][c][e-2] == dest)
{
map[level][c][e-2] += box;
map[level][c][e-1] -= box;
map[level][c][e-1] += player;
map[level][c][e] -= player;
}
}
break;
case 77:
case 'd':
case 'D':
if (map[level][c][e + 1] == Space || map[level][c][e + 1] == dest)
{
map[level][c][e + 1] += player;
map[level][c][e] -= player;
}
else if (map[level][c][e + 1] == box || map[level][c][e + 1] == Okok)
{
if (map[level][c][e + 2] == Space || map[level][c][e + 2] == dest)
{
map[level][c][e + 2] += box;
map[level][c][e + 1] -= box;
map[level][c][e + 1] += player;
map[level][c][e] -= player;
}
}
break;
default:
break;
}
system("cls");
showmap();
if (isok())
{
if (level > 2)
{
level = -1;
init();
}
printf("恭喜你!过关了!\n");
level++;
}
}
}
//判断是否过关
bool isok()
{
for (int i = 0; i < 10; i++)
{
for (int k = 0; k < 10; k++)
{
if (map[level][i][k] == box)
{
return false;
}
}
}
return true;
}
//重置地图
void init()
{
for (int l = 0; l < 3; l++)
{
for (int i = 0; i < 10; i++)
{
for (int k = 0; k < 10; k++)
{
map[l][i][k] = map1[l][i][k];
}
}
}
}
素材及源码链接:https://pan.baidu.com/s/1G-a4hAF_hsQuir795YLefg
提取码:8888