python版本是3.9
安装了pygame
操作系统为Windows
代码如下
import pygame
import random
import sys
import time
pygame.init()
screen = pygame.display.set_mode((727, 414))
pygame.display.set_caption("斩将")
Black = (255,255,255)
bgImg = pygame.image.load("bg1.png")
loseImg = pygame.image.load("fail.png")
sucImg = pygame.image.load("success.png")
imgList = []
class Bullet():
def __init__(self,h):
self.images = {
"right":pygame.image.load("bullet.png"),
"down":pygame.image.load("bullet2.png"),
"left":pygame.image.load("bullet3.png"),
"up":pygame.image.load("bullet4.png"),
}
self.start_way = "left"
self.image = self.images[self.start_way]
self.speed = 70
self.rect = pygame.Rect(h.rect.x, h.rect.y, 17, 17)
self.way = h.way
self.rect.x = h.rect.x
self.rect.y = h.rect.y
def move(self):
if self.way == "up":
self.start_way = "up"
self.image = self.images[self.start_way]
self.rect.y = self.rect.y - self.speed
if self.way == "down":
self.start_way = "down"
self.image = self.images[self.start_way]
self.rect.y = self.rect.y + self.speed
if self.way == "left":
self.start_way = "left"
self.image = self.images[self.start_way]
self.rect.x = self.rect.x - self.speed
if self.way == "right":
self.start_way = "right"
self.image = self.images[self.start_way]
self.rect.x = self.rect.x + self.speed
def show(self, screen):
screen.blit(self.image, self.rect)
def hit(self, e):
if self.rect.colliderect(e.rect):
e.hp = e.hp - 50
class Hero():
def __init__(self):
self.hp = 100
self.images = {
"right":pygame.image.load("hero.png"),
"left":pygame.image.load("hero2.png"),
}
self.start_way = "left"
self.image = self.images[self.start_way]
self.rect = pygame.Rect(570,232,50, 50)
self.bulletList = []
def move(self, way, num):
self.way = way
if self.way == 'up':
self.rect.y = self.rect.y - num
elif self.way == 'down':
self.rect.y = self.rect.y + num
elif self.way == 'left':
self.start_way = "left"
self.image = self.images[self.start_way]
self.rect.x = self.rect.x - num
elif self.way == 'right':
self.start_way = "right"
self.image = self.images[self.start_way]
self.rect.x = self.rect.x + num
def show(self, screen):
screen.blit(self.image, self.rect)
def fire(self):
bullet1 = Bullet(self)
heroBulletList.append(bullet1)
def sf(self):
bullet2 = NewBullet(self)
heroBulletList2.append(bullet2)
class Enemy():
def __init__(self):
self.way = random.choice(["up", "down", "left", "right"])
self.image = pygame.image.load("enemy.jpg")
x = random.randint(0, 450)
y = random.randint(20, 100)
self.rect = pygame.Rect(x, y, 50, 50)
self.hp = 30
def move(self, num):
if self.way == 'up':
self.rect.y = self.rect.y - num
if self.rect.y < 0:
self.way = "down"
elif self.way == 'down':
self.rect.y = self.rect.y + num
if self.rect.y > 450:
self.way = "up"
elif self.way == 'left':
self.rect.x = self.rect.x - num
if self.rect.x < 0:
self.way = "right"
elif self.way == 'right':
self.rect.x = self.rect.x + num
if self.rect.x > 450:
self.way = "left"
def show(self, screen):
screen.blit(self.image, self.rect)
def hit(self, h):
if self.rect.colliderect(h.rect):
h.hp = h.hp - 50
class GunEnemy(Enemy):
def __init__(self):
super().__init__()
self.image = pygame.image.load("gun_enemy.png")
self.t = time.time()
def hit(self,h):
if self.rect.colliderect(h.rect):
h.hp = h.hp - 0
def fire(self):
bullet = Bullet(self)
enemiesBulletList.append(bullet)
class NewBullet():
def __init__(self,h):
self.images = {
"right":pygame.image.load("newbullet.jpg"),
"down":pygame.image.load("newbullet2.jpg"),
"left":pygame.image.load("newbullet3.jpg"),
"up":pygame.image.load("newbullet4.jpg"),
}
self.start_way = "left"
self.image = self.images[self.start_way]
self.speed = 150
self.rect = pygame.Rect(h.rect.x, h.rect.y, 17, 17)
self.rect.x = h.rect.x
self.rect.y = h.rect.y
self.way = h.way
def move(self):
if self.way == "up":
self.start_way = "up"
self.image = self.images[self.start_way]
self.rect.y = self.rect.y - self.speed
if self.way == "down":
self.start_way = "down"
self.image = self.images[self.start_way]
self.rect.y = self.rect.y + self.speed
if self.way == "left":
self.start_way = "left"
self.image = self.images[self.start_way]
self.rect.x = self.rect.x - self.speed
if self.way == "right":
self.start_way = "right"
self.image = self.images[self.start_way]
self.rect.x = self.rect.x + self.speed
def show(self, screen):
screen.blit(self.image, self.rect)
def hit(self, e):
if self.rect.colliderect(e.rect):
e.hp = e.hp - 200
num = 1
enemiesNum = 3
enemiesList = []
hitEnemy = 0
for i in range(enemiesNum):
enemiesList.append(Enemy())
enemiesList.append(GunEnemy())
hero = Hero()
win = 2
heroBulletList = []
heroBulletList2 = []
enemiesBulletList = []
t1 = time.time()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_RIGHT:
hero.move("right", 50)
elif event.key == pygame.K_LEFT:
hero.move("left", 50)
elif event.key == pygame.K_UP:
hero.move("up", 50)
elif event.key == pygame.K_DOWN:
hero.move("down", 50)
elif event.key == pygame.K_SPACE:
try:
hero.fire()
except AttributeError:
print('请使角色移动!')
else:
hero.fire()
elif event.key == pygame.K_1:
try:
hero.sf()
except AttributeError:
print('请使角色移动!')
else:
hero.sf()
hero.show(screen)
live = 0
for m in enemiesList:
if m.hp > 0:
live = 1
m.move(1)
m.show(screen)
m.hit(hero)
if hasattr(m,"fire" ):
t2 = time.time()
x = int((t2 - t1) * 10)
if x % 15 == 0:
m.fire()
time.sleep(0.01)
for b in heroBulletList:
b.show(screen)
b.move()
#在158行完成子弹的hit函数的调用,注意参数哦
for m in enemiesList:
b.hit(m)
for a in heroBulletList2:
a.show(screen)
a.move()
#在158行完成子弹的hit函数的调用,注意参数哦
for n in enemiesList:
a.hit(n)
for b in enemiesBulletList:
b.show(screen)
b.move()
b.hit(hero)
# 超出屏幕的子弹删除掉
for b in heroBulletList:
if b.rect.x < -50 or b.rect.x > 550 or b.rect.y < -50 or b.rect.y > 550:
heroBulletList.remove(b)
if hero.hp <= 0:
win = 0
break
if live == 0:
win = 1
break
pygame.display.update()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if win == 1:
screen.blit(sucImg, (0, 0))
sys.exit()
if win == 0:
screen.blit(loseImg, (0, 0))
sys.exit()
pygame.display.update()