前言
近期看到好几篇DOS系统的技术分享博客,我也顺路去搜集了一些相关资料。突发奇想地,我也去搜集了一些DOS游戏。在收集游戏的过程中,当我在 RetroGame 网上看到题图的那一瞬间,我仿佛回到了小学,那段手握学习机,痴迷的计算自己数值路线,思索自己到第能不能打赢面前这只可恶的红蝙蝠的快乐时光。
我终于回想起了它的名字——《魔塔》。
大多数人最初接触的魔塔游戏都是胖老鼠——基于Flash技术将原作改编为21/24层的汉化魔塔——上传到在线游戏网站的那一版,没错,就是那款被各路厂商盗用后广为流传的经典魔塔。我第一次接触到的也是这个版本。
作为第一部(仅)有中文的魔塔,胖老鼠魔塔可以说创造了一代的经典——固定的数值设计,简单明了的道具系统,可操作性极佳的成长方法,都令玩家轻易的沉迷其中。是的,这就是这个游戏与其后续衍生作品中最独特的地方:固定数据的RPG游戏。
而最近又恰巧没有什么好的pygame练手的项目,索性这一次就把这一款童年经典尝试做一个Demo出来吧!
正文
游戏介绍:
一开始名为cxk的玩家角色有 100 的生命值,10 的攻击力,10 的防御力。玩家可以通过获得相应颜色钥匙来打开相应颜色的门,随后攻击鬼怪来获取生命值和金币。药水可以提升生命值,蓝色宝石可以提升防御力,红色宝石可以提升攻击力,直至通过第一层。
游戏开发制作流程
本着“自顶向下”的设计思路,我将其大致分为了三个流程:
1. 收集素材(背景,玩家,敌人,宝石)
2. 创建攻击函数
3. 创建魔塔函数
1.收集素材
百度搜索所需的素材,并通过 ps 来进行简单的处理,此处略。
2.创建攻击函数
作为一款RPG游戏,最直观且重要的肯定是游戏的逻辑对象。
虽然魔塔的界面让我们感觉它是一款简单的地牢游戏,貌似随便打打杀杀就可以过关,但事实上玩这个游戏需要动很多脑筋,任何一个轻率的选择都可能导致游戏的失败,该游戏有属性攻击、防御、生命、金币、经验。对怪物的伤害次数计算公式,是敌人的生命/(自己的攻击-敌人的防御);而伤害的数目计算是怪物伤害次数(敌人的攻击-自己的防御)。
我们先来实现它!
2.1 定义两个对象(主角和怪物)
def fight(A,B,cancel=0): a=A.attack-B.defend b=B.attack-A.defend
2.2 函数输出为【0】表示打不过,胜利输出受损生命值,设置 cancel 可以撤销本次战斗即回到之前状态
if a<=0: return [0] if a>0 and b<=0: if(cancel==0): A.gold+=B.gold if(cancel!=0): A.life=alife B.life=blife return 0
2.3 进行战斗结果
for i in range(1,100): B.life=B.life-a if B.life<0: if(cancel==0): B.life=blife A.gold+=B.gold if(cancel!=0): A.life=alife B.life=blife return alife-A.life A.life=A.life-b if A.life<0: A.life=alife B.life=blife return [0]
2.4 设置主函数,使一些人物属性,怪物等提示信息显示
if __name__=="__main__": class character: def __init__(self,tuple): self.attack=tuple[0] self.defend=tuple[1] self.life=tuple[2] self.gold=0 def __str__(self): return u"攻击力:%d ,防御力:%d, 生命值:%d,金币: %d"%(self.attack,self.defend,self.life,self.gold) class monster: def __init__(self,tuple): self.attack=tuple[0] self.defend=tuple[1] self.life=tuple[2] self.gold=tuple[3] def __str__(self): return u"攻击力:%d ,防御力:%d, 生命值:%d,"%(self.attack,self.defend,self.life)
2.5 显示人物与怪物得初始位置
CAIXUKUN=character((10,10,100)) //不是小黑子doge gSlime_=monster((11,5,10,1)) rSlime_=monster((12,5,10,2)) sBat_=monster((13,5,10,3)) bWizard_=monster((15,5,10,5)) Skeleton_=monster((18,5,10,8)) scSkeleton_=monster((25,5,10,10)) BOSS=monster((100,5,10,10))
3.创建魔塔函数
此外,我们辛苦白嫖(剽窃doge)来的魔塔素材也得派上用场啊!接下来完成魔塔函数。
3.1 初始化设置
1. pygame.init() 2. pygame.mixer.init()
3.2 加载素材
#环境 wall=pygame.transform.scale(pygame.image.load('w1.png').convert_alpha(),(50,50)) ground=pygame.transform.scale(pygame.image.load('w2.png').convert_alpha(),(50,50)) yellow_door=pygame.transform.scale(pygame.image.load('d1.png').convert_alpha(),(50,50)) blue_door=pygame.transform.scale(pygame.image.load('d2.png').convert_alpha(),(50,50)) red_door=pygame.transform.scale(pygame.image.load('d3.png').convert_alpha(),(50,50)) special_door=pygame.transform.scale(pygame.image.load('d4.png').convert_alpha(),(50,50)) ykey=pygame.transform.scale(pygame.image.load('ykey.png').convert_alpha(),(50,50)) bkey=pygame.transform.scale(pygame.image.load('bkey.png').convert_alpha(),(50,50)) rkey=pygame.transform.scale(pygame.image.load('rkey.png').convert_alpha(),(50,50)) rbottle=pygame.transform.scale(pygame.image.load('rbottle.png').convert_alpha(),(50,50)) bbottle=pygame.transform.scale(pygame.image.load('bbottle.png').convert_alpha(),(50,50)) rgem=pygame.transform.scale(pygame.image.load('rgem.png').convert_alpha(),(50,50)) bgem=pygame.transform.scale(pygame.image.load('bgem.png').convert_alpha(),(50,50)) upstair=pygame.transform.scale(pygame.image.load('upstair.png').convert_alpha(),(50,50)) downstair=pygame.transform.scale(pygame.image.load('downstair.png').convert_alpha(),(50,50)) #怪物 rSlime=pygame.transform.scale(pygame.image.load('rSlime.png').convert_alpha(),(50,50)) gSlime=pygame.transform.scale(pygame.image.load('gSlime.png').convert_alpha(),(50,50)) bSlime=pygame.transform.scale(pygame.image.load('bSlime.png').convert_alpha(),(50,50)) kSlime=pygame.transform.scale(pygame.image.load('kSlime.png').convert_alpha(),(50,50)) sBat=pygame.transform.scale(pygame.image.load('sBat.png').convert_alpha(),(50,50)) bBat=pygame.transform.scale(pygame.image.load('bBat.png').convert_alpha(),(50,50)) rBat=pygame.transform.scale(pygame.image.load('rBat.png').convert_alpha(),(50,50)) bWizard=pygame.transform.scale(pygame.image.load('bWizard.png').convert_alpha(),(50,50)) rWizard=pygame.transform.scale(pygame.image.load('rWizard.png').convert_alpha(),(50,50)) Skeleton=pygame.transform.scale(pygame.image.load('Skeleton.png').convert_alpha(),(50,50)) scSkeleton=pygame.transform.scale(pygame.image.load('scSkeleton.png').convert_alpha(),(50,50)) bcSkeleton=pygame.transform.scale(pygame.image.load('bcSkeleton.png').convert_alpha(),(50,50)) ghost=pygame.transform.scale(pygame.image.load('ghost.png').convert_alpha(),(50,50)) lGuard=pygame.transform.scale(pygame.image.load('lGuard.png').convert_alpha(),(50,50)) mGuard=pygame.transform.scale(pygame.image.load('mGuard.png').convert_alpha(),(50,50)) hGuard=pygame.transform.scale(pygame.image.load('hGuard.png').convert_alpha(),(50,50)) lWitch=pygame.transform.scale(pygame.image.load('lWitch.png').convert_alpha(),(50,50)) hWitch=pygame.transform.scale(pygame.image.load('hWitch.png').convert_alpha(),(50,50)) Orc=pygame.transform.scale(pygame.image.load('Orc.png').convert_alpha(),(50,50)) wOrc=pygame.transform.scale(pygame.image.load('wOrc.png').convert_alpha(),(50,50)) Stone=pygame.transform.scale(pygame.image.load('Stone.png').convert_alpha(),(50,50)) Swordsman=pygame.transform.scale(pygame.image.load('Swordsman.png').convert_alpha(),(50,50)) wGhost=pygame.transform.scale(pygame.image.load('wGhost.png').convert_alpha(),(50,50)) Vampier=pygame.transform.scale(pygame.image.load('Vampier.png').convert_alpha(),(50,50)) #神秘人和宝物 guide=pygame.transform.scale(pygame.image.load('guide.png').convert_alpha(),(50,50)) merchant=pygame.transform.scale(pygame.image.load('merchant.png').convert_alpha(),(50,50)) princess=pygame.transform.scale(pygame.image.load('princess.png').convert_alpha(),(50,50)) lift=pygame.transform.scale(pygame.image.load('lift.png').convert_alpha(),(50,50)) #商店 shop=pygame.transform.scale(pygame.image.load('shop.png').convert_alpha(),(150,50))
3.3 背景音乐
1. pygame.mixer.music.load('background.mp3') 2. pygame.mixer.music.play() 3. musicPlaying=False
3.4 一些音效:打怪,开门,通过等
sound0=pygame.mixer.Sound('0.wav') sound1=pygame.mixer.Sound('1.wav') sound2=pygame.mixer.Sound('2.wav') sound3=pygame.mixer.Sound('3.wav') sound4=pygame.mixer.Sound('4.wav') sound5=pygame.mixer.Sound('5.wav') sound6=pygame.mixer.Sound('6.wav')