用户:TODOsomething查看:0 回复:3 评论:0 创建时间:2020-08-30T18:22:43
【作品展示】

【作品介绍】
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