猫史档案馆


【Python作品分享】双人大战【作品秀】

用户:TODOsomethingTODOsomething查看:0 回复:3 评论:0 创建时间:2020-08-30T18:22:43


【作品展示】

center_image

 

【作品介绍】

j键——普通攻击

k键——防御

h键——大招

上下键——上下移动

 

【作品源代码】

import os
import random
import pygame
from pygame.locals import *
from sys import exit


# 初始化
pygame.init()
pygame.font.init()


def game_over():
    pygame.quit()
    exit()


class bader(pygame.sprite.Sprite):
    """docstring for player"""
    def __init__(self,image,x=0,y=0):
        pygame.sprite.Sprite.__init__(self)
        self.image = image
        self.rect = self.image.get_rect(x=x,y=y)

    def gox(self,speed):
        self.rect.x += speed

    def goy(self,speed):
        self.rect.y += speed


class dazhaoer(pygame.sprite.Sprite):
    """docstring for pugong"""
    def __init__(self,image,fangxiang,speed=1,x=0,y=0):
        pygame.sprite.Sprite.__init__(self)
        self.image = image
        self.rect = self.image.get_rect(x=x,y=y)
        self.fangxiang = fangxiang
        self.speed = speed

class fangyuer(pygame.sprite.Sprite):
    """docstring for player"""
    def __init__(self,image,x=0,y=0):
        pygame.sprite.Sprite.__init__(self)
        self.image = image
        self.rect = self.image.get_rect(x=x,y=y)

class player(pygame.sprite.Sprite):
    """docstring for player"""
    def __init__(self,image,speed,x=0,y=0):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load(image)
        self.rect = self.image.get_rect(x=x,y=y)
        self.speed = speed
        self.speedy = 0


class pugong(pygame.sprite.Sprite):
    """docstring for pugong"""
    def __init__(self,image,fangxiang,speed=1,x=0,y=0):
        pygame.sprite.Sprite.__init__(self)
        self.image = image
        self.rect = self.image.get_rect(x=x,y=y)
        self.fangxiang = fangxiang
        self.speed = speed

    def update(self):
        if self.fangxiang == "left":
            self.rect.x -= self.speed

        if self.fangxiang == "right":
            self.rect.x += self.speed


def main():
    # 创窗口
    surface = pygame.display.set_mode((960, 720))
    pygame.display.set_caption("双人大战")

    path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "images")
    
    # 读角色
    # 敌人角色列表
    allbad = []
    for i in range(1, 7):
        allbad.append(pygame.image.load(path + "\\敌人" + str(i) + ".png"))
    # 攻击
    pugongimg = pygame.image.load(path + "\\pugong.png")

    # 胜利失败图片
    over = pygame.image.load(path + "\\gameover.png")
    win = pygame.image.load(path + "\\win.png")

    #玩家技能图片提示
    fangyutip = pygame.image.load(path + "\\tip1.png")
    dazhaotip = pygame.image.load(path + "\\tip2.png")

    # 变量(常量)
    WHITE = (255, 255, 255)
    BLACK = (0, 0, 0)

    # 变量
    playhealth = 100
    badimage = allbad[random.randint(0, (len(allbad) - 1))]#随机抽取敌人角色
    bad = bader(badimage, x=680, y=400)
    badhealth = 100
    badgoy = 20
    # 攻击_组
    gongji = pygame.sprite.Group()
    badgongji = pygame.sprite.Group()

    # time
    badtime = 30  # 敌人的攻击
    badtimemove = 15
    playfangyutime = 0
    playfangyucold = 30 * 7
    playdazhaotime = 0
    playdazhaocold = 30 * 7

    badfangyutime = 0
    badfangyucold = 30
    playdazhaotime = 0
    baddazhaocold = 30 * 3

    # 玩家
    play = player(image=path + "\\player.png", speed=40, x=50, y=400)

    # 道具,技能
    fangyuimg = pygame.image.load(path + "\\fangyu.png")
    playfangyu = fangyuer(image=fangyuimg, x=play.rect.x, y=play.rect.y)
    badfangyu = fangyuer(image=fangyuimg, x=bad.rect.x, y=bad.rect.y)

    # 大招
    dazhaoimg = pygame.image.load(path + "\\大招.png")
    playdazhao = dazhaoer(
        image=dazhaoimg, fangxiang="right", speed=50, x=100, y=play.rect.y
    )
    baddazhao = dazhaoer(image=dazhaoimg, fangxiang="left", speed=50, x=0, y=bad.rect.y)

    # 是否开启护盾(状态)
    playfangyushow = False
    badfangyushow = False

    # 是否放大招
    playdazhaoshow = False
    baddazhaoshow = False

    # 创建对象
    fps = 30
    clock = pygame.time.Clock()
    font = pygame.font.SysFont("Arial ", 44)

    del fangyuimg,allbad,dazhaoimg

    while True:
        surface.fill(BLACK)

        for event in pygame.event.get():
            if event.type == QUIT:
                game_over()

            keys = pygame.key.get_pressed()
            if event.type == KEYDOWN:
                # 技能
                if event.key == K_j:
                    gongji.add(
                        pugong(
                            image=pugongimg,
                            fangxiang="right",
                            speed=25,
                            x=play.rect.x,
                            y=play.rect.y + 100,
                        )
                    )

                if event.key == K_k:
                    if playfangyucold == 0:
                        playfangyushow = True
                        playfangyutime = fps * 6
                        playfangyucold = fps * 7

                if event.key == K_h:
                    if playdazhaocold == 0:
                        playdazhaoshow = True
                        playdazhaotime = fps
                        playdazhaocold = fps * 9

                # 移动
            if keys[pygame.K_UP]:
                play.speedy = play.speed * -1

            elif keys[pygame.K_DOWN]:
                play.speedy = play.speed

            else:
                play.speedx, play.speedy = 0, 0

        # AI
        badtime -= 1
        if badtime == 0:
            badgongji.add(
                pugong(
                    image=pugongimg,
                    fangxiang="left",
                    speed=25,
                    x=bad.rect.x,
                    y=bad.rect.y + 70,
                )
            )
            badtime = random.randint(10, 20)

        badtimemove -= 1
        if badtimemove == 0:
            if badgoy < 0:
                bad.goy(len(range(0, badgoy, -1)) * 1)

            if badgoy > 0:
                bad.goy(len(range(0, badgoy, 1)) * -1)

            if bad.rect.y < 0 or bad.rect.y > 720:  # 判断是否到移动的时间and有没有越界
                bad.rect.y = 300

            badgoy = random.randint(-200, 200)
            badtimemove = 4

        # AI

        # 玩家防御冷却时间
        if playfangyucold > 0 and playfangyushow == False:
            playfangyucold -= 1

        if playdazhaocold > 0 and playdazhaoshow == False:
            playdazhaocold -= 1

        # 更新
        play.rect.x += play.speedx
        play.rect.y += play.speedy
        baddazhao.rect.y = bad.rect.y
        playdazhao.rect.y = play.rect.y

        playfangyu.rect.x, playfangyu.rect.y = play.rect.x, play.rect.y
        badfangyu.rect.x, badfangyu.rect.y = bad.rect.x, bad.rect.y

        badhealthfont = font.render(str(int(badhealth)), 1, WHITE)
        playhealthfont = font.render(str(int(playhealth)), 1, WHITE)
        surface.blit(play.image, (play.rect.x, play.rect.y))
        surface.blit(bad.image, (bad.rect.x, bad.rect.y))

        # 字体
        surface.blit(playhealthfont, (play.rect.x - 10, play.rect.y))
        surface.blit(badhealthfont, (bad.rect.x - 30, bad.rect.y))

        # 精灵组绘制
        gongji.update()
        badgongji.update()
        gongji.draw(surface)
        badgongji.draw(surface)

        #绘制提示
        if playfangyucold == 0:
            surface.blit(fangyutip, (50, 660))

        if playdazhaocold == 0:
            surface.blit(dazhaotip, (150, 660))

        # 判断玩家有没有越界
        if play.rect.y < 0 or play.rect.y > 600:  # 判断是否到移动的时间and有没有越界
            play.rect.y = 400

        # 判断是否召唤护盾
        if playfangyushow == True:
            surface.blit(
                playfangyu.image, (playfangyu.rect.x - 70, playfangyu.rect.y - 60)
            )
            playfangyutime -= 1
            if playfangyutime == 0:
                playfangyushow = False

        # 判断是否开大招
        if playdazhaoshow == True:
            surface.blit(playdazhao.image, (playdazhao.rect.x, playdazhao.rect.y))
            playdazhaotime -= 1
            if playdazhaotime == 0:
                playdazhaoshow = False

        # 攻击
        # 判断大招是否打中敌人
        if playdazhaoshow == True:
            if (
                playdazhao.rect.colliderect(bad.rect) and badfangyushow == False
            ):  # 判断护盾是否开启
                badhealth -= 1

        if baddazhaoshow == True:
            if (
                baddazhao.rect.colliderect(play.rect) and playfangyushow == False
            ):  # 判断护盾是否开启
                playhealth -= 1

        # 判断攻击是否打中敌人
        if badfangyushow == True and pygame.sprite.spritecollide(
            badfangyu, gongji, True
        ):  # 判断护盾是否开启
            pass

        elif len(list(gongji)) != 0:
            if list(gongji)[0] in pygame.sprite.spritecollide(bad, gongji, True):
                badhealth -= 5

        # 判断攻击是否打中自己
        if playfangyushow == True and pygame.sprite.spritecollide(
            playfangyu, badgongji, True
        ):  # 判断护盾是否开启
            pass

        elif len(list(badgongji)) != 0:
            if list(badgongji)[0] in pygame.sprite.spritecollide(play, badgongji, True):
                playhealth -= 5

        # 敌方护盾
        if badfangyushow == True:
            surface.blit(
                badfangyu.image, (badfangyu.rect.x - 100, badfangyu.rect.y - 60)
            )
            badfangyutime -= 1
            if badfangyutime == 0:
                badfangyushow = False
                badfangyucold = fps * 7

        else:
            badfangyucold -= 1
            if badfangyucold == 0:
                badfangyushow = True
                badfangyutime = fps * 6

        # 攻击

        # 敌方大招
        if baddazhaoshow == True:
            surface.blit(baddazhao.image, (baddazhao.rect.x, baddazhao.rect.y))

            baddazhaotime -= 1
            if baddazhaotime == 0:
                baddazhaoshow = False
                baddazhaocold = fps * 10

        else:
            baddazhaocold -= 1
            if baddazhaocold == 0:
                baddazhaoshow = True
                baddazhaotime = fps

        # 判断攻击是否超出墙壁
        for i in gongji:
            if i.rect.x <= 0 or i.rect.x >= 960:
                gongji.remove(i)

        for i in badgongji:
            if i.rect.x <= 0 or i.rect.x >= 960:
                badgongji.remove(i)

        # 判断游戏是否结束
        if badhealth <= 0:
            surface.blit(win, (0, 0))
            pygame.display.update()
            pygame.time.wait(1000)
            game_over()

        # 判断游戏是否结束
        if playhealth <= 0:
            surface.blit(over, (0, 0))
            pygame.display.update()
            pygame.time.wait(1000)
            game_over()

        pygame.display.update()
        clock.tick(fps)


if __name__ == "__main__":
    main()

 

【提示】

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

https://python.codemao.cn


回复

上一页1 页 / 共 1下一页
TODOsomethingTODOsomething

center_image

center_imagecenter_imagecenter_imagecenter_imagecenter_imagecenter_imagecenter_imagecenter_imagecenter_imagecenter_imagecenter_imagecenter_imagecenter_image

点赞0


评论


TODOsomethingTODOsomething

这是图片素材,名字自己加

点赞0


评论


挖坟专家挖坟专家

只要将图片脱出来,链接上就会有名字,不用谢我

点赞0


评论