实际上最好的学习,我也比较认同的一句话:“我听过的我会忘记,我看过的我会记得,我做过的我才真的懂得”
相信各位少侠对我们之前的招式有了一定的掌握,已经摩拳擦掌,跃跃欲试了,那么现在就让我们一起开始一个小的项目实战吧
项目需求
我们这次一起来实现一个推箱子的小游戏
图片素材:
链接:https://pan.baidu.com/s/1IrgDJ_q9dR2OEFHrdo8V6g
提取码:tvmn
开发工具:
vc++2010(其他VC、VS版本均可)
easyx图形库(自行百度下载安装)
项目实现
开发中程序员一定不是盲目敲代码!不是盲目敲代码!不是盲目敲代码!
一定要项目分析!一定要项目分析!一定要项目分析!
那么我们来先实现地图初始化
我们先来实现窗口和背景图片的加载
#include <graphics.h> //导入easyx图形库
#include <Windows.h>
#include <iostream>
using namespace std;
IMAGE picture[6]; //储存图片:IMAGE是easyx库中的图片数据类型
//墙:0,地板: 1,箱子目的地: 2, 小人: 3, 箱子: 4, 箱子命中目标: 5
int main(void){
//初始化地图
IMAGE background; //储存背景图片
initgraph(960,768); //easyx库中函数,初始化窗口大小 960*768
loadimage(&background,_T("blackground.bmp"),960,768); //加载背景图片,使用介绍查看easyx文档
putimage(0,0,&background); //输出加载的图片,使用介绍查看easyx文档
system("pause");
return 0;
}
窗口和背景图片已经加载好了,下面我们来把游戏道具图片一个一个显示出来,
道具的加载正好可以用上我们刚学的枚举来表示
#include <graphics.h> //导入easyx图形库
#include <Windows.h>
#include <iostream>
using namespace std;
//用二维数组来表示地图
int map[9][12] = {
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0 },
{ 0, 1, 4, 1, 0, 2, 1, 0, 2, 1, 0, 0 },
{ 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0 },
{ 0, 1, 0, 2, 0, 1, 1, 4, 1, 1, 1, 0 },
{ 0, 1, 1, 1, 0, 3, 1, 1, 1, 4, 1, 0 },
{ 0, 1, 2, 1, 1, 4, 1, 1, 1, 1, 1, 0 },
{ 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
};
enum PIC{ //图片对应的下标号
Wall, //0 墙
Floor, //1 地板
Des, //2 箱子目的地
Man, //3 小人
Box, //4 箱子,同时箱子命中目标,显示的就是box
All //5 需要数组元素个数
};
IMAGE picture[All]; //储存图片:IMAGE是easyx库中的图片数据类型
int main(void){
//初始化地图
IMAGE background; //储存背景图片
initgraph(960,768); //easyx库中函数,初始化窗口大小 960*768
loadimage(&background,_T("blackground.bmp"),960,768); //加载背景图片,使用介绍查看easyx文档
putimage(0,0,&background); //输出加载的图片
//加载游戏道具图片
loadimage(&picture[Wall],_T("wall.bmp"),61,61);//加载墙的图片,墙的图片大小61*61
loadimage(&picture[Floor],_T("floor.bmp"),61,61);
loadimage(&picture[Des],_T("des.bmp"),61,61);
loadimage(&picture[Man],_T("man.bmp"),61,61);
loadimage(&picture[Box],_T("box.bmp"),61,61);
//遍历地图,输出对应图片,游戏道具x轴偏移量100,y轴偏移量150
for(int i=0; i<9; i++){
for(int j=0; j<12; j++){
putimage(100+j*61,150+i*61,&picture[map[i][j]]);
}
}
system("pause");
return 0;
}
好了,现在我们第一部分地图的初始化已经完成了。我们先不急的下一个部分,现在我们要做的是把代码更加完善一下,回头看一下我们现在写的代码是不是有很多数字常量啊,什么960,768等等,这样会让我们后期维护起来非常麻烦,如果需要修改就会造成牵一发而动全身。那么我们用学过的宏定义来完善一下。
#include <graphics.h> //导入easyx图形库
#include <Windows.h>
#include <iostream>
#define LINE 9 //地图的行数
#define ROW 12 //地图的列数
#define WINDOW_LINE 768 //游戏窗口高度
#define WINDOW_ROW 960 //游戏窗口宽度
#define PICTURE_SIZE 61 //道具图片尺寸大小
#define X_OFFSET 100 //x轴图片偏移量
#define Y_OFFSET 150 //y轴图片偏移量
using namespace std;
//用二维数组来表示地图
int map[LINE][ROW] = {
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0 },
{ 0, 1, 4, 1, 0, 2, 1, 0, 2, 1, 0, 0 },
{ 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0 },
{ 0, 1, 0, 2, 0, 1, 1, 4, 1, 1, 1, 0 },
{ 0, 1, 1, 1, 0, 3, 1, 1, 1, 4, 1, 0 },
{ 0, 1, 2, 1, 1, 4, 1, 1, 1, 1, 1, 0 },
{ 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
};
enum PIC{ //图片对应的下标号
Wall, //0 墙
Floor, //1 地板
Des, //2 箱子目的地
Man, //3 小人
Box, //4 箱子,同时箱子命中目标,显示的就是box
All //5 需要数组元素个数
};
IMAGE picture[All]; //储存图片:IMAGE是easyx库中的图片数据类型
int main(void){
//初始化地图
IMAGE background; //储存背景图片
initgraph(WINDOW_ROW,WINDOW_LINE); //easyx库中函数,初始化窗口大小 960*768
loadimage(&background,_T("blackground.bmp"),WINDOW_ROW,WINDOW_LINE); //加载背景图片,使用介绍查看easyx文档
putimage(0,0,&background); //输出加载的图片
//加载游戏道具图片
loadimage(&picture[Wall],_T("wall.bmp"),PICTURE_SIZE,PICTURE_SIZE);//加载墙的图片,墙的图片大小61*61
loadimage(&picture[Floor],_T("floor.bmp"),PICTURE_SIZE,PICTURE_SIZE);
loadimage(&picture[Des],_T("des.bmp"),PICTURE_SIZE,PICTURE_SIZE);
loadimage(&picture[Man],_T("man.bmp"),PICTURE_SIZE,PICTURE_SIZE);
loadimage(&picture[Box],_T("box.bmp"),PICTURE_SIZE,PICTURE_SIZE);
//遍历地图,输出对应图片,游戏道具x轴偏移量100,y轴偏移量150
for(int i=0; i<LINE; i++){
for(int j=0; j<ROW; j++){
putimage(X_OFFSET+j*PICTURE_SIZE,Y_OFFSET+i*PICTURE_SIZE,&picture[map[i][j]]);
}
}
system("pause");
return 0;
}
OK通过宏定义,现在我们的代码就已经是可维护,易修改的高逼格的代码了