很早就很想写这个,今天终于写完了。
游戏截图:
编译环境: VS2017
游戏需要一些图片,如果有想要的或者对游戏有什么看法的可以加我的QQ 2985486630 讨论,如果暂时没有回应,可以在博客下方留言,到时候我会看到。觉得麻烦的直接下载C-mota_jb51.rar
解压后点击sln文件直接可以运行
下面我来介绍一下游戏的主要功能和实现方式
首先是玩家的定义,使用结构体,这个免费精选名字大全是可以自己改变的
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; }player;
在游戏的右边显示任务的各项属性
函数:
void SetPlayer() { putimage(60 * 13, 0, &Message); outtextxy(60 * 13 + 12, 100, player.name); outtextxy(60 * 13 + 12, 180, intToString(player.Lv)); outtextxy(60 * 13 + 12, 235, intToString(player.Exp)); outtextxy(60 * 13 + 12, 362, intToString(player.HP)); outtextxy(60 * 13 + 12, 425, intToString(player.MP)); outtextxy(60 * 13 + 12, 517, intToString(player.ATT)); outtextxy(60 * 13 + 12, 567, intToString(player.DEF)); outtextxy(60 * 13 + 12, 689, intToString(player.Num_Yellow_Key)); outtextxy(60 * 13 + 12, 759, intToString(player.Num_Blue_Key)); }
由于这个函数要求属性必须是字符串,所以我写了一个把数字转化成字符串的函数
//整数转换为字符 char *intToString(int Number) { int len = 0; if (Number == 0) { str[0] = '0'; len++; } while (Number) { str[len++] = Number % 10+'0'; Number /= 10; } for (int i = 0; i < len/2; i++) { char t = str[i]; str[i] = str[len - i - 1]; str[len - i - 1] = t; } str[len] = ' '; return str; }
怪物属性的定义
struct monster { int HP; //血量 int ATT; //攻击 int DEF; //防御 int Exp; //经验 };
接下来就是定义画布,然后加载图片,我用一个二维数组存下了地图,不同的数字代表不同的图片,然后根据二维数组的值把不同的地方贴上不同的图片。
void SetMap() { for (int i = 0; i < 13; i++) { for (int j = 0; j < 13; j++) { switch (map[i][j]) { case 0: putimage(j * 60, i * 60, &Wall); //墙 break; case 1: putimage(j * 60, i * 60, &Ground); //地板 break; case 2: putimage(j * 60, i * 60, &Blue_door); //蓝门 break; case 3: putimage(j * 60, i * 60, &Yellow_door); //黄门 break; case 4: putimage(j * 60, i * 60, &Blue_Cry); //蓝水晶 break; case 5: putimage(j * 60, i * 60, &Red_Cry); //红水晶 break; case 6: putimage(j * 60, i * 60, &Blue_Key); //蓝钥匙 break; case 7: putimage(j * 60, i * 60, &Yellow_Key); //黄钥匙 break; case 8: putimage(j * 60, i * 60, &Red_Med); //红药水 break; case 9: putimage(j * 60, i * 60, &Blue_Med); //蓝药水 break; case 10: putimage(j * 60, i * 60, &Small_Bat); //小蝙蝠 break; case 11: putimage(j * 60, i * 60, &Small_Wizard); //小巫师 break; case 12: putimage(j * 60, i * 60, &Small_Skull); //小骷髅 break; case 13: putimage(j * 60, i * 60, &Big_Skull); //大骷髅 break; case 14: putimage(j * 60, i * 60, &Green_Slime); //绿史莱姆 break; case 15: putimage(j * 60, i * 60, &Red_Slime); //红史莱姆 break; case 98: putimage(j * 60, i * 60, &Ladder); //梯子 break; case 99: putimage(j * 60, i * 60, &Player); //玩家 break; } } } }
接下来就是人物的移动和战斗了,人物的移动我就是直接对上下左右四种情况分别讨论, 在人物走动的时候要判断能不能走,不能走就不处理,如果能走,就把走到的那个位置上变成人,把之前人的位置变成地板。
case 'w': case 72: if (map[playerx - 1][playery] == 1) { //下一步是地板 map[playerx - 1][playery] = 99; map[playerx][playery] = 1; playerx--; }
需要处理的就是钥匙,门, 水晶, 药水, 怪物。
如果是钥匙,把对应的钥匙数量加1。
如果是门,判断一下对应颜色的钥匙是否足够,如果足够,钥匙数量减1,然后把对应位置上的门变为空地。
如果是药水,吃了之后会增加生命。
如果是水晶,根据水晶的颜色加对应的属性。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/483953.html