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)
图片和音频获取 [https://qfile.qq.com/q/AuJSnoWGiI]()
posted @ 2025-06-22 22:48  bolun123  阅读(29)  评论(0)    收藏  举报