C语言魔塔游戏的实现代码
很早就很想写这个,今天终于写完了。
游戏截图:
编译环境:VS2017
游戏需要一些图片,如果有想要的或者对游戏有什么看法的可以加我的QQ2985486630讨论,如果暂时没有回应,可以在博客下方留言,到时候我会看到。觉得麻烦的直接下载C-mota_jb51.rar
解压后点击sln文件直接可以运行
下面我来介绍一下游戏的主要功能和实现方式
首先是玩家的定义,使用结构体,这个名字是可以自己改变的
structgamerole { charname[20]="黑蛋";//玩家名字 intHP; //血量 intMP; intDEF; //防御 intATT;//攻击 intLv;//等级 intExp;//经验 intNum_Blue_Key;//蓝钥匙数量 intNum_Yellow_Key; }player;
在游戏的右边显示任务的各项属性
函数:
voidSetPlayer() { 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(intNumber) { intlen=0; if(Number==0){ str[0]='0'; len++; } while(Number) { str[len++]=Number%10+'0'; Number/=10; } for(inti=0;i怪物属性的定义
structmonster { intHP; //血量 intATT;//攻击 intDEF; //防御 intExp;//经验 };接下来就是定义画布,然后加载图片,我用一个二维数组存下了地图,不同的数字代表不同的图片,然后根据二维数组的值把不同的地方贴上不同的图片。
voidSetMap() { for(inti=0;i<13;i++) { for(intj=0;j<13;j++) { switch(map[i][j]) { case0: putimage(j*60,i*60,&Wall);//墙 break; case1: putimage(j*60,i*60,&Ground);//地板 break; case2: putimage(j*60,i*60,&Blue_door);//蓝门 break; case3: putimage(j*60,i*60,&Yellow_door);//黄门 break; case4: putimage(j*60,i*60,&Blue_Cry);//蓝水晶 break; case5: putimage(j*60,i*60,&Red_Cry);//红水晶 break; case6: putimage(j*60,i*60,&Blue_Key);//蓝钥匙 break; case7: putimage(j*60,i*60,&Yellow_Key);//黄钥匙 break; case8: putimage(j*60,i*60,&Red_Med);//红药水 break; case9: putimage(j*60,i*60,&Blue_Med);//蓝药水 break; case10: putimage(j*60,i*60,&Small_Bat);//小蝙蝠 break; case11: putimage(j*60,i*60,&Small_Wizard);//小巫师 break; case12: putimage(j*60,i*60,&Small_Skull);//小骷髅 break; case13: putimage(j*60,i*60,&Big_Skull);//大骷髅 break; case14: putimage(j*60,i*60,&Green_Slime);//绿史莱姆 break; case15: putimage(j*60,i*60,&Red_Slime);//红史莱姆 break; case98: putimage(j*60,i*60,&Ladder);//梯子 break; case99: putimage(j*60,i*60,&Player);//玩家 break; } } } }接下来就是人物的移动和战斗了,人物的移动我就是直接对上下左右四种情况分别讨论,在人物走动的时候要判断能不能走,不能走就不处理,如果能走,就把走到的那个位置上变成人,把之前人的位置变成地板。
case'w': case72: if(map[playerx-1][playery]==1){//下一步是地板 map[playerx-1][playery]=99; map[playerx][playery]=1; playerx--; }需要处理的就是钥匙,门,水晶,药水,怪物。
如果是钥匙,把对应的钥匙数量加1。
如果是门,判断一下对应颜色的钥匙是否足够,如果足够,钥匙数量减1,然后把对应位置上的门变为空地。
如果是药水,吃了之后会增加生命。
如果是水晶,根据水晶的颜色加对应的属性。
当遇到怪物的时候回产生战斗,对于不同的怪物分开处理,下面是小蝙蝠的处理
case10: ID=MessageBox(hwnd,"小蝙蝠","是否攻击?",MB_YESNO); if(ID==IDYES) { if(VS(player.HP,player.ATT,player.DEF,Small_Bat_Pro.HP,Small_Bat_Pro.ATT,Small_Bat_Pro.DEF)){ player.Exp+=Small_Bat_Pro.Exp; return1; } } break;遇到怪物是会弹出对应的对话框
此处有一个VS函数,用于计算战斗是否成功,如果成功,会加相应的属性,如果失败,则会弹出打不过的窗口。
intVS(intplayHP,intplayATT,intplayDEF,intmonHP,intmonATT,intmonDEF) { while(playHP>0||monHP>0) { monHP-=(playATT-monDEF); if(monHP<0) break; playHP-=(monATT-playDEF); } if(playHP>0){ player.HP=playHP; return1; } else{ MessageBox(hwnd,"","打不过",MB_YESNO); return0; } }在每一次敲击键盘后更新地图信息和人物信息:
SetMap();//重新显示地图 SetPlayer();//重新显示角色信息到了这里,游戏的内容也就说的差不多了,虽然我只写出了第一个地图。但是,只要添加地图即可有更多的玩法,有兴趣的同学可以自制关卡,实现更多内容。
最后,加上所有代码,注释上说的也比较清楚。
#include#include #include #include #include #include #include voidinitgamePicture();//加载游戏图片 voidSetPlayer();//显示角色信息 voidinitPlayer();//初始化游戏角色 voidSetMap();//加载游戏地图 char*intToString(intNumber);//把整数转化成字符串 voidplayGame();//开始游戏 intCombat(intx); intVS(intplayHP,intplayATT,intplayDEF,intmonHP,intmonATT,intmonDEF); intplayerx,playery; charstr[20]=""; //地图1 intmap[13][13]={ {0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,98,1,14,15,14,1,1,1,1,1,1,0}, {0,0,0,0,0,0,0,0,0,0,0,1,0}, {0,8,1,1,2,1,0,5,6,1,0,1,0}, {0,1,12,1,0,1,0,4,8,1,0,1,0}, {0,0,2,0,0,1,0,0,0,14,0,1,0}, {0,6,1,1,0,1,3,10,11,10,0,1,0}, {0,1,13,1,0,1,0,0,0,0,0,1,0}, {0,0,2,0,0,1,1,1,1,1,1,1,0}, {0,1,1,1,0,0,14,0,0,0,14,0,0}, {0,8,1,6,0,7,1,6,0,1,10,1,0}, {0,8,1,6,0,1,99,1,0,14,9,14,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0} }; IMAGEWall,Ground,Green_Slime,Red_Slime,Blue_Cry,Red_Cry,Blue_Key,Yellow_Key, Red_Med,Blue_Med,Ladder,Small_Skull,Big_Skull,Small_Bat,Small_Wizard, Blue_door,Yellow_door,Player,Message; HWNDhwnd; structgamerole { charname[20]="黑蛋";//玩家名字 intHP; //血量 intMP; intDEF; //防御 intATT;//攻击 intLv;//等级 intExp;//经验 intNum_Blue_Key;//蓝钥匙数量 intNum_Yellow_Key; }player; structmonster { intHP; //血量 intATT;//攻击 intDEF; //防御 intExp;//经验 }; structmonsterGreen_Slime_Pro={50,10,12,100};//绿史莱姆属性 structmonsterRed_Slime_Pro={100,50,12,500};//红史莱姆属性 structmonsterSmall_Wizard_Pro={100,30,9,400};//小巫师属性 structmonsterSmall_Bat_Pro={20,10,9,50};//小蝙蝠属性 structmonsterSmall_Skull_Pro={30,20,10,200};//小骷髅属性 structmonsterBig_Skull_Pro={60,50,25,300};//大骷髅属性 intmain() { initPlayer(); hwnd=initgraph(60*14,60*13); initgamePicture(); while(1){ SetMap(); SetPlayer(); playGame(); } return0; } /* *显示角色信息 */ voidSetPlayer() { 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)); } /* *加载游戏图片 */ voidinitgamePicture() { loadimage(&Wall,"墙.jpg",60,60); loadimage(&Ground,"地板.jpg",60,60); loadimage(&Green_Slime,"绿史莱姆.jpg",60,60); loadimage(&Red_Slime,"红史莱姆.jpg",60,60); loadimage(&Blue_Cry,"蓝水晶.jpg",60,60); loadimage(&Red_Cry,"红水晶.jpg",60,60); loadimage(&Blue_Key,"蓝钥匙.jpg",60,60); loadimage(&Yellow_Key,"黄钥匙.jpg",60,60); loadimage(&Red_Med,"小红药水.jpg",60,60); loadimage(&Blue_Med,"小蓝药水.jpg",60,60); loadimage(&Ladder,"梯子.jpg",60,60); loadimage(&Small_Bat,"小蝙蝠.jpg",60,60); loadimage(&Small_Wizard,"小巫师.jpg",60,60); loadimage(&Small_Skull,"骷髅兵.jpg",60,60); loadimage(&Big_Skull,"大骷髅兵.jpg",60,60); loadimage(&Blue_door,"蓝门.jpg",60,60); loadimage(&Yellow_door,"黄门.jpg",60,60); loadimage(&Player,"人.jpg",60,60); loadimage(&Message,"info.jpg"); } /* *初始化游戏角色 */ voidinitPlayer() { 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; playerx=11; playery=6; } //整数转换为字符 char*intToString(intNumber) { intlen=0; if(Number==0){ str[0]='0'; len++; } while(Number) { str[len++]=Number%10+'0'; Number/=10; } for(inti=0;i 0||monHP>0) { monHP-=(playATT-monDEF); if(monHP<0) break; playHP-=(monATT-playDEF); } if(playHP>0){ player.HP=playHP; return1; } else{ MessageBox(hwnd,"","打不过",MB_YESNO); return0; } } voidplayGame() { while(1) { charch=_getch(); switch(ch){ case'w': case72: if(map[playerx-1][playery]==1){//下一步是地板 map[playerx-1][playery]=99; map[playerx][playery]=1; playerx--; } elseif(map[playerx-1][playery]==6){//下一步是蓝钥匙 player.Num_Blue_Key++; map[playerx-1][playery]=99; map[playerx][playery]=1; playerx--; } elseif(map[playerx-1][playery]==7){//下一步是黄钥匙 player.Num_Yellow_Key++; map[playerx-1][playery]=99; map[playerx][playery]=1; playerx--; } //下一步是怪物 elseif(map[playerx-1][playery]==10||map[playerx-1][playery]==11|| map[playerx-1][playery]==12||map[playerx-1][playery]==13|| map[playerx-1][playery]==14||map[playerx-1][playery]==15) { intx=Combat(map[playerx-1][playery]); if(x==1){ map[playerx-1][playery]=99; map[playerx][playery]=1; playerx--; } } //红蓝药水 elseif(map[playerx-1][playery]==8||map[playerx-1][playery]==9){ if(map[playerx-1][playery]==8) player.HP+=200; else player.HP+=500; map[playerx-1][playery]=99; map[playerx][playery]=1; playerx--; } //红蓝门 elseif(map[playerx-1][playery]==2||map[playerx-1][playery]==3){ if(map[playerx-1][playery]==2&&player.Num_Blue_Key){ player.Num_Blue_Key--; map[playerx-1][playery]=99; map[playerx][playery]=1; playerx--; } if(map[playerx-1][playery]==3&&player.Num_Yellow_Key){ player.Num_Yellow_Key--; map[playerx-1][playery]=99; map[playerx][playery]=1; playerx--; } } //红蓝水晶 //红水晶+2攻击 //蓝水晶+2防御 elseif(map[playerx-1][playery]==4||map[playerx-1][playery]==5){ if(map[playerx-1][playery]==4) player.DEF+=2; elseif(map[playerx-1][playery]==5) player.ATT+=2; map[playerx-1][playery]=99; map[playerx][playery]=1; playerx--; } break; case's': case80: if(map[playerx+1][playery]==1){//下一步是地板 map[playerx+1][playery]=99; map[playerx][playery]=1; playerx++; } elseif(map[playerx+1][playery]==6){//下一步是蓝钥匙 player.Num_Blue_Key++; map[playerx+1][playery]=99; map[playerx][playery]=1; playerx++; } elseif(map[playerx+1][playery]==7){//下一步是黄钥匙 player.Num_Yellow_Key++; map[playerx+1][playery]=99; map[playerx][playery]=1; playerx++; } //下一步是怪物 elseif(map[playerx+1][playery]==10||map[playerx+1][playery]==11|| map[playerx+1][playery]==12||map[playerx+1][playery]==13|| map[playerx+1][playery]==14||map[playerx+1][playery]==15) { intx=Combat(map[playerx+1][playery]); if(x==1){ map[playerx+1][playery]=99; map[playerx][playery]=1; playerx++; } } //红蓝药水 elseif(map[playerx+1][playery]==8||map[playerx+1][playery]==9){ if(map[playerx+1][playery]==8) player.HP+=200; else player.HP+=500; map[playerx+1][playery]=99; map[playerx][playery]=1; playerx++; } //红蓝门 elseif(map[playerx+1][playery]==2||map[playerx+1][playery]==3){ if(map[playerx+1][playery]==2&&player.Num_Blue_Key){ player.Num_Blue_Key++; map[playerx+1][playery]=99; map[playerx][playery]=1; playerx++; } if(map[playerx+1][playery]==3&&player.Num_Yellow_Key){ player.Num_Yellow_Key++; map[playerx+1][playery]=99; map[playerx][playery]=1; playerx++; } } //红蓝水晶 //红水晶+2攻击 //蓝水晶+2防御 elseif(map[playerx+1][playery]==4||map[playerx+1][playery]==5){ if(map[playerx+1][playery]==4) player.DEF+=2; elseif(map[playerx+1][playery]==5) player.ATT+=2; map[playerx+1][playery]=99; map[playerx][playery]=1; playerx++; } break; case'a': case75: if(map[playerx][playery-1]==1){//下一步是地板 map[playerx][playery-1]=99; map[playerx][playery]=1; playery--; } elseif(map[playerx][playery-1]==6){//下一步是蓝钥匙 player.Num_Blue_Key++; map[playerx][playery-1]=99; map[playerx][playery]=1; playery--; } elseif(map[playerx][playery-1]==7){//下一步是黄钥匙 player.Num_Yellow_Key++; map[playerx][playery-1]=99; map[playerx][playery]=1; playery--; } //下一步是怪物 elseif(map[playerx][playery-1]==10||map[playerx][playery-1]==11|| map[playerx][playery-1]==12||map[playerx][playery-1]==13|| map[playerx][playery-1]==14||map[playerx][playery-1]==15) { intx=Combat(map[playerx][playery-1]); if(x==1){ map[playerx][playery-1]=99; map[playerx][playery]=1; playery--; } } //红蓝药水 elseif(map[playerx][playery-1]==8||map[playerx][playery-1]==9){ if(map[playerx][playery-1]==8) player.HP+=200; else player.HP+=500; map[playerx][playery-1]=99; map[playerx][playery]=1; playery--; } //红蓝门 elseif(map[playerx][playery-1]==2||map[playerx][playery-1]==3){ if(map[playerx][playery-1]==2&&player.Num_Blue_Key){ player.Num_Blue_Key--; map[playerx][playery-1]=99; map[playerx][playery]=1; playery--; } if(map[playerx][playery-1]==3&&player.Num_Yellow_Key){ player.Num_Yellow_Key--; map[playerx][playery-1]=99; map[playerx][playery]=1; playery--; } } //红蓝水晶 //红水晶+2攻击 //蓝水晶+2防御 elseif(map[playerx][playery-1]==4||map[playerx][playery-1]==5){ if(map[playerx][playery-1]==4) player.DEF+=2; elseif(map[playerx][playery-1]==5) player.ATT+=2; map[playerx][playery-1]=99; map[playerx][playery]=1; playery--; } break; case'd': case77: if(map[playerx][playery+1]==1){//下一步是地板 map[playerx][playery+1]=99; map[playerx][playery]=1; playery++; } elseif(map[playerx][playery+1]==6){//下一步是蓝钥匙 player.Num_Blue_Key++; map[playerx][playery+1]=99; map[playerx][playery]=1; playery++; } elseif(map[playerx][playery+1]==7){//下一步是黄钥匙 player.Num_Yellow_Key++; map[playerx][playery+1]=99; map[playerx][playery]=1; playery++; } //下一步是怪物 elseif(map[playerx][playery+1]==10||map[playerx][playery+1]==11|| map[playerx][playery+1]==12||map[playerx][playery+1]==13|| map[playerx][playery+1]==14||map[playerx][playery+1]==15) { intx=Combat(map[playerx][playery+1]); if(x==1){ map[playerx][playery+1]=99; map[playerx][playery]=1; playery++; } } //红蓝药水 elseif(map[playerx][playery+1]==8||map[playerx][playery+1]==9){ if(map[playerx][playery+1]==8) player.HP+=200; else player.HP+=500; map[playerx][playery+1]=99; map[playerx][playery]=1; playery++; } //红蓝门 elseif(map[playerx][playery+1]==2||map[playerx][playery+1]==3){ if(map[playerx][playery+1]==2&&player.Num_Blue_Key){ player.Num_Blue_Key--; map[playerx][playery+1]=99; map[playerx][playery]=1; playery++; } if(map[playerx][playery+1]==3&&player.Num_Yellow_Key){ player.Num_Yellow_Key--; map[playerx][playery+1]=99; map[playerx][playery]=1; playery++; } } //红蓝水晶 //红水晶+2攻击 //蓝水晶+2防御 elseif(map[playerx][playery+1]==4||map[playerx][playery+1]==5){ if(map[playerx][playery+1]==4) player.DEF+=2; elseif(map[playerx][playery+1]==5) player.ATT+=2; map[playerx][playery+1]=99; map[playerx][playery]=1; playery++; } break; } SetMap();//重新显示地图 SetPlayer();//重新显示角色信息 } } 到此这篇关于C语言魔塔游戏的实现代码的文章就介绍到这了,更多相关C语言魔塔游戏内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。