python制作小游戏
代码如下:
点击查看代码
import pygame
from pygame.sprite import Sprite,Group
from sys import exit
from random import randint,choice
import time
#基础量
pygame.init()
screen=pygame.display.set_mode((900,900))
pygame.display.set_caption('芙兰的睡前故事')
clock=pygame.time.Clock()
all_font=pygame.font.Font(None,60)
opening_sta=1
story_open=0
story_end=0
choose_sta=0
fight_sta=0
choice1=0
choice2=0
con_id=[0,1]
name_con=['Leimi','Fulan']
hp_con=[600,500]
atk_con=[90,130]
dfc_con=[90,60]
pp_con=[390,480]
bgm=pygame.mixer.Sound("Foxtail-Grass Studio - The des Alizes.mp3")
bgm.set_volume(0.3)
bgm.play()
waaa=pygame.mixer.Sound("waaaaaa2.mp3")
pp_not=pygame.mixer.Sound("ppnot.mp3")
#音频
Words=["bakabaka.mp3",
"quspa1.mp3",
"quspa2.mp3",
"yiquan.mp3",
"gyquan1.mp3",
"gyquan2.mp3",
"lihai1.mp3",
"xiaoquanquan.mp3"]
Talk=["talk1.mp3",
"talk2.mp3",
"talk3.mp3",
"talk4.mp3",
"talk5.mp3",
"talk6ed.mp3"]
Talk_index=0
a=1
turn="Player"
fulan_color=(204,153,0)
#角色图片夹
Role_images=["leimifumo.png",
"fulanfumo.png"]
Role_fight=["leimiff.png",
"fulanff.png"]
#角色类
class Role(Sprite):
def __init__(self, x , y , i ):
super().__init__()
self.image=pygame.image.load(Role_images[i-1])
self.rect=self.image.get_rect(center=(x,y))
#开关类
class Button(Sprite):
def __init__(self, x, y, width, height, color,call=None):
super().__init__()
self.image = pygame.Surface((width, height))
self.color=color
self.image.fill(color)
self.rect = self.image.get_rect(topleft=(x, y))
self.hovered = False
self.call=call
def destroy(self):
if fight_sta==1:
self.kill()
#角色选择回调定义
def leimi_choice():
if choose_sta==1:
screen.blit(Role1.image,(100,100))
def fulan_choice():
if choose_sta==1:
screen.blit(fulan_surface_ex,(100,100))
def fight_begin():
if choice1==1 or choice2==1:
screen.blit(fight_surface,(0,0))
#状态类
class Conclution(Sprite):
def __init__(self,name,hp,atk,dfc,id,
step,pp):
super().__init__()
self.real_id=id
self.fi_image=pygame.image.load(Role_fight[id])
self.name_p=name
self.hp_p=hp
self.atk_p=atk
self.dfc_p=dfc
self.step_p=step
self.pp_p=pp
def take_damage(self,damage):
self.hp_p -= damage
if self.hp_p<0:
self.hp_p=0
def take_recover(self,recover):
if self.hp_p>0:
self.hp_p+=recover
def take_cost(self,cost):
self.pp_p-=cost
if self.pp_p<0:
self.pp_p=0
def turn_finishi(self):
pp_f=50
hp_f=40
self.pp_p+=pp_f
self.hp_p+=hp_f
class Skill(Sprite):
def __init__(self,damage,recover,cost,width,height,color,
x , y ):
super().__init__()
self.image=pygame.Surface((width,height))
self.color=color
self.image.fill(color)
self.rect=self.image.get_rect(center=(x,y))
self.hovered = False
self.damcont=damage
self.revcont=recover
self.cost=cost
def update(self,mouse_rect):
if self.rect.colliderect(mouse_rect):
if not self.hovered:
self.hovered = True
self.image.fill(self.color) # 高亮颜色
else:
if self.hovered:
self.hovered = False
self.image.fill(self.color) # 恢复原色
#状态组
#组
Role1 =Role(200,100,1)
Role2 =Role(200,100,2)
Roles = Group(Role1,Role2)
button1 = Button(200, 650, 80, 80, (0, 0, 255),call=leimi_choice)
button2 = Button(600,650,80,80,(255,0,0),call=fulan_choice)
button_fight=Button(830,800,60,60,(50,50,50),call=fight_begin)
buttons = Group(button1,button2,button_fight)
skill_1=Skill(30,0,0,250,100,(255,0,0),460,700)
skill_2=Skill(10,40,30,250,100,(0,255,0),730,700)
skill_3=Skill(70,10,80,250,100,(0,0,255),460,820)
skill_4=Skill(120,30,170,220,100,(50,50,50),730,820)
skills= Group(skill_1,skill_2,skill_3,skill_4)
#图层surface and TEXT
start_surface=pygame.image.load("startbg.jpg").convert()
start_surface_ex=pygame.transform.rotozoom(start_surface,0,1.675)
fulan_surface=pygame.image.load("fulanfumo.png")
fulan_surface_ex=pygame.transform.rotozoom(fulan_surface,0,0.75)
text_sta_surface=all_font.render('Press SPACE to start',True,'white')
text_choose_surface=all_font.render('Choose a Role to fight',True,'Blue')
choose_surface=pygame.image.load("shenshe.jpg")
choose_surface_ex=pygame.transform.rotozoom(choose_surface,0,2.5)
text_choice1_surface=all_font.render('You choosed the Remilia',True,'blue')
text_choice2_surface=all_font.render('You choosed the Flandre',True,fulan_color)
text_tip_fu=all_font.render("Fulan",True,fulan_color)
text_tip_lei=all_font.render("Remilia",True,(255,0,0))
text_tip_sure=all_font.render("Sure",True,'black')
story_open_bg=pygame.image.load("storybg.jpg")
story_open_bgex=pygame.transform.rotozoom(story_open_bg,0,2.5)
text_tip_skill1=all_font.render("Atk:{}" \
"PP:{}".format(skill_1.damcont,skill_1.cost),True,(173,216,230))
text_tip_skill2=all_font.render("Atk:{}" \
"PP:{}".format(skill_2.damcont,skill_2.cost),True,'black')
text_tip_skill3=all_font.render("Atk:{}" \
"PP:{}".format(skill_3.damcont,skill_3.cost),True,fulan_color)
text_tip_skill4=all_font.render("Atk:{}"
"PP:{}".format(skill_4.damcont,skill_4.cost),True,'pink')
fight_surface=pygame.image.load("hongmoguan.png").convert()
fight_surface_ex=pygame.transform.rotozoom(fight_surface,0,2)
story_surface1=pygame.image.load("kaitou.jpg").convert()
story_surface2=pygame.image.load("shuiqian.jpg").convert()
story_surface1_ex=pygame.transform.rotozoom(story_surface1,0,0.35)
story_surface2_ex=pygame.transform.rotozoom(story_surface2,0,0.35)
story_surface3=pygame.image.load("story3.jpg").convert()
story_surface4=pygame.image.load("story4.jpg").convert()
story_surface3_ex=pygame.transform.rotozoom(story_surface3,0,0.28)
story_surface4_ex=pygame.transform.rotozoom(story_surface4,0,0.28)
story_surf_end=pygame.image.load("ending.jpg").convert()
story_surf_endex=pygame.transform.rotozoom(story_surf_end,0,0.5)
text_story_skip=all_font.render("Esc to skip",True,'white')
text_story_next=all_font.render("Click next talk",True,'white')
text_story_end=all_font.render("The end",True,'white')
#游戏主体循环
while True:
for event in pygame.event.get():
if event.type==pygame.QUIT:
pygame.quit()
exit()
word2=randint(0,7)
Words_index=randint(0,7)
word_f=pygame.mixer.Sound(Words[Words_index])
word_f2=pygame.mixer.Sound(Words[word2])
if opening_sta:
screen.blit(start_surface_ex,(-100,0))
screen.blit(text_sta_surface,(200,800))
if event.type==pygame.KEYDOWN:
if event.key==pygame.K_SPACE:
opening_sta=0
story_open=1
if story_open:
screen.blit(story_open_bgex,(0,0))
screen.blit(story_surface1_ex,(0,0))
screen.blit(story_surface2_ex,(0,360))
screen.blit(story_surface3_ex,(350,0))
screen.blit(story_surface4_ex,(350,450))
screen.blit(text_story_skip,(620,0))
screen.blit(text_story_next,(600,400))
if event.type==pygame.MOUSEBUTTONDOWN:
talk_st=pygame.mixer.Sound(Talk[Talk_index])
talk_st.play()
Talk_index+=1
if Talk_index>=6:
time.sleep(3)
story_open=0
choose_sta=1
elif event.type==pygame.KEYDOWN:
if event.key==pygame.K_ESCAPE:
story_open=0
choose_sta=1
if choose_sta:
screen.fill('white')
screen.blit(choose_surface_ex,(0,0))
screen.blit(text_choose_surface,(200,600))
if event.type==pygame.MOUSEBUTTONDOWN:
mouse_pos=pygame.mouse.get_pos()
mouse_rect=pygame.Rect(mouse_pos,(1,1))
for sprite in buttons:
if sprite.rect.collidepoint(mouse_pos):
if sprite.color==(255,0,0):
choice1=1
choice2=0
sound_choice_lei=pygame.mixer.Sound("leimi.mp3")
sound_choice_lei.play()
if sprite.color==(0,0,255):
choice2=1
choice1=0
sound_choice_fulan=pygame.mixer.Sound("fulan2.mp3")
sound_choice_fulan.play()
if sprite.color==(50,50,50):
fight_sta=1
for sprite in buttons:
sprite.update(mouse_rect)
if choice1==1 and choice2==0:
screen.fill('white')
screen.blit(text_choice1_surface,(140,40))
Player_id=0
Enemy_id=1
Con_player=Conclution(name_con[Player_id],hp_con[Player_id],
atk_con[Player_id],dfc_con[Player_id],Player_id,1,pp_con[Player_id])
Con_Enemy=Conclution(name_con[Enemy_id],hp_con[Enemy_id],
atk_con[Enemy_id],dfc_con[Enemy_id],Enemy_id,1,pp_con[Enemy_id])
Conclutions=Group(Con_player,Con_Enemy)
leimi_choice()
if choice2==1 and choice1==0:
screen.fill('white')
screen.blit(text_choice2_surface,(140,40))
Player_id=1
Enemy_id=0
Con_player=Conclution(name_con[Player_id],hp_con[Player_id],
atk_con[Player_id],dfc_con[Player_id],Player_id,1,pp_con[Player_id])
Con_Enemy=Conclution(name_con[Enemy_id],hp_con[Enemy_id],
atk_con[Enemy_id],dfc_con[Enemy_id],Enemy_id,1,pp_con[Enemy_id])
Conclutions=Group(Con_player,Con_Enemy)
fulan_choice()
screen.blit(text_tip_fu,(200,730))
screen.blit(text_tip_lei,(600,730))
screen.blit(text_tip_sure,(800,740))
buttons.draw(screen)
if fight_sta:
button1.destroy()
button2.destroy()
button_fight.destroy()
choose_sta=0
text_turn=all_font.render("Turn {}".format(a),True,'white')
text_player_hp=all_font.render("HP:{}".format(Con_player.hp_p),True,'Red')
text_enemy_hp=all_font.render("HP:{}".format(Con_Enemy.hp_p),True,'green')
text_player_atk=all_font.render("ATK:{}".format(Con_player.atk_p),False,'blue')
text_enemy_atk=all_font.render("ATK:{}".format(Con_Enemy.atk_p),False,'blue')
text_playr_dfc=all_font.render("DEF:{}".format(Con_player.dfc_p),True,'black')
text_enemy_dfc=all_font.render("DEF:{}".format(Con_Enemy.dfc_p),True,'black')
text_player_pp=all_font.render("PP:{}".format(Con_player.pp_p),True,'blue')
text_enemy_pp=all_font.render("PP:{}".format(Con_Enemy.pp_p),True,'blue')
screen.fill('white')
screen.blit(fight_surface_ex,(0,0))
screen.blit(text_player_atk,(10,825))
screen.blit(text_enemy_atk,(720,250))
screen.blit(text_playr_dfc,(10,865))
screen.blit(text_enemy_dfc,(720,290))
screen.blit(Con_player.fi_image,(0,575))
screen.blit(Con_Enemy.fi_image,(700,0))
skills.draw(screen)
screen.blit(text_tip_skill1,(340,700))
screen.blit(text_tip_skill2,(605,700))
screen.blit(text_tip_skill3,(340,820))
screen.blit(text_tip_skill4,(605,820))
if Con_Enemy.hp_p==0:
waaa.play()
win_so=pygame.mixer.Sound("winle.mp3")
time.sleep(1.2)
win_so.play()
time.sleep(0.8)
fight_sta=0
story_end=1
print("You win!!")
elif Con_player.hp_p==0:
waaa.play()
lose_so=pygame.mixer.Sound("losele.mp3")
time.sleep(1.2)
lose_so.play()
time.sleep(0.8)
fight_sta=0
story_end=1
print("You Lose!!")
if event.type==pygame.MOUSEBUTTONDOWN:
mouse_pos=pygame.mouse.get_pos()
mouse_rect=pygame.Rect(mouse_pos,(1,1))
if turn=="Player":
for sprite in skills:
if sprite.rect.collidepoint(mouse_pos):
if sprite.color==(255,0,0):
if Con_player.pp_p>=skill_1.cost:
Con_player.take_cost(skill_1.cost)
Con_Enemy.take_damage(Con_player.atk_p+skill_1.damcont-Con_Enemy.dfc_p)
print("你使用了技能1")
word_f.play()
time.sleep(0.8)
if Con_Enemy.hp_p>0:
turn="Enemy"
else:
pp_not.play()
print("pp不足")
turn="Player"
if sprite.color==(0,255,0):
if Con_player.pp_p>=skill_2.cost:
Con_player.take_cost(skill_2.cost)
Con_Enemy.take_damage(Con_player.atk_p+skill_2.damcont-Con_Enemy.dfc_p)
Con_player.take_recover(skill_2.revcont)
print("你使用了技能2")
word_f.play()
time.sleep(0.8)
if Con_Enemy.hp_p>0:
turn="Enemy"
else:
pp_not.play()
print("pp不足")
turn="Player"
if sprite.color==(0,0,255):
if Con_player.pp_p>=skill_3.cost:
Con_player.take_cost(skill_3.cost)
Con_Enemy.take_damage(Con_player.atk_p+skill_3.damcont-Con_Enemy.dfc_p)
Con_player.take_recover(skill_3.revcont)
print("你使用了技能3")
word_f.play()
time.sleep(0.8)
if Con_Enemy.hp_p>0:
turn="Enemy"
else:
pp_not.play()
print("pp不足")
turn="Player"
if sprite.color==(50,50,50):
if Con_player.pp_p>=skill_4.cost:
Con_player.take_cost(skill_4.cost)
Con_Enemy.take_damage(Con_player.atk_p+skill_4.damcont-Con_Enemy.dfc_p)
Con_player.take_recover(skill_4.revcont)
print("你使用了技能4")
word_f.play()
time.sleep(0.8)
if Con_Enemy.hp_p>0:
turn="Enemy"
else:
pp_not.play()
print("pp不足")
turn="Player"
if turn=="Enemy":
Enemy_use=randint(1,4)
if Enemy_use==1:
if Con_Enemy.pp_p>=skill_1.cost:
Con_Enemy.take_cost(skill_1.cost)
Con_player.take_damage(Con_Enemy.atk_p+skill_1.damcont-Con_player.dfc_p)
a+=1
print("对方使用了技能1")
word_f2.play()
time.sleep(0.8)
if Con_player.hp_p>0:
Con_player.turn_finishi()
Con_Enemy.turn_finishi()
turn="Player"
else:
print("对方使用了技能1")
word_f2.play()
Enemy_use=1
if Enemy_use==2:
if Con_Enemy.pp_p>=skill_2.cost:
Con_Enemy.take_cost(skill_2.cost)
Con_player.take_damage(Con_Enemy.atk_p+skill_2.damcont-Con_player.dfc_p)
Con_Enemy.take_recover(skill_2.revcont)
a+=1
print("对方使用了技能2")
word_f2.play()
time.sleep(0.8)
if Con_player.hp_p>0:
Con_player.turn_finishi()
Con_Enemy.turn_finishi()
turn="Player"
else:
Enemy_use=1
if Enemy_use==3:
if Con_Enemy.pp_p>=skill_3.cost:
a+=1
Con_Enemy.take_cost(skill_3.cost)
Con_player.take_damage(Con_Enemy.atk_p+skill_3.damcont-Con_player.dfc_p)
Con_Enemy.take_recover(skill_3.revcont)
print("对方使用了技能3")
word_f2.play()
time.sleep(0.8)
if Con_player.hp_p>0:
Con_player.turn_finishi()
Con_Enemy.turn_finishi()
turn="Player"
else:
Enemy_use=1
if Enemy_use==4:
if Con_Enemy.pp_p>=skill_4.cost:
a+=1
Con_Enemy.take_cost(skill_4.cost)
Con_player.take_damage(Con_Enemy.atk_p+skill_4.damcont-Con_player.dfc_p)
Con_Enemy.take_recover(skill_4.revcont)
print("对方使用了技能4")
word_f2.play()
time.sleep(0.8)
if Con_player.hp_p>0:
Con_player.turn_finishi()
Con_Enemy.turn_finishi()
turn="Player"
else:
Enemy_use=1
screen.blit(text_turn,(450,450))
screen.blit(text_player_hp,(15,785))
screen.blit(text_enemy_hp,(720,210))
screen.blit(text_player_pp,(180,865))
screen.blit(text_enemy_pp,(725,330))
if story_end:
screen.blit(story_open_bgex,(0,0))
screen.blit(story_surf_endex,(50,100))
screen.blit(text_story_end,(600,200))
screen.blit(text_story_next,(600,600))
if event.type==pygame.MOUSEBUTTONDOWN:
talk_end=pygame.mixer.Sound("endtalk.mp3")
talk_end.play()
pygame.display.update()
clock.tick(60)

浙公网安备 33010602011771号