猫史档案馆


【Python作品分享】游戏【作品秀】

用户:优雅的星能猫SNHj优雅的星能猫SNHj查看:0 回复:0 评论:0 创建时间:2020-09-06T22:27:32


【作品展示】

center_image

 

【作品介绍】

名为:佐助的试炼

按上下左右来进行移动

闪开佐助的攻击

难度会使时间而增加

撑过80秒且血量不为0,胜。

反之,败。

加油吧!

 

【作品源代码】

from arcade import *
from PIL import Image
import random
import time

SCREEN_WIDTH = 1000
SCREEN_HEIGHT = 800
SCREEN_TITLE = '躲开电球'
GRAPH_WIDTH = 500
GRAPH_HEIGHT = 400
SPEED = 4
LEFT = 0
RIGHT = 1
GAME_NANDU = 0
#定义人物
class Personage(Sprite):
    def __init__(self,image):
        super().__init__(image)
        self.center_x = SCREEN_WIDTH // 2
        self.center_y = GRAPH_HEIGHT + 335//2 +3
#定义雷电球
class Lightning(Sprite):
    def __init__(self,image):
        super().__init__(image)
        #雷电球在上,左,右方向随机形成
        #在左右个方向形成的概率相同(建议用choices)
        self.fangxiang = random.choice(['left','right'])
        if self.fangxiang == 'right':
            self.center_x = random.randint(190, 230)
            self.center_y = random.randint(0, GRAPH_HEIGHT)
            self.change_x = SPEED
        elif self.fangxiang == 'left':
            self.center_x = random.randint(760, 800)
            self.center_y = random.randint(0, GRAPH_HEIGHT)
            self.change_x = -SPEED

#定义角色
class Blood(Sprite):
    def __init__(self,image):
        super().__init__(image)
        self.center_x = SCREEN_WIDTH//2
        self.center_y = 200
    def update(self):
        super().update()
        if self.top >GRAPH_HEIGHT:
            self.top = GRAPH_HEIGHT
        if self.bottom < 0:
            self.bottom = 0
        if self.left < SCREEN_WIDTH//2 - GRAPH_WIDTH // 2 :
            self.left = SCREEN_WIDTH//2 - GRAPH_WIDTH // 2 
        if self.right > SCREEN_WIDTH // 2 + GRAPH_WIDTH // 2:
            self.right =  SCREEN_WIDTH // 2 + GRAPH_WIDTH // 2

class GameOver(Sprite):
    def __init__(self,image):
        super().__init__(image)
        self.center_x = SCREEN_WIDTH // 2
        self.center_y = SCREEN_HEIGHT // 2

class GameWin(Sprite):
    def __init__(self, image):
        super().__init__(image)
        self.center_x = SCREEN_WIDTH // 2
        self.center_y = SCREEN_HEIGHT // 2

class Fire(Sprite):
    def __init__(self,image):
        super().__init__(image)
        face = random.choice(['left', 'right'])
        Speed = [4, 5,6,7]
        speed = random.choice(Speed)
        #让敌人可以从左,右两面生成,并改变面向
        if face == 'left':
            self.center_x = SCREEN_WIDTH//2 - GRAPH_WIDTH // 2 - 40
            self.center_y = random.randint(0, GRAPH_HEIGHT)
            self.change_x = -speed
            
        elif face == 'right':
            self.center_x = SCREEN_WIDTH//2 + GRAPH_WIDTH // 2 + 40
            self.center_y = random.randint(0, GRAPH_HEIGHT)
            
            self.change_x = speed
            
class QiLin(Sprite):
    def __init__(self, image):
        super().__init__(image)
        face = random.choice(['left', 'right'])
        
        speed =7
        #让敌人可以从左,右两面生成,并改变面向
        if face == 'left':
            self.center_x = SCREEN_WIDTH + 60
            self.change_x = -speed
            self.append_texture(load_texture(image, mirrored=True, scale=1))
            self.set_texture(RIGHT)
            self.center_y = random.randint(0, GRAPH_HEIGHT)
            
        elif face == 'right':
            self.center_x = -60
            self.change_x = speed
            #把图片左右镜像颠倒
            
            self.center_y = random.randint(0, GRAPH_HEIGHT)
# class XueBao(Sprite):
#     def __init__(self,image):
#         super().__init__(image)
#         self.center_x = random.randint(250,750)
#         self.center_y = 500
#     def update(self):
#         self.change_y = -4

class MyGame(arcade.Window):
    def __init__(self,width,height,title):
        super().__init__(width,height,title)
        self.setup()
    def setup(self):
        Image.open('Images/电球.png').resize((SCREEN_WIDTH // 15,SCREEN_HEIGHT // 12)).save('Images/new_电球.png')
        Image.open('Images/game_failure.png').resize((700,400)).save('Images/new_game_failure.png')
        Image.open('Images/game_win.png').resize((700,400)).save('Images/new_game_win.png')
        Image.open('Images/火球.png').resize((80,80)).save('Images/new_火球.png')
        Image.open('Images/麒麟.png').resize((150, 120)).save('Images/new_麒麟.png')
        set_background_color(color.BLACK)
        self.sprite_list_qilin = SpriteList()
        self.sprite_blood = Blood('Images/血量.png')
        self.sprite_personage = Personage('Images/佐助.png')
        self.sprite_game_over = GameOver('Images/new_game_failure.png')
        self.sprite_game_win = GameWin('Images/new_game_win.png')
        #self.sprite_xuebao = XueBao('Images/血包.png')
        self.sprite_list_fire = SpriteList()
        self.sprite_list_lightning = SpriteList()
        self.total_time = 0
        self.last_time = 0
        self.lightning_number = 2
        self.fire_number = 1
        self.sprite_list_hp = SpriteList()
        self.hp = 100
        self.game_over = False
        self.dian = load_sound('Images/雷鸣.wav')
        play_sound(self.dian)
        self.time = 0
        
        
        
    def on_draw(self):
        start_render()
        self.draw_tuxin()
        self.sprite_list_fire.draw()
        draw_text('接招吧!雷遁.雷光球!', 100, 600, color.SKY_BLUE,
                  font_name=('simhei', 'PingFang'), font_size=20)
        if int(self.total_time) > 60:
            draw_text('洗内!雷遁.麒麟!', 100, 500, color.BLUE,
                    font_name=('simhei', 'PingFang'), font_size=20)
        self.sprite_personage.draw()
        self.sprite_blood.draw()
        self.sprite_list_lightning.draw()
        self.sprite_list_hp.draw()
        self.sprite_list_qilin.draw()
        # if int(self.total_time) == 10:
        #     self.sprite_xuebao.draw()
        self.HP()
        if self.hp <= 0:
            self.sprite_game_over.draw()
            
            self.game_over = True
            
            if int(self.total_time) % 2 == 0:
                draw_text('请按下TAB键重新开始', 300, 100, color.RED,
                          font_name=('simhei', 'PingFang'), font_size=30)
        if self.time >= 80:
            self.game_over = True
            self.sprite_game_win.draw()
            draw_text('请按下TAB键重新开始', 300, 100, color.RED,
                          font_name=('simhei', 'PingFang'), font_size=30)
        if int(self.total_time) > 20:
            draw_text('可以,再来---火遁.豪火球', 100, 550, color.RED,
                      font_name=('simhei', 'PingFang'), font_size=20)
        self.Time()
    def on_update(self, delta_time): 
        self.total_time += delta_time
        if self.game_over:
            return 
        if int(self.total_time) != int(self.last_time) and int(self.total_time) % 3 == 0:
            self.create_lightning()
            self.last_time = self.total_time
            if int(self.total_time) > 20:
                self.create_fire()
            if int(self.total_time) > 60:
                self.create_qilin()
            if int(self.total_time) == 60:
                self.lightning_number += 1
        self.time = int(self.total_time)
        if int(self.total_time) != int(self.last_time) and int(self.total_time) % 85 == 0 :
            play_sound(self.dian)
            self.last_time = self.total_time
        self.sprite_blood.update()
        self.sprite_list_lightning.update()
        self.sprite_list_fire.update()
        self.sprite_list_qilin.update()
        # self.sprite_xuebao.update()
        for enemy in self.sprite_list_lightning:
            if enemy.center_x < SCREEN_WIDTH//2 - GRAPH_WIDTH//2 - 60 or enemy.center_x > SCREEN_WIDTH//2 +GRAPH_WIDTH // 2 + 60:
                enemy.喵()
       
        for enemy in self.sprite_list_fire:
            if enemy.center_x < SCREEN_WIDTH//2 - GRAPH_WIDTH//2 - 60 or enemy.center_x > SCREEN_WIDTH//2 + GRAPH_WIDTH // 2 + 60:
                enemy.喵()
        hit_list1 = check_for_collision_with_list(
            self.sprite_blood, self.sprite_list_lightning)
        hit_list2 = check_for_collision_with_list(
            self.sprite_blood, self.sprite_list_fire)
        hit_list3 = check_for_collision_with_list(
            self.sprite_blood, self.sprite_list_qilin)
        if hit_list1:
            for hit in hit_list1:
                hit.喵()
                self.sprite_blood.喵()
                self.hp = self.hp - 25
        if hit_list2:
            for hit in hit_list2:
                hit.喵()
                self.sprite_blood.喵()
                self.hp = self.hp - 50
        if hit_list3:
            for hit in hit_list3:
                hit.喵()
                self.sprite_blood.喵()
                self.hp = self.hp - 100

    def on_key_press(self, symbol, modifiers):
        if symbol == key.UP:
            self.sprite_blood.change_y= SPEED
        elif symbol == key.DOWN:
            self.sprite_blood.change_y = -SPEED
        elif symbol == key.RIGHT:
            self.sprite_blood.change_x = SPEED
           
        elif symbol == key.LEFT:
            self.sprite_blood.change_x = -SPEED
            
        elif symbol == key.TAB:
            if self.game_over:
                self.setup()
        elif symbol == key.RETURN:
            image = get_image(0, 0, SCREEN_HEIGHT, SCREEN_WIDTH)
            image.save('截图.png')

    def on_key_release(self, symbol, modifiers):
        if symbol == key.UP or key.DOWN:
            self.sprite_blood.change_y = 0
        if symbol == key.LEFT or key.RIGHT:
            self.sprite_blood.change_x = 0
    def draw_tuxin(self):
        draw_rectangle_outline(SCREEN_WIDTH//2,200,GRAPH_WIDTH,GRAPH_HEIGHT,color.RED,5)
    def create_lightning(self):
        for i in range(self.lightning_number):      
            lightning_sprite = Lightning('Images/new_电球.png')
            self.sprite_list_lightning.append(lightning_sprite)
    def HP(self):
        draw_text(f'HP:{self.hp}', 150, 450, color.RED,
                  font_name=('simhei', 'PingFang'), font_size=25)
    def create_fire(self):
        for i in range(self.fire_number):
            fire_sprite = Lightning('Images/new_火球.png')
            self.sprite_list_fire.append(fire_sprite)
    def Time(self):
        draw_text(f'Time:{self.time}/80', 150,400, 
                  color.YELLOW, font_name=('simhei', 'PingFang'), font_size=25)
    def create_qilin(self):
        for i in range(1):
            qilin_sprite = QiLin('Images/new_麒麟.png')
            self.sprite_list_qilin.append(qilin_sprite)
if __name__ == '__main__':
    game = MyGame(SCREEN_WIDTH,SCREEN_HEIGHT,SCREEN_TITLE)
    run()

 

【提示】

部分含有Python第三方库相关内容的作品,在海龟编辑器网页端无法运行哦!如遇到这种情况,可以打开下面的链接,下载海龟编辑器客户端:

https://python.codemao.cn


回复

上一页1 页 / 共 0下一页