import pygame
import random
from time import sleep
BG_COLOR =pygame.Color(255,255,255)
SCREEN_WIDTH = 700
SCREEN_HEIGHT = 500
TEXT_COLOR = (255,0,0)
class Tanke:
def display_tank(self)->None:
self.image = self.images.get(self.direction)
MainGame.window.blit(self.image,self.rect)
def move(self)->None:
if self.direction == 'L':
if self.rect.left > 0:
self.rect.left = self.rect.left - self.speed
elif self.direction == 'R':
if self.rect.left +self.rect.width< SCREEN_WIDTH:
self.rect.left = self.rect.left + self.speed
elif self.direction == 'U':
if self.rect.top > 0:
self.rect.top = self.rect.top - self.speed
elif self.direction == 'D':
if self.rect.top + self.rect.height < SCREEN_HEIGHT:
self.rect.top = self.rect.top + self.speed
def shot(self)->None:
pass
class Mytanke(Tanke):
def __init__(self,left:int,top:int)->None:
self.images = {
"U":pygame.image.load('.\img\p1tankU.gif'),
"D":pygame.image.load('.\img\p1tankD.gif'),
"L":pygame.image.load('.\img\p1tankL.gif'),
"R":pygame.image.load('.\img\p1tankR.gif')
}
self.direction = "U"
self.image = self.images.get(self.direction)
self.rect = self.image.get_rect()
self.rect.left = left
self.rect.top = top
self.speed = 10
self.remove = False
class EnemyTanke(Tanke):
def __init__(self,left,top,speed)->None:
self.images = {
"U": pygame.image.load('.\img\enemy1U.gif'),
"D": pygame.image.load('.\img\enemy1D.gif'),
"L": pygame.image.load('.\img\enemy1L.gif'),
"R": pygame.image.load('.\img\enemy1R.gif')
}
self.direction = self.rand_direction()
self.image = self.images.get(self.direction)
self.rect = self.image.get_rect()
self.rect.left = left
self.rect.top = top
self.speed =speed
self.step = 20
def rand_direction(self)->str:
chice = random.randint(1,4)
if chice == 1:
return 'U'
elif chice == 2:
return 'D'
elif chice == 3:
return 'L'
elif chice == 4:
return 'R'
def rand_move(self)->None:
if self.step <= 0:
self.direction = self.rand_direction()
self.step +=20
else:
self.move()
self.step -=1
class Bullet:
def __init__(self,tanke)->None:
self.image = pygame.image.load("./img/enemymissile.gif")
self.direction = tanke.direction
self.rect = self.image.get_rect()
if self.direction == 'L':
self.rect.left = tanke.rect.left - self.rect.width
self.rect.top = tanke.rect.top + tanke.rect.height / 2 - self.rect.height / 2
elif self.direction == 'U':
self.rect.left = tanke.rect.left + tanke.rect.width / 2 - self.rect.width / 2
self.rect.top = tanke.rect.top - self.rect.height
elif self.direction == 'D':
self.rect.left = tanke.rect.left + tanke.rect.width / 2 - self.rect.width / 2
self.rect.top = tanke.rect.top + tanke.rect.height
elif self.direction == 'R':
self.rect.left =tanke.rect.left + tanke.rect.width
self.rect.top = tanke.rect.top + tanke.rect.height / 2 - self.rect.height / 2
self.speed = 10
def dispaly_bullet(self)->None:
MainGame.window.blit(self.image,self.rect)
def move(self)->None:
if self.direction =='L':
if self.rect.left > self.speed:
self.rect.left -= self.speed
#else:
#self.rect.left = 0
if self.direction =='R':
if self.rect.left < SCREEN_WIDTH - self.rect.width:
self.rect.left += self.speed
#else:
#self.rect.left = SCREEN_HEIGHT - self.rect.width
if self.direction =='U':
if self.rect.top > self.speed:
self.rect.top -= self.speed
#else:
#self.rect.top = 0
if self.direction =='D':
if self.rect.top < SCREEN_HEIGHT - self.rect.height:
self.rect.top += self.speed
#else:
#self.rect.top = SCREEN_HEIGHT - self.rect.height
class Wall:
def __init__(self)->None:
pass
def diapaly_wall(self)->None:
pass
class Explode:
def __init__(self)->None:
pass
def display_explode(self)->None:
pass
class Music:
def __init__(self)->None:
pass
def display_explode(self)->None:
pass
class MainGame:
window = None
my_tanke = None
enemy_tanke_list = []
my_bullet_list = []
enemy_tanke_count = 6
def __init__(self)->None:
pass
def start_game(self)->None:
pygame.display.init()
MainGame.window = pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT))
pygame.display.set_caption("坦克大战")
MainGame.my_tanke = Mytanke(350,250)
self.create_enemy_tanke()
while True:
sleep(0.02)
MainGame.window.fill(BG_COLOR)
text = self.get_text_surface(f"敌方坦克剩余数量{MainGame.enemy_tanke_count}")
MainGame.window.blit(text,(10,10))
self.get_event()
MainGame.my_tanke.display_tank()
self.dispaly_enemy_tanke()
if MainGame.my_tanke.remove:
MainGame.my_tanke.move()
self.display_my_bullet()
pygame.display.update()
def display_my_bullet(self)->None:
for my_bullet in MainGame.my_bullet_list:
my_bullet.dispaly_bullet()
my_bullet.move()
def create_enemy_tanke(self)->None:
self.enemy_top = 100
self.enemy_speed = 10
for i in range(self.enemy_tanke_count):
left = random.randint(0,600)
e_tanke = EnemyTanke(left,self.enemy_top,self.enemy_speed)
self.enemy_tanke_list.append(e_tanke)
def dispaly_enemy_tanke(self)->None:
for e_tanke in self.enemy_tanke_list:
e_tanke.display_tank()
e_tanke.rand_move()
def get_text_surface(self,text:str)->None:
pygame.font.init()
font = pygame.font.SysFont("kaiti",18)
text_surface = font.render(text,True,TEXT_COLOR)
return text_surface
def get_event(self)->None:
event_list = pygame.event.get()
for event in event_list:
if event.type == pygame.QUIT:
self.end_game()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
print('坦克向左移动')
MainGame.my_tanke.direction = 'L'
MainGame.my_tanke.remove = True
elif event.key == pygame.K_RIGHT:
print('坦克向右移动')
MainGame.my_tanke.direction = 'R'
MainGame.my_tanke.remove = True
elif event.key == pygame.K_DOWN:
print('坦克向下移动')
MainGame.my_tanke.direction = 'D'
MainGame.my_tanke.remove = True
elif event.key == pygame.K_UP:
print('坦克向上移动')
MainGame.my_tanke.direction = 'U'
MainGame.my_tanke.remove = True
elif event.key == pygame.K_SPACE:
print('发射子弹')
m_bullet = Bullet(MainGame.my_tanke)
MainGame.my_bullet_list.append(m_bullet)
if event.type == pygame.KEYUP and event.key in (pygame.K_LEFT,pygame.K_RIGHT,pygame.K_DOWN,pygame.K_UP):
MainGame.my_tanke.remove = False
def end_game(self)->None:
print("谢谢使用")
exit()
其中的函数:
def display_my_bullet(self)->None:
for my_bullet in MainGame.my_bullet_list:
my_bullet.dispaly_bullet()
my_bullet.move()
为什么调用class Bullet中的move函数,而不是class Tanke中move?