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

news/2024/12/28 9:47:02/

目录

前言

正文

游戏介绍:

游戏开发制作流程 

1.收集素材

2.创建攻击函数

2.1 定义两个对象(主角和怪物)

2.2 函数输出为【0】表示打不过,胜利输出受损生命值,设置 cancel 可以撤销本次战斗即回到之前状态

2.3 进行战斗结果

2.4 设置主函数,使一些人物属性,怪物等提示信息显示

2.5 显示人物与怪物得初始位置

3.创建魔塔函数

3.1 初始化设置

3.2 加载素材

3.3 背景音乐

3.4 一些音效:打怪,开门,通过等

3.5 等待 1 秒让 mixer 完成初始化

3.6 加载字体

3.7 最上面一格

3.8 加载属性框,包括矩形的四个参数 left,top,width,height

3.9 获得钥匙图片所在得位置得矩形对象

3.10 人物类

3.11 一些其它判断机制

3.12 怪物类

3.13 铺地板:范围从(200,50)到(700,550)

3.14 墙壁的位置(矩形左上角(left,top))

3.15 门的位置

3.16 宝物的位置

3.17 怪物的位置

3.18 门,楼梯,宝物

3.19 创建矩形对象的列表——用于判断所遇到的事件

3.20 将怪物放入列表

3.21 键盘控制

3.22 设置一个简单外挂,鼠标点击左键钥匙 + 1 ,右键钥匙 - 1,中键归 0

3.23 电梯功能

3.24 开始画地图

3.25 对于列表中碰撞以后的元素

3.26 红血瓶

3.27 蓝血瓶

3.28 战斗事件

3.29 侧边栏背景

3.30 任务栏

3.31 属性栏

3.32 钥匙数量

3.33 物品栏

3.34 如果获得则在右侧边栏加上该宝物

3.35 属性栏

代码参考

fight.py

TowerTest.py

总结

一点回忆

“作者”说

是的,时间已经过去


14天学习训练营导师课程:
李宁《Python Pygame游戏开发入门与实战》
李宁《计算机视觉OpenCV Python项目实战》1
李宁《计算机视觉OpenCV Python项目实战》2
李宁《计算机视觉OpenCV Python项目实战》3


前言

        近期看到好几篇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.defendb=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.goldif(cancel!=0):A.life=alifeB.life=blifereturn 0

2.3 进行战斗结果

for i in range(1,100):B.life=B.life-aif B.life<0:if(cancel==0):B.life=blifeA.gold+=B.goldif(cancel!=0):A.life=alifeB.life=blifereturn alife-A.lifeA.life=A.life-bif A.life<0:A.life=alifeB.life=blifereturn [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=0def __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 初始化设置

pygame.init()
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 背景音乐

pygame.mixer.music.load('background.mp3')
pygame.mixer.music.play()
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')

3.5 等待 1 秒让 mixer 完成初始化

pygame.time.delay(1000)

3.6 加载字体

        这些个都可以自己选哈。

my_FontCH=pygame.font.Font('【春田】小火锅安卓.ttf',30)
my_FontCHs=pygame.font.Font('方正正中黑简体.TTF',30)
my_FontEN=pygame.font.Font('KeeponTruckin.ttf',30)

3.7 最上面一格

text_surface0=my_FontCH.render('小游戏',True,(0,0,0),(191,191,191))

3.8 加载属性框,包括矩形的四个参数 left,top,width,height

att_rect1=pygame.Rect(0,50,200,600)
att_rect2=pygame.Rect(750,50,200,600)
att_rect3=pygame.Rect(200,600,550,50)
att_rect4=pygame.Rect(0,0,950,50)

3.9 获得钥匙图片所在得位置得矩形对象

ykey_rect=ykey.get_rect()
ykey_rect.left,ykey_rect.top=0,400
bkey_rect=bkey.get_rect()
bkey_rect.left,bkey_rect.top=0,450
rkey_rect=rkey.get_rect()
rkey_rect.left,rkey_rect.top=0,500

3.10 人物类

class character:def __init__(self,tuple):self.floor=1self.attack=tuple[0]self.defend=tuple[1]self.life=tuple[2]self.gold=0#物品栏self.property={'Yellow_key':0,'Blue_key':0,'Red_key':0}#图像self.image=pygame.transform.scale(pygame.image.load('character.png').convert_alpha(),(50,50))self.bg=pygame.transform.scale(pygame.image.load('w2.png').convert_alpha(),(50,50))self.image_rect=self.image.get_rect()self.image_rect.left=450self.image_rect.top=550

3.11 一些其它判断机制

3.11-1 门在没有对应钥匙时不可通过

if str=="UP":FORBID=0rect_new=self.image_rect.copy()rect_new.move_ip(0,-50)

3.11-2 判断是否撞墙

for wall_ in wallL[:]:if rect_new.colliderect(wall_):FORBID=1

3.11-3 检测是否在没有钥匙时通过门

for y_door in ydoorL[:]:if rect_new.colliderect(y_door) and self.property["Yellow_key"]==0:FORBID=1
for b_door in bdoorL[:]:if rect_new.colliderect(b_door) and self.property["Blue_key"]==0:FORBID=1
for r_door in rdoorL[:]:if rect_new.colliderect(r_door) and self.property["Red_key"]==0:FORBID=1

3.11-4 打不过怪时不可通过

for monster_ in list_morect[:]:if rect_new.colliderect(monster_):x=list_morect.index(monster_)if(fight(CAIXUKUN,eval(list_moname[x]+"_"),1))==[0]:sound5.play()FORBID=1
if FORBID==1:pass

3.11-5 判断是否出界

else:if self.image_rect.top<100:passelse:self.image_rect.move_ip(0,-50)

3.12 怪物类

class monster:def __init__(self,tuple):self.attack=tuple[0]self.defend=tuple[1]self.life=tuple[2]self.gold=tuple[3]

3.13 铺地板:范围从(200,50)到(700,550)

ground_L=[]
for i in range(4,14+1):for j in range(1,11+1):ground_L.append((50*i,50*j))

3.14 墙壁的位置(矩形左上角(left,top))

wall_L=[(200,100),(250,100),(300,100),(350,100),(400,100),(450,100),(500,100),(550,100),(600,100),(650,100),(450,150),(450,200),(450,250),(450,350),(500,250),(550,250),(650,250),(650,150),(650,200),(600,350),(550,350),(500,350),(650,350),(650,300),(350,200),(350,250),(350,300),(350,350),(350,400),(350,450),(350,500),(350,550),(300,250),(200,250),(300,400),(200,400),(400,450),(550,450),(600,450),(500,450),(550,500),(550,550),(700,450)]

3.15 门的位置

dict_door={(350,150):'yellow',(250,250):'blue',(600,250):'yellow',(450,300):'yellow',(250,400):'yellow',(450,450):'yellow',(450,450):'yellow',(650,450):'red',(600,250):'red'}

3.16 宝物的位置

dict_trea={(550,150):'ykey',(200,350):'ykey',(300,500):'ykey',(400,500):'ykey',(400,550):'bkey',(400,250):'rkey',(600,150):'rkey',(400,200):'ykey',(200,150):'ykey',(300,550):'ykey',(200,150):'rbottle',(100,350):'rbottle',(500,150):'rgem',(500,200):'bgem',(550,200):'rbottle',(200,550):'rbottle',(200,500):'bbottle',(650,550):'bbottle',(650,500):'bgem',}
#楼梯

3.17 怪物的位置

dict_monster={(300,50):'gSlime',(400,50):'gSlime',(600,550):'sBat',(700,550):'sBat',(350,50):'gSlime',(500,300):'rSlime',(500,300):'rSlime',
(250,300):'hWitch',(250,450):'ghost',(550,300):'ghost',(600,300):'rSlime'}

3.18 门,楼梯,宝物

List_temp1=[k for k,v in dict_door.items() if v=='yellow']
List_temp2=[k for k,v in dict_stair.items() if v=='up']
List_temp3=[k for k,v in dict_trea.items() if v=='rbottle']
List_temp4=[k for k,v in dict_trea.items() if v=='bbottle']
List_temp5=[k for k,v in dict_trea.items() if v=='rgem']
List_temp6=[k for k,v in dict_trea.items() if v=='bgem']
List_temp7=[k for k,v in dict_trea.items() if v=='ykey']
List_temp8=[k for k,v in dict_door.items() if v=='blue']
List_temp9=[k for k,v in dict_trea.items() if v=='bkey']
List_temp10=[k for k,v in dict_door.items() if v=='red']
List_temp11=[k for k,v in dict_trea.items() if v=='rk']

3.19 创建矩形对象的列表——用于判断所遇到的事件

def build_List(LIST1,LIST2):for i in range(1,len(LIST2)+1):LIST1.append(pygame.Rect(LIST2[i-1][0],LIST2[i-1][1],50,50))
wallL=[]
build_List(wallL,wall_L)ydoorL=[]
build_List(ydoorL,List_temp1)bdoorL=[]
build_List(bdoorL,List_temp8)rdoorL=[]
build_List(rdoorL,List_temp10)stairupL=[]
build_List(stairupL,List_temp2)rbottleL=[]
build_List(rbottleL,List_temp3)bbottleL=[]
build_List(bbottleL,List_temp4)rgemL=[]
build_List(rgemL,List_temp5)bgemL=[]
build_List(bgemL,List_temp6)ykeyL=[]
build_List(ykeyL,List_temp7)bkeyL=[]
build_List(bkeyL,List_temp9)rkeyL=[]
build_List(rkeyL,List_temp11)

3.20 将怪物放入列表

guideL=[]
guideL.append(pygame.Rect(Guide[0][0],Guide[0][1],50,50))liftL=[]
liftL.append(pygame.Rect(Lift[0][0],Lift[0][1],50,50))

3.21 键盘控制

for event in pygame.event.get():if event.type==pygame.QUIT:sys.exit()elif event.type==pygame.KEYDOWN:if event.key==pygame.K_w:CAIXUKUN.move("UP")if event.key == pygame.K_s:CAIXUKUN.move("DOWN")if event.key==pygame.K_a:CAIXUKUN.move("LEFT")if event.key==pygame.K_d:CAIXUKUN.move("RIGHT")

3.22 设置一个简单外挂,鼠标点击左键钥匙 + 1 ,右键钥匙 - 1,中键归 0

elif event.type==pygame.MOUSEBUTTONDOWN:if ykey_rect.collidepoint(event.pos):if event.button==1:CAIXUKUN.property["Yellow_key"]+=1sound4.play()elif event.button==2:CAIXUKUN.property["Yellow_key"]=0elif event.button==3:CAIXUKUN.property["Yellow_key"]-=1elif bkey_rect.collidepoint(event.pos):if event.button==1:CAIXUKUN.property["Blue_key"]+=1sound4.play()elif event.button==2:CAIXUKUN.property["Blue_key"]=0elif event.button==3:CAIXUKUN.property["Blue_key"]-=1elif rkey_rect.collidepoint(event.pos):if event.button==1:CAIXUKUN.property["Red_key"]+=1sound4.play()elif event.button==2:CAIXUKUN.property["Red_key"]=0elif event.button==3:CAIXUKUN.property["Red_key"]-=1

3.23 电梯功能

elif up_lift_rect.collidepoint(event.pos):if event.button==1 and get_lift and CAIXUKUN.floor<66 and CAIXUKUN.floor!=42:CAIXUKUN.floor+=1
elif down_lift_rect.collidepoint(event.pos):if event.button==1 and get_lift and CAIXUKUN.floor>1 and CAIXUKUN.floor!=44:CAIXUKUN.floor-=1

3.24 开始画地图

for i in ground_L:screen.blit(ground,i)
for j in wall_L:screen.blit(wall,j)for k in List_temp1:screen.blit(yellow_door,k)for k in List_temp2:screen.blit(upstair,k)for k in List_temp3:screen.blit(rbottle,k)for k in List_temp4:screen.blit(bbottle,k)for k in List_temp5:screen.blit(rgem,k)for k in List_temp6:screen.blit(bgem,k)for k in List_temp7:screen.blit(ykey,k)for k in List_temp8:screen.blit(blue_door,k)for k in List_temp9:screen.blit(bkey,k)for k in List_temp10:screen.blit(red_door,k)for k in List_temp11:screen.blit(rkey,k)for k in list_molocation:n=list_molocation.index(k)k_name=list_moname[n]screen.blit(eval(k_name),k)
screen.blit(lift,Lift[0])
screen.blit(guide,Guide[0])

3.25 对于列表中碰撞以后的元素

for y_door in ydoorL[:]:if CAIXUKUN.image_rect.colliderect(y_door):if CAIXUKUN.property["Yellow_key"]>0:i=ydoorL.index(y_door)ydoorL.remove(y_door)CAIXUKUN.property["Yellow_key"]-=1del List_temp1[i]else:passfor b_door in bdoorL[:]:if CAIXUKUN.image_rect.colliderect(b_door):if CAIXUKUN.property["Blue_key"]>0:i=bdoorL.index(b_door)bdoorL.remove(b_door)CAIXUKUN.property["Blue_key"]-=1del List_temp8[i]else:passfor r_door in rdoorL[:]:if CAIXUKUN.image_rect.colliderect(r_door):if CAIXUKUN.property["Red_key"]>0:i=rdoorL.index(r_door)rdoorL.remove(r_door)CAIXUKUN.property["Red_key"]-=1del List_temp10[i]else:pass

3.26 红血瓶

for r_bottle in rbottleL[:]:if CAIXUKUN.image_rect.colliderect(r_bottle):sound1.play()i=rbottleL.index(r_bottle)rbottleL.remove(r_bottle)CAIXUKUN.life+=20del List_temp3[i]

3.27 蓝血瓶

for b_bottle in bbottleL[:]:if CAIXUKUN.image_rect.colliderect(b_bottle):sound1.play()i=bbottleL.index(b_bottle)bbottleL.remove(b_bottle)CAIXUKUN.life+=10del List_temp4[i]

3.28 战斗事件

for monster_ in list_morect[:]:if CAIXUKUN.image_rect.colliderect(monster_):x=list_morect.index(monster_)oops=eval(list_moname[x]+'_')if(fight(CAIXUKUN,oops)!=[0]):sound2.play()list_morect[x]=pygame.Rect(-100,-100,50,50)list_molocation[x]=(-100,-100)else:pass

3.29 侧边栏背景

screen.fill((191,191,191),rect=att_rect1,special_flags=0)
screen.fill((191,191,191),rect=att_rect2,special_flags=0)
screen.fill((191,191,191),rect=att_rect3,special_flags=0)
screen.fill((191,191,191),rect=att_rect4,special_flags=0)

3.30 任务栏

screen.blit(ykey,(0,400))
screen.blit(bkey,(0,450))
screen.blit(rkey,(0,500))

3.31 属性栏

text_surface1=my_FontCHs.render("第%s层"%str(CAIXUKUN.floor),True,(0,0,0),(191,191,191))
text_surface2=my_FontCHs.render("攻击力:%s"%str(CAIXUKUN.attack),True,(0,0,0),(191,191,191))
text_surface3=my_FontCHs.render("防御力:%s"%str(CAIXUKUN.defend),True,(0,0,0),(191,191,191))
text_surface4=my_FontCHs.render("生命值:%s"%str(CAIXUKUN.life),True,(0,0,0),(191,191,191))
text_surface5=my_FontCHs.render("金币:%s"%str(CAIXUKUN.gold),True,(0,0,0),(191,191,191))

3.32 钥匙数量

Yellow_key=CAIXUKUN.property['Yellow_key']
Blue_key=CAIXUKUN.property['Blue_key']
Red_key=CAIXUKUN.property['Red_key']

3.33 物品栏

text_surface6=my_FontCHs.render("%s把"%str(Yellow_key),True,(0,0,0),(191,191,191))
text_surface7=my_FontCHs.render("%s把"%str(Blue_key),True,(0,0,0),(191,191,191))
text_surface8=my_FontCHs.render("%s把"%str(Red_key),True,(0,0,0),(191,191,191))
text_surface9=my_FontCHs.render("永久使用宝物",True,(0,0,0),(191,191,191))
text_surface10=my_FontCHs.render("一次使用宝物",True,(0,0,0),(191,191,191))
text_surface11=my_FontCHs.render("自动使用宝物",True,(0,0,0),(191,191,191))

3.34 如果获得则在右侧边栏加上该宝物

if get_lift:screen.blit(pygame.transform.scale(pygame.image.load('life.png').convert_alpha(),(40,40)),(770,100))

3.35 属性栏

screen.blit(text_surface0,(280,0))
screen.blit(text_surface1,(0,100))
screen.blit(text_surface2,(0,150))
screen.blit(text_surface3,(0,200))
screen.blit(text_surface4,(0,250))
screen.blit(text_surface5,(0,300))screen.blit(text_surface6,(100,400))
screen.blit(text_surface7,(100,450))
screen.blit(text_surface8,(100,500))
screen.blit(text_surface9,(758,50))
screen.blit(text_surface10,(758,280))
screen.blit(text_surface11,(758,510))

代码参考

fight.py

def fight(A,B,cancel=0):a=A.attack-B.defendb=B.attack-A.defendalife=A.lifeblife=B.lifeif a<=0:return [0]if a>0 and b<=0:if(cancel==0):A.gold+=B.goldif(cancel!=0):A.life=alifeB.life=blifereturn 0else:for i in range(1,100):B.life=B.life-aif B.life<0:if(cancel==0):B.life=blifeA.gold+=B.goldif(cancel!=0):A.life=alifeB.life=blifereturn alife-A.lifeA.life=A.life-bif A.life<0:A.life=alifeB.life=blifereturn [0]if __name__=="__main__":class character:def __init__(self,tuple):self.attack=tuple[0]self.defend=tuple[1]self.life=tuple[2]self.gold=0def __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)CAIXUKUN=character((10,10,100))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))fight(CAIXUKUN,gSlime_)print(CAIXUKUN)fight(CAIXUKUN,gSlime_,cancel=1)print(CAIXUKUN,rSlime_)print(CAIXUKUN)if (fight(CAIXUKUN,BOSS)==0):print(CAIXUKUN)print(BOSS)

TowerTest.py

import pygame,sysfrom Fight import fightpygame.init()
pygame.mixer.init()size=width,height=950,650
screen=pygame.display.set_mode(size)
pygame.display.set_caption('Tower')#环境
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))#背景音乐
pygame.mixer.music.load('background.mp3')
pygame.mixer.music.play()
musicPlaying=Falsesound0=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')pygame.time.delay(1000)sound0.play()#加载字体
my_FontCH=pygame.font.Font('【春田】小火锅安卓.ttf',30)
my_FontCHs=pygame.font.Font('方正正中黑简体.TTF',30)
my_FontEN=pygame.font.Font('KeeponTruckin.ttf',30)#最上面一格
text_surface0=my_FontCH.render('小游戏',True,(0,0,0),(191,191,191))#矩形的四个值
att_rect1=pygame.Rect(0,50,200,600)
att_rect2=pygame.Rect(750,50,200,600)
att_rect3=pygame.Rect(200,600,550,50)
att_rect4=pygame.Rect(0,0,950,50)#获取钥匙图片所在的位置
ykey_rect=ykey.get_rect()
ykey_rect.left,ykey_rect.top=0,400
bkey_rect=bkey.get_rect()
bkey_rect.left,bkey_rect.top=0,450
rkey_rect=rkey.get_rect()
rkey_rect.left,rkey_rect.top=0,500
#电梯位置
up_lift_rect=pygame.Rect(770,100,40,20)
down_lift_rect=pygame.Rect(770,120,40,20)#人物类
class character:def __init__(self,tuple):self.floor=1self.attack=tuple[0]self.defend=tuple[1]self.life=tuple[2]self.gold=0#物品栏self.property={'Yellow_key':0,'Blue_key':0,'Red_key':0}#图像self.image=pygame.transform.scale(pygame.image.load('character.png').convert_alpha(),(50,50))self.bg=pygame.transform.scale(pygame.image.load('w2.png').convert_alpha(),(50,50))self.image_rect=self.image.get_rect()self.image_rect.left=450self.image_rect.top=550def move(self,str):if str=="UP":FORBID=0rect_new=self.image_rect.copy()rect_new.move_ip(0,-50)for wall_ in wallL[:]:if rect_new.colliderect(wall_):FORBID=1for y_door in ydoorL[:]:if rect_new.colliderect(y_door) and self.property["Yellow_key"]==0:FORBID=1for b_door in bdoorL[:]:if rect_new.colliderect(b_door) and self.property["Blue_key"]==0:FORBID=1for r_door in rdoorL[:]:if rect_new.colliderect(r_door) and self.property["Red_key"]==0:FORBID=1for monster_ in list_morect[:]:if rect_new.colliderect(monster_):x=list_morect.index(monster_)if(fight(CAIXUKUN,eval(list_moname[x]+"_"),1))==[0]:sound5.play()FORBID=1if FORBID==1:passelse:if self.image_rect.top<100:passelse:self.image_rect.move_ip(0,-50)if str=="DOWN":FORBID=0rect_new=self.image_rect.copy()rect_new.move_ip(0,50)for wall_ in wallL[:]:if rect_new.colliderect(wall_):FORBID=1for y_door in ydoorL[:]:if rect_new.colliderect(y_door)and self.property["Yellow_key"]==0:FORBID=1for b_door in bdoorL[:]:if rect_new.colliderect(b_door) and self.property["Blue_key"]==0:FORBID=1for r_door in rdoorL[:]:if rect_new.colliderect(r_door) and self.property["Red_key"]==0:FORBID=1for monster_ in list_morect[:]:if rect_new.colliderect(monster_):x = list_morect.index(monster_)if (fight(CAIXUKUN, eval(list_moname[x] + "_"), 1)) == [0]:sound5.play()FORBID = 1if FORBID == 1:passelse:if self.image_rect.bottom>550:passelse:self.image_rect.move_ip(0, 50)if str == "LEFT":FORBID = 0rect_new = self.image_rect.copy()rect_new.move_ip(-50, 0)for wall_ in wallL[:]:if rect_new.colliderect(wall_):FORBID = 1for y_door in ydoorL[:]:if rect_new.colliderect(y_door) and self.property["Yellow_key"] == 0:FORBID = 1for b_door in bdoorL[:]:if rect_new.colliderect(b_door) and self.property["Blue_key"]==0:FORBID=1for r_door in rdoorL[:]:if rect_new.colliderect(r_door) and self.property["Red_key"]==0:FORBID=1for monster_ in list_morect[:]:if rect_new.colliderect(monster_):x = list_morect.index(monster_)if (fight(CAIXUKUN, eval(list_moname[x] + "_"), 1)) == [0]:sound5.play()FORBID = 1if FORBID == 1:passelse:if self.image_rect.left< 250:passelse:self.image_rect.move_ip(-50,0)if str == "RIGHT":FORBID = 0rect_new = self.image_rect.copy()rect_new.move_ip(50, 0)for wall_ in wallL[:]:if rect_new.colliderect(wall_):FORBID = 1for y_door in ydoorL[:]:if rect_new.colliderect(y_door) and self.property["Yellow_key"] == 0:FORBID = 1for b_door in bdoorL[:]:if rect_new.colliderect(b_door) and self.property["Blue_key"]==0:FORBID=1for r_door in rdoorL[:]:if rect_new.colliderect(r_door) and self.property["Red_key"]==0:FORBID=1for monster_ in list_morect[:]:if rect_new.colliderect(monster_):x = list_morect.index(monster_)if (fight(CAIXUKUN, eval(list_moname[x] + "_"), 1)) == [0]:sound5.play()FORBID = 1if FORBID == 1:passelse:if self.image_rect.right > 700:passelse:self.image_rect.move_ip(50, 0)class monster:def __init__(self,tuple):self.attack=tuple[0]self.defend=tuple[1]self.life=tuple[2]self.gold=tuple[3]CAIXUKUN=character((10,10,100))
gSlime_=monster((11,5,10,1))
rSlime_=monster((12,5,10,2))
sBat_=monster((13,5,10,3))
ghost_=monster((14,5,10,4))
hWitch_=monster((15,5,10,5))
Skeleton_=monster((20,11,10,8))
scSkeleton_=monster((25,11,10,10))ground_L=[]
for i in range(4,14+1):for j in range(1,11+1):ground_L.append((50*i,50*j))wall_L=[(200,100),(250,100),(300,100),(350,100),(400,100),(450,100),(500,100),(550,100),(600,100),(650,100),(450,150),(450,200),(450,250),(450,350),(500,250),(550,250),(650,250),(650,150),(650,200),(600,350),(550,350),(500,350),(650,350),(650,300),(350,200),(350,250),(350,300),(350,350),(350,400),(350,450),(350,500),(350,550),(300,250),(200,250),(300,400),(200,400),(400,450),(550,450),(600,450),(500,450),(550,500),(550,550),(700,450)]
#门
dict_door={(350,150):'yellow',(250,250):'blue',(600,250):'yellow',(450,300):'yellow',(250,400):'yellow',(450,450):'yellow',(450,450):'yellow',(650,450):'red',(600,250):'red'}
#宝物
dict_trea={(550,150):'ykey',(200,350):'ykey',(300,500):'ykey',(400,500):'ykey',(400,550):'bkey',(400,250):'rkey',(600,150):'rkey',(400,200):'ykey',(200,150):'ykey',(300,550):'ykey',(200,150):'rbottle',(100,350):'rbottle',(500,150):'rgem',(500,200):'bgem',(550,200):'rbottle',(200,550):'rbottle',(200,500):'bbottle',(650,550):'bbottle',(650,500):'bgem',}#楼梯
dict_stair={(200,50):'up'}#怪物
dict_monster={(300,50):'gSlime',(400,50):'gSlime',(600,550):'sBat',(700,550):'sBat',(350,50):'gSlime',(500,300):'rSlime',(500,300):'rSlime',
(250,300):'hWitch',(250,450):'ghost',(550,300):'ghost',(600,300):'rSlime'}#神秘人
Guide=[(500,500)]
Lift=[(250,550)]get_lift=0List_temp1=[k for k,v in dict_door.items() if v=='yellow']
List_temp2=[k for k,v in dict_stair.items() if v=='up']
List_temp3=[k for k,v in dict_trea.items() if v=='rbottle']
List_temp4=[k for k,v in dict_trea.items() if v=='bbottle']
List_temp5=[k for k,v in dict_trea.items() if v=='rgem']
List_temp6=[k for k,v in dict_trea.items() if v=='bgem']
List_temp7=[k for k,v in dict_trea.items() if v=='ykey']
List_temp8=[k for k,v in dict_door.items() if v=='blue']
List_temp9=[k for k,v in dict_trea.items() if v=='bkey']
List_temp10=[k for k,v in dict_door.items() if v=='red']
List_temp11=[k for k,v in dict_trea.items() if v=='rkey']def build_List(LIST1,LIST2):for i in range(1,len(LIST2)+1):LIST1.append(pygame.Rect(LIST2[i-1][0],LIST2[i-1][1],50,50))wallL=[]
build_List(wallL,wall_L)ydoorL=[]
build_List(ydoorL,List_temp1)bdoorL=[]
build_List(bdoorL,List_temp2)rdoorL=[]
build_List(rdoorL,List_temp3)stairupL=[]
build_List(stairupL,List_temp4)rbottleL=[]
build_List(rbottleL,List_temp5)bbottleL=[]
build_List(bbottleL,List_temp6)rgemL=[]
build_List(rgemL,List_temp7)bgemL=[]
build_List(bgemL,List_temp8)ykeyL=[]
build_List(ykeyL,List_temp9)bkeyL=[]
build_List(bkeyL,List_temp10)rkeyL=[]
build_List(rkeyL,List_temp11)list_molocation=list(dict_monster)
list_moname=list(dict_monster.values())
list_morect=[]
build_List(list_morect,list_molocation)guideL=[]
guideL.append(pygame.Rect(Guide[0][0],Guide[0][1],50,50))liftL=[]
liftL.append(pygame.Rect(Lift[0][0],Lift[0][1],50,50))while True:for event in pygame.event.get():if event.type==pygame.QUIT:sys.exit()elif event.type==pygame.KEYDOWN:if event.key==pygame.K_w:CAIXUKUN.move("UP")if event.key == pygame.K_s:CAIXUKUN.move("DOWN")if event.key==pygame.K_a:CAIXUKUN.move("LEFT")if event.key==pygame.K_d:CAIXUKUN.move("RIGHT")if event.key==pygame.K_p:if musicPlaying:pygame.mixer.music.stop()else:pygame.mixer.music.play(-1)musicPlaying=not musicPlayingif event.key==pygame.K_1:sound0.play()elif event.type==pygame.MOUSEBUTTONDOWN:if ykey_rect.collidepoint(event.pos):if event.button==1:CAIXUKUN.property["Yellow_key"]+=1sound4.play()elif event.button==2:CAIXUKUN.property["Yellow_key"]=0elif event.button==3:CAIXUKUN.property["Yellow_key"]-=1elif bkey_rect.collidepoint(event.pos):if event.button==1:CAIXUKUN.property["Blue_key"]+=1sound4.play()elif event.button==2:CAIXUKUN.property["Blue_key"]=0elif event.button==3:CAIXUKUN.property["Blue_key"]-=1elif rkey_rect.collidepoint(event.pos):if event.button==1:CAIXUKUN.property["Red_key"]+=1sound4.play()elif event.button==2:CAIXUKUN.property["Red_key"]=0elif event.button==3:CAIXUKUN.property["Red_key"]-=1elif up_lift_rect.collidepoint(event.pos):if event.button==1 and get_lift and CAIXUKUN.floor<66 and CAIXUKUN.floor!=42:CAIXUKUN.floor+=1elif down_lift_rect.collidepoint(event.pos):if event.button==1 and get_lift and CAIXUKUN.floor>1 and CAIXUKUN.floor!=44:CAIXUKUN.floor-=1for i in ground_L:screen.blit(ground,i)for j in wall_L:screen.blit(wall,j)for k in List_temp1:screen.blit(yellow_door,k)for k in List_temp8:screen.blit(blue_door,k)for k in List_temp10:screen.blit(red_door,k)for k in List_temp2:screen.blit(upstair,k)for k in List_temp3:screen.blit(rbottle,k)for k in List_temp4:screen.blit(bbottle,k)for k in List_temp5:screen.blit(rgem,k)for k in List_temp6:screen.blit(bgem,k)for k in List_temp7:screen.blit(ykey,k)for k in List_temp9:screen.blit(bkey,k)for k in List_temp11:screen.blit(rkey,k)for k in list_molocation:n=list_molocation.index(k)k_name=list_moname[n]screen.blit(eval(k_name),k)screen.blit(lift,Lift[0])screen.blit(guide,Guide[0])#黄门for y_door in ydoorL[:]:if CAIXUKUN.image_rect.colliderect(y_door):if CAIXUKUN.property["Yellow_key"]>0:i=ydoorL.index(y_door)ydoorL.remove(y_door)CAIXUKUN.property["Yellow_key"]-=1del List_temp1[i]else:passfor b_door in bdoorL[:]:if CAIXUKUN.image_rect.colliderect(b_door):if CAIXUKUN.property["Blue_key"]>0:i=bdoorL.index(b_door)bdoorL.remove(b_door)CAIXUKUN.property["Blue_key"]-=1del List_temp8[i]else:passfor r_door in rdoorL[:]:if CAIXUKUN.image_rect.colliderect(r_door):if CAIXUKUN.property["Red_key"]>0:i=rdoorL.index(r_door)rdoorL.remove(r_door)CAIXUKUN.property["Red_key"]-=1del List_temp10[i]else:pass#红血瓶for r_bottle in rbottleL[:]:if CAIXUKUN.image_rect.colliderect(r_bottle):sound1.play()i=rbottleL.index(r_bottle)rbottleL.remove(r_bottle)CAIXUKUN.life+=20del List_temp3[i]#蓝血瓶for b_bottle in bbottleL[:]:if CAIXUKUN.image_rect.colliderect(b_bottle):sound1.play()i=bbottleL.index(b_bottle)bbottleL.remove(b_bottle)CAIXUKUN.life+=10del List_temp4[i]for r_gem in rgemL[:]:if CAIXUKUN.image_rect.colliderect(r_gem):sound1.play()i=rgemL.index(r_gem)rgemL.remove(r_gem)CAIXUKUN.attack +=2del List_temp5[i]for b_gem in bgemL[:]:if CAIXUKUN.image_rect.colliderect(b_gem):sound1.play()i=bgemL.index(b_gem)bgemL.remove(b_gem)CAIXUKUN.defend +=2del List_temp6[i]for y_key in ykeyL[:]:if CAIXUKUN.image_rect.colliderect(y_key):i=ykeyL.index(y_key)ykeyL.remove(y_key)CAIXUKUN.property['Yellow_key']+=1del List_temp7[i]for b_key in bkeyL[:]:if CAIXUKUN.image_rect.colliderect(b_key):i=bkeyL.index(b_key)bkeyL.remove(b_key)CAIXUKUN.property['Blue_key']+=1del List_temp9[i]for r_key in rkeyL[:]:if CAIXUKUN.image_rect.colliderect(r_key):i=rkeyL.index(r_key)rkeyL.remove(r_key)CAIXUKUN.property['Red_key']+=1del List_temp11[i]#战斗事件for monster_ in list_morect[:]:if CAIXUKUN.image_rect.colliderect(monster_):x=list_morect.index(monster_)oops=eval(list_moname[x]+'_')if(fight(CAIXUKUN,oops)!=[0]):sound2.play()list_morect[x]=pygame.Rect(-100,-100,50,50)list_molocation[x]=(-100,-100)else:passfor lift_ in liftL[:]:if CAIXUKUN.image_rect.colliderect(lift_):sound6.play()liftL.remove(lift_)get_lift=1Lift[0]=(-100,-100)#侧边栏背景screen.fill((191,191,191),rect=att_rect1,special_flags=0)screen.fill((191,191,191),rect=att_rect2,special_flags=0)screen.fill((191,191,191),rect=att_rect3,special_flags=0)screen.fill((191,191,191),rect=att_rect4,special_flags=0)#任务栏screen.blit(ykey,(0,400))screen.blit(bkey,(0,450))screen.blit(rkey,(0,500))#属性栏text_surface1=my_FontCHs.render("第%s层"%str(CAIXUKUN.floor),True,(0,0,0),(191,191,191))text_surface2=my_FontCHs.render("攻击力:%s"%str(CAIXUKUN.attack),True,(0,0,0),(191,191,191))text_surface3=my_FontCHs.render("防御力:%s"%str(CAIXUKUN.defend),True,(0,0,0),(191,191,191))text_surface4=my_FontCHs.render("生命值:%s"%str(CAIXUKUN.life),True,(0,0,0),(191,191,191))text_surface5=my_FontCHs.render("金币:%s"%str(CAIXUKUN.gold),True,(0,0,0),(191,191,191))#钥匙数量Yellow_key=CAIXUKUN.property['Yellow_key']Blue_key=CAIXUKUN.property['Blue_key']Red_key=CAIXUKUN.property['Red_key']text_surface6=my_FontCHs.render("%s把"%str(Yellow_key),True,(0,0,0),(191,191,191))text_surface7=my_FontCHs.render("%s把"%str(Blue_key),True,(0,0,0),(191,191,191))text_surface8=my_FontCHs.render("%s把"%str(Red_key),True,(0,0,0),(191,191,191))text_surface9=my_FontCHs.render("永久使用宝物",True,(0,0,0),(191,191,191))text_surface10=my_FontCHs.render("一次使用宝物",True,(0,0,0),(191,191,191))text_surface11=my_FontCHs.render("自动使用宝物",True,(0,0,0),(191,191,191))if get_lift:screen.blit(pygame.transform.scale(pygame.image.load('life.png').convert_alpha(),(40,40)),(770,100))screen.blit(CAIXUKUN.image,CAIXUKUN.image_rect)#属性栏screen.blit(text_surface0,(280,0))screen.blit(text_surface1,(0,100))screen.blit(text_surface2,(0,150))screen.blit(text_surface3,(0,200))screen.blit(text_surface4,(0,250))screen.blit(text_surface5,(0,300))screen.blit(text_surface6,(100,400))screen.blit(text_surface7,(100,450))screen.blit(text_surface8,(100,500))screen.blit(text_surface9,(758,50))screen.blit(text_surface10,(758,280))screen.blit(text_surface11,(758,510))pygame.display.update()

总结

一点回忆

        不知道大家是否还记得原版的一个场景——当你历经千辛万苦、突破重重阻碍来到塔顶,大魔法师奇诺对你说:

"You villain. Little did I expect to be beaten. But I would never die in such a way. I'll be looking forward to fighting with you again!"

“你这个恶棍!我从未想过会被击败。但我不会就此死去。我很期待再和你打上一场!”

        魔王依旧不会死,勇者依旧会回到里魔塔的第一层。魔王继续变强。整个魔塔没有尽头,无论你打通多少周目,那个不可能击倒的魔王还是在塔顶等着你。

数值溢出窗口的究极魔王

        或许,当玩家放弃继续玩下去的那一刻,就是勇者终于向魔王屈服的那一刻。


“作者”说

         据“作者本人”说,这个版本不过是他自己收到原作启发后,随手做出来的一个全新游戏。

        “当年我买的游戏光盘里面有一个英文原版魔塔,我当时特别喜欢,断断续续玩了好久。后来我大学的时候就尝试着自己做一部魔塔。实际上并没有什么工作室,胖老鼠工作室就是我随手的署名。当时魔塔也没有做完,只不过实在后来没时间继续做下去了,所以就草草结尾了。”

        虽然验证不了真身,但我们基本可以确定的是——这款魔塔真的永远也不会有续作了。


是的,时间已经过去

新魔塔的启动界面,浓浓的21世纪初风格

按这一款魔塔的作者所言,加入的随即元素和更多新道具可以使游戏更多元化,更有趣,也使得通关路线不只一条,可以促进玩家相互之间的交流。在新新魔塔中,中毒,连击,特殊攻击等其它RPG中常见的要素悉数登场,也使得新新魔塔成为了创新魔塔,甚至是整个魔塔系列的领头人之一。由于不确定性的加入,通关率当然也十分的可观——根据某台湾网站统计,本作的通关率高达30.12%……

        再多的新版本,再多的新玩法,看起来越来越绚烂......可是当我们玩起来的时候,却越来越觉得少了些什么。

        是的,少了一种“感觉”。

        回过头来看,经典的老魔塔永远都在那里——像一张橱柜上摆放着的老照片,微微泛黄;但是当你拿起来看的时候,那一刻涌上心头的,不只是照片里的内容,还有照片以外那一段属于我们的美好回忆。

        感谢曾经属于我们的美好回忆!


http://www.ppmy.cn/news/617.html

相关文章

星起航跨境:跨境卖家可以这样获得好评,稳步提升销量

据调查数据显示&#xff0c;90%以上的消费者购物之前会先查看产品评论&#xff0c;好的评价能促进产品更快地转化&#xff0c;不好的评价还会对产品listing权重产生一定的影响。例如&#xff1a;在产品listing的评价较少的情况下&#xff0c;一个1星差评在listing展示超过3天之…

Go-Windows环境的快速搭建

下载 Downloads - The Go Programming Language 或者直接到指定版本下载可以根据个人喜好&#xff0c;下载zip或者执行版 下载后文件夹 查看版本 必须查看版本&#xff0c;通过go version命令进行查看最新版本1.19.3版本 配置的GoPath 已经自动配置进去 需要重新进入一个新的…

pcl中MomentOfInertiaEstimation解析与实例

pcl中features模块又基于惯性矩和偏心率的描述子&#xff0c;也可以求取点云的AABB和OBB包围盒&#xff0c;在计算的过程中法线一些问题&#xff0c;特此记录。 针对惯性矩和偏心率这两个数据的应用场景还不明确&#xff0c;因此暂时不做讨论&#xff0c;主要讨论求取OBB时的代…

C语言详细知识点(下)

⛄️上一篇⛄️C语言详细知识点&#xff08;上&#xff09; 文章目录五、数组1、一维数组的定义及使用2、二维数组的定义及使用3、字符数组的定义及使用六、函数1、函数的定义2、函数的调用3、函数的声明4、函数的嵌套调用5、函数的递归调用七、指针1、什么是指针2、指针变量3、…

借助cubeMX实现STM32MP157A(-M4核)UART、按键中断、环境检测开关实验

main.c 可以添加一句打印提示 int main(void) {/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init(…

在 Python 中构建一体化音频分析工具包,在一个地方分析您的音频文件

语言构成了人类之间每次对话的基础。因此,自然语言处理(或简称 NLP)领域无疑在帮助人类日常生活方面具有巨大潜力。 简而言之,NLP 领域包含一组旨在理解人类语言数据并完成下游任务的技术。 NLP 技术涵盖许多领域,例如问答 (QA)、命名实体识别 (NER)、文本摘要、自然语言…

网站变灰代码如何让网页变灰

1.网站变灰代码应用场景 一般在清明节&#xff0c;全国哀悼日&#xff0c;大地震的日子&#xff0c;以及一些影响力很大的伟人逝世或纪念日的时候&#xff0c;身为站长的我们都会让自己的网站的全部网页变成灰色&#xff08;黑白色&#xff09;&#xff0c;以表示我们对逝者的…

【Confluence】使用start-confluence.sh命令重启后提示找不到网页HTTP404

问题&#xff1a; 1、使用start-confluence.sh命令启动Confluence&#xff0c;提示成功 2、浏览器访问Confluence出现“找不到网页” HTTP 404错误 解决方案&#xff1a; 1、ps -ef|grep java 查看进程 2、发现有以下类似信息&#xff0c;说明Tomcat没有关闭 Djava.util.logg…