C/C++游戏开发(easyx框架)回合制 您所在的位置:网站首页 easyx怎么安装 C/C++游戏开发(easyx框架)回合制

C/C++游戏开发(easyx框架)回合制

2023-03-15 19:07| 来源: 网络整理| 查看: 265

本游戏用到了图形界面库graphics.h,图形界面库下载安装: 下载链接:https://easyx.cn/download 游戏截图: 请添加图片描述 首先是玩家的定义,使用结构体,这个名字是可以自己改变的

struct gamerole{char name[20]; //玩家名字int HP; //血量int MP; //魔法int DEF; //防御int ATT; //攻击int Lv; //等级int Exp; //经验int Num_Blue_Key; //蓝钥匙数量int Num_Yellow_Key; //黄钥匙数量int x, y; //坐标 }player; int exp_need = 100; //升级所需经验

怪物属性的定义

struct monster{char name[20]; //怪物名字int HP; //血量int ATT; //攻击int DEF; //防御int Exp; //经验 }monsters[15];

初始化玩家属性

void initPlayer(){//输入用户名printf("Input role name: ");scanf("%s", player.name);//初始化游戏角色信息player.Lv = 0;player.ATT = 50;player.DEF = 50;player.Num_Blue_Key = 0;player.Num_Yellow_Key = 0;player.HP = 500;player.MP = 250;player.Exp = 0;player.x = -1;player.y = -1; }

初始化怪物属性

void initMonsters() {monsters[2] = { "绿史莱姆", 50, 10, 12, 100 }; //绿史莱姆属性monsters[3] = { "红史莱姆", 100, 50, 12, 500 }; //红史莱姆属性monsters[11] = { "小蝙蝠", 20, 10, 9, 50 }; //小蝙蝠属性monsters[12] = { "小巫师", 100, 30, 9, 400 }; //小巫师属性monsters[13] = { "小骷髅", 30, 20, 10, 200 }; //小骷髅属性monsters[14] = { "大骷髅", 60, 50, 25, 300 }; //大骷髅属性 }

加载游戏资源图片 右键打开项目属性,添加 -> 现有项,添加资源图片进项目·。 资源图片链接:https://pan.baidu.com/s/1NZN7yDFAzBbHDHrxBiWEJA?pwd=c685 提取码:c685 在这里插入图片描述

IMAGE img[19], playerInfoBox; //素材图片 void initgamePicture(){//加载游戏角色信息框loadimage(&playerInfoBox, "info.jpg");//加载地图资源//60 * 60 固定尺寸loadimage(&img[0], "墙.jpg", 60, 60);loadimage(&img[1], "地板.jpg", 60, 60);loadimage(&img[2], "绿史莱姆.jpg", 60, 60);loadimage(&img[3], "红史莱姆.jpg", 60, 60);loadimage(&img[4], "蓝水晶.jpg", 60, 60);loadimage(&img[5], "红水晶.jpg", 60, 60);loadimage(&img[6], "蓝钥匙.jpg", 60, 60);loadimage(&img[7], "黄钥匙.jpg", 60, 60);loadimage(&img[8], "小红药水.jpg", 60, 60);loadimage(&img[9], "小蓝药水.jpg", 60, 60);loadimage(&img[10], "梯子.jpg", 60, 60);loadimage(&img[11], "小蝙蝠.jpg", 60, 60);loadimage(&img[12], "小巫师.jpg", 60, 60);loadimage(&img[13], "骷髅兵.jpg", 60, 60);loadimage(&img[14], "大骷髅兵.jpg", 60, 60);loadimage(&img[15], "蓝门.jpg", 60, 60);loadimage(&img[16], "黄门.jpg", 60, 60);loadimage(&img[17], "人.jpg", 60, 60); }

设置地图,用数字来决定地图的每一个方块是什么类型(与img数组的索引对应)。

int map[13][13] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,6,2,3,2,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,8,1,1,15,1,0,0,1,1,1,1,0,0,1,14,1,0,1,0,0,5,0,0,1,0,0,0,15,0,0,1,15,11,12,11,0,1,0,0,6,1,1,0,1,0,0,0,0,0,1,0,0,1,14,1,0,1,0,0,0,0,0,1,0,0,0,15,0,0,1,1,0,0,0,0,1,0,0,1,1,1,0,0,15,0,0,0,0,15,0,0,8,1,9,0,6,1,6,0,6,11,1,0,0,8,1,9,0,1,17,1,0,2,6,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };

屏幕的笛卡尔坐标如下: 在这里插入图片描述 所以地图的二维坐标是(其中的一个点是 map [ y ] [ x ] ): 在这里插入图片描述

接下来就是定义画布,然后加载图片,我用一个二维数组存下了地图,不同的数字代表不同的图片,然后根据二维数组的值把不同的地方贴上不同的图片。

void SetMap(int x, int y){for (int i = 0; i putimage(j * 60, i * 60, &img[map[i][j]]);if (map[i][j] == 17) {player.x = j;player.y = i;}}}//地图没有角色if (player.x == -1) {MessageBox(hwnd, "地图没找到角色", "错误", MB_ICONWARNING);closegraph();exit(-1);} }

在地图右边显示角色信息

void SetPlayer(){static char temp[16];//打印游戏角色信息框putimage(13 * 60, 0, &playerInfoBox);setbkmode(TRANSPARENT); //透明背景outtextxy(60 * 13 + 12, 100, player.name);outtextxy(60 * 13 + 12, 180, _itoa(player.Lv, temp, 10));outtextxy(60 * 13 + 12, 235, _itoa(player.Exp, temp, 10));outtextxy(60 * 13 + 12, 362, _itoa(player.HP, temp, 10));outtextxy(60 * 13 + 12, 420, _itoa(player.MP, temp, 10));outtextxy(60 * 13 + 12, 517, _itoa(player.ATT, temp, 10));outtextxy(60 * 13 + 12, 567, _itoa(player.DEF, temp, 10));outtextxy(60 * 13 + 12, 689, _itoa(player.Num_Yellow_Key, temp, 10));outtextxy(60 * 13 + 12, 759, _itoa(player.Num_Blue_Key, temp, 10)); }

在这里插入图片描述 接下来就是人物的移动和战斗了,人物的移动我就是直接对上下左右四种情况分别讨论。

void playGame() {static char dir;dir = _getch();switch (dir) {//左case 'a':case 'A':case 75:step(player.x - 1, player.y);break;//右case 'd':case 'D':case 77:step(player.x + 1, player.y);break;//上case 'w':case 'W':case 72:step(player.x, player.y - 1);break;//下case 's':case 'S':case 80:step(player.x, player.y + 1);break;default:break;} }

在人物走动的时候要判断能不能走,不能走就不处理,如果能走,就把走到的那个位置上变成人,把之前人的位置变成地板。 如果是钥匙,把对应的钥匙数量加1。 如果是门,判断一下对应颜色的钥匙是否足够,如果足够,钥匙数量减1,然后把对应位置上的门变为空地。 如果是药水,吃了之后会增加生命。 如果是水晶,根据水晶的颜色加对应的属性。 如果是楼梯,就游戏胜利。 当遇到怪物的时候回产生战斗。

void step(int dstx, int dsty) {if (map[dsty][dstx] == 1) { //下一步是地板}else if (map[dsty][dstx] == 15) { //下一步是蓝门if (player.Num_Blue_Key //下一步是蓝门MessageBox(hwnd, "游戏结束了", "通关", MB_OK);closegraph();exit(0);}else if (map[dsty][dstx] == 16) { //下一步是黄门if (player.Num_Yellow_Key //下一步是蓝水晶player.DEF += 2;}else if (map[dsty][dstx] == 5) { //下一步是红水晶player.ATT += 2;}else if (map[dsty][dstx] == 6) { //下一步是蓝钥匙player.Num_Blue_Key++;}else if (map[dsty][dstx] == 7) { //下一步是黄钥匙player.Num_Yellow_Key++;}else if (map[dsty][dstx] == 8) { //下一步是红药水player.HP += 50;}else if (map[dsty][dstx] == 9) { //下一步是蓝药水player.MP += 50;}else if (map[dsty][dstx] != 0) { //下一步是怪物if (!Combat(map[dsty][dstx])) {//不打怪物return;}}else { //其他情况return;}//移动drawMapCell(player.x, player.y, 1);drawMapCell(dstx, dsty, 17);player.x = dstx;player.y = dsty; }void drawMapCell(int x, int y, int type) {putimage(x * 60, y * 60, &img[type]);map[y][x] = type; }

Combat函数,判断玩家和那个怪物进行战斗。 VS函数,用于计算战斗是否成功,如果成功,会加相应的属性,如果失败,则会弹出打不过的窗口。 在这里插入图片描述

bool Combat(int monsterType){int ID;char msg[36];sprintf(msg, "遇到%s,是否攻击?", monsters[monsterType].name);ID = MessageBox(hwnd, msg, "战斗阶段", MB_YESNO);if (ID == IDYES) {if (VS(player.HP, player.ATT, player.DEF, monsters[monsterType].HP, monsters[monsterType].ATT, monsters[monsterType].DEF)) { //胜利//获得经验值player.Exp += monsters[monsterType].Exp;while (player.Exp >= exp_need) { //升级player.Lv++;player.Exp -= exp_need;exp_need *= player.Lv;}return true;}else { //失败MessageBox(hwnd, "你死了", "打不过", MB_ICONWARNING);return false;}}return false; }bool VS(int playHP, int playATT, int playDEF, int monHP, int monATT, int monDEF){while (playHP > 0 || monHP > 0){monHP -= playATT initPlayer();initMonsters();initgamePicture();initgraph(60 * 14, 60 * 13);putimage(0, 0, &playerInfoBox);SetMap(13, 13);SetPlayer();while (player.HP > 0) {playGame();SetPlayer();}closegraph();return 0; }

完整的代码

#define _CRT_SECURE_NO_WARNINGS //去掉scanf_s问题 #include #include #include #include using namespace std;void initgamePicture(); //加载游戏图片 void SetPlayer(); //显示角色信息 void initPlayer(); //初始化游戏角色 void initMonsters(); //初始化游戏怪物 void SetMap(int x, int y); //加载游戏地图 void playGame(); //开始游戏 void step(int dstx, int dsty); //移动 void drawMapCell(int x, int y, int type); //画图 bool VS(int playHP, int playATT, int playDEF, int monHP, int monATT, int monDEF); //打架 bool Combat(int monstersTpye); //战斗阶段//地图二维数组 int map[13][13] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,6,2,3,2,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,8,1,1,15,1,0,0,1,1,1,1,0,0,1,14,1,0,1,0,0,5,0,0,1,0,0,0,15,0,0,1,15,11,12,11,0,1,0,0,6,1,1,0,1,0,0,0,0,0,1,0,0,1,14,1,0,1,0,0,0,0,0,1,0,0,0,15,0,0,1,1,0,0,0,0,1,0,0,1,1,1,0,0,15,0,0,0,0,15,0,0,8,1,9,0,6,1,6,0,6,11,1,0,0,8,1,9,0,1,17,1,0,2,6,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };struct gamerole{char name[20]; //玩家名字int HP; //血量int MP; //魔法int DEF; //防御int ATT; //攻击int Lv; //等级int Exp; //经验int Num_Blue_Key; //蓝钥匙数量int Num_Yellow_Key; //黄钥匙数量int x, y; //坐标 }player;struct monster{char name[20]; //怪物名字int HP; //血量int ATT; //攻击int DEF; //防御int Exp; //经验 }monsters[15];IMAGE img[19], playerInfoBox; //素材图片HWND hwnd; //弹窗窗口句柄int exp_need = 100; //升级所需经验int main() {initPlayer();initMonsters();initgamePicture();initgraph(60 * 14, 60 * 13);putimage(0, 0, &playerInfoBox);SetMap(13, 13);SetPlayer();while (player.HP > 0) {playGame();SetPlayer();}closegraph();return 0; }/* * 输入用户名,初始化游戏角色信息 */ void initPlayer(){//输入用户名printf("Input role name: ");scanf("%s", player.name);//初始化游戏角色信息player.Lv = 0;player.ATT = 50;player.DEF = 50;player.Num_Blue_Key = 0;player.Num_Yellow_Key = 0;player.HP = 500;player.MP = 250;player.Exp = 0;player.x = -1;player.y = -1; }/* * 初始化游戏怪物 */ void initMonsters() {monsters[2] = { "绿史莱姆", 50, 10, 12, 100 }; //绿史莱姆属性monsters[3] = { "红史莱姆", 100, 50, 12, 500 }; //红史莱姆属性monsters[11] = { "小蝙蝠", 20, 10, 9, 50 }; //小蝙蝠属性monsters[12] = { "小巫师", 100, 30, 9, 400 }; //小巫师属性monsters[13] = { "小骷髅", 30, 20, 10, 200 }; //小骷髅属性monsters[14] = { "大骷髅", 60, 50, 25, 300 }; //大骷髅属性 }/* * 加载游戏资源图片 */ void initgamePicture(){//加载游戏角色信息框loadimage(&playerInfoBox, "info.jpg");//加载地图资源//60 * 60 固定尺寸loadimage(&img[0], "墙.jpg", 60, 60);loadimage(&img[1], "地板.jpg", 60, 60);loadimage(&img[2], "绿史莱姆.jpg", 60, 60);loadimage(&img[3], "红史莱姆.jpg", 60, 60);loadimage(&img[4], "蓝水晶.jpg", 60, 60);loadimage(&img[5], "红水晶.jpg", 60, 60);loadimage(&img[6], "蓝钥匙.jpg", 60, 60);loadimage(&img[7], "黄钥匙.jpg", 60, 60);loadimage(&img[8], "小红药水.jpg", 60, 60);loadimage(&img[9], "小蓝药水.jpg", 60, 60);loadimage(&img[10], "梯子.jpg", 60, 60);loadimage(&img[11], "小蝙蝠.jpg", 60, 60);loadimage(&img[12], "小巫师.jpg", 60, 60);loadimage(&img[13], "骷髅兵.jpg", 60, 60);loadimage(&img[14], "大骷髅兵.jpg", 60, 60);loadimage(&img[15], "蓝门.jpg", 60, 60);loadimage(&img[16], "黄门.jpg", 60, 60);loadimage(&img[17], "人.jpg", 60, 60); }/* *打印游戏地图 */ void SetMap(int x, int y){for (int i = 0; i putimage(j * 60, i * 60, &img[map[i][j]]);if (map[i][j] == 17) {player.x = j;player.y = i;}}}//地图没有角色if (player.x == -1) {MessageBox(hwnd, "地图没找到角色", "错误", MB_ICONWARNING);closegraph();exit(-1);} }/* *显示角色信息 */ void SetPlayer(){static char temp[16];//打印游戏角色信息框putimage(13 * 60, 0, &playerInfoBox);setbkmode(TRANSPARENT);outtextxy(60 * 13 + 12, 100, player.name);outtextxy(60 * 13 + 12, 180, _itoa(player.Lv, temp, 10));outtextxy(60 * 13 + 12, 235, _itoa(player.Exp, temp, 10));outtextxy(60 * 13 + 12, 362, _itoa(player.HP, temp, 10));outtextxy(60 * 13 + 12, 420, _itoa(player.MP, temp, 10));outtextxy(60 * 13 + 12, 517, _itoa(player.ATT, temp, 10));outtextxy(60 * 13 + 12, 567, _itoa(player.DEF, temp, 10));outtextxy(60 * 13 + 12, 689, _itoa(player.Num_Yellow_Key, temp, 10));outtextxy(60 * 13 + 12, 759, _itoa(player.Num_Blue_Key, temp, 10)); }void playGame() {static char dir;dir = _getch();switch (dir) {//左case 'a':case 'A':case 75:step(player.x - 1, player.y);break;//右case 'd':case 'D':case 77:step(player.x + 1, player.y);break;//上case 'w':case 'W':case 72:step(player.x, player.y - 1);break;//下case 's':case 'S':case 80:step(player.x, player.y + 1);break;default:break;} }void step(int dstx, int dsty) {if (map[dsty][dstx] == 1) { //下一步是地板}else if (map[dsty][dstx] == 15) { //下一步是蓝门if (player.Num_Blue_Key //下一步是蓝门MessageBox(hwnd, "游戏结束了", "通关", MB_OK);closegraph();exit(0);}else if (map[dsty][dstx] == 16) { //下一步是黄门if (player.Num_Yellow_Key //下一步是蓝水晶player.DEF += 2;}else if (map[dsty][dstx] == 5) { //下一步是红水晶player.ATT += 2;}else if (map[dsty][dstx] == 6) { //下一步是蓝钥匙player.Num_Blue_Key++;}else if (map[dsty][dstx] == 7) { //下一步是黄钥匙player.Num_Yellow_Key++;}else if (map[dsty][dstx] == 8) { //下一步是红药水player.HP += 50;}else if (map[dsty][dstx] == 9) { //下一步是蓝药水player.MP += 50;}else if (map[dsty][dstx] != 0) { //下一步是怪物if (!Combat(map[dsty][dstx])) {//不打怪物return;}}else { //其他情况return;}//移动drawMapCell(player.x, player.y, 1);drawMapCell(dstx, dsty, 17);player.x = dstx;player.y = dsty; }void drawMapCell(int x, int y, int type) {putimage(x * 60, y * 60, &img[type]);map[y][x] = type; }bool Combat(int monsterType){int ID;char msg[36];sprintf(msg, "遇到%s,是否攻击?", monsters[monsterType].name);ID = MessageBox(hwnd, msg, "战斗阶段", MB_YESNO);if (ID == IDYES) {if (VS(player.HP, player.ATT, player.DEF, monsters[monsterType].HP, monsters[monsterType].ATT, monsters[monsterType].DEF)) { //胜利//获得经验值player.Exp += monsters[monsterType].Exp;while (player.Exp >= exp_need) { //升级player.Lv++;player.Exp -= exp_need;exp_need *= player.Lv;}return true;}else { //失败MessageBox(hwnd, "你死了", "打不过", MB_ICONWARNING);return false;}}return false; }bool VS(int playHP, int playATT, int playDEF, int monHP, int monATT, int monDEF){while (playHP > 0 || monHP > 0){monHP -= playATT


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有