你是否还记得有一款游戏叫做“魔塔”?(一)

简介: 你是否还记得有一款游戏叫做“魔塔”?

前言


       近期看到好几篇DOS系统的技术分享博客,我也顺路去搜集了一些相关资料。突发奇想地,我也去搜集了一些DOS游戏。在收集游戏的过程中,当我在 RetroGame 网上看到题图的那一瞬间,我仿佛回到了小学,那段手握学习机,痴迷的计算自己数值路线,思索自己到第能不能打赢面前这只可恶的红蝙蝠的快乐时光。

image.png

   我终于回想起了它的名字——《魔塔》。


       大多数人最初接触的魔塔游戏都是胖老鼠——基于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')
目录
相关文章
|
2月前
|
移动开发 JavaScript C#
总有一个是你想要的分享31个游戏源代码
该资源分享了31款游戏源代码,包括C#版植物大战僵尸、HTML5版五子棋等,均经过亲测可运行。下载链接中还包含13款游戏源码,适合游戏开发者和爱好者学习参考。作者辛苦整理,希望得到您的点赞与关注作为支持。
80 1
|
4月前
|
网络安全 Python
我不善言辞,但还是想教你做个没用的东西
一个可以禁用任意程序的上下行网络的小工具,有倒计时功能
|
6月前
|
移动开发 JavaScript C#
分享31个游戏源代码总有一个是你想要的
分享31个游戏源代码总有一个是你想要的
186 0
|
图形学 数据安全/隐私保护
还在用Unity开发游戏?那你就out了,试试用Unity做一个答题系统吧
大家都支持Unity是用来做游戏开发,比如说做2D游戏、3D游戏,或者工业虚拟仿真软件的开发。 其他Unity可以做的有很多,比如答题系统。 本篇就介绍答题系统的开发 这个答题系统,可以从文本文档中提取题目和分数,然后绑定到UI上,在答题的过程中,自动判断分数,自动判断正确率。 目的是实现一个可快速导入到项目中使用的小模块。
小白的第二个项目--扫雷游戏
小白的第二个项目--扫雷游戏
87 0
|
C语言
C/关于N子棋小游戏的创建
C/关于N子棋小游戏的创建
|
开发者
你应该试着独自做个游戏
对于大部分从事游戏开发行业的人,其实并没有机会能够完整的去掌控一个游戏制作的全过程。开发的只负责开发工作,美术的只负责美术工作,大概只有策划能够有机会从整体上了解一个游戏,可能在很多公司中,对于策划也分为很多种,如果只是其中的一种策划,也是没有机会的,唯一一个能够从始至终掌控一个游戏的大概叫做总策划或者叫产品经理。
92 0
|
人工智能 移动开发 数据可视化
不会写代码,想要做游戏
嗨!大家好,我是小蚂蚁。 “我不会写代码,还能做游戏吗?”不少想做游戏的朋友可能都会有这个疑问,答案当然是“能”。 即使不会代码,也并不影响你做游戏。会不会写代码,并不是做游戏的必要条件。 感谢工具的力量,是先进的工具让做游戏这件事对很多人来说成为了可能,下面我就为大家介绍几个不需要写代码,也能够做游戏的工具。
183 0
|
开发工具
为什么不要通过去找游戏源码的方式来做游戏
一个来自游戏开发新手朋友的问题: 蚂蚁老师,我从小就很喜欢玩游戏,玩得多了渐渐就有一些自己的想法,没事无聊的时候就会把这些想法写下来,写得多了就有自己做游戏的想法,因为自己什么都不会,所以一直都没能付诸行动,直到有天在抖音刷到您的教学视频,又燃起我做游戏的热情。现在我最想做的是一款类似《植物大战僵尸》类的休闲塔防游戏。
230 0