天数:第十四,十五天
时间:2023年12月 28, 29日
内容:
训练:飞机大战小游戏(要求:键盘键入,随机数,面向对象,列表,自定义函数)
题目是网上找的,代码自己打,自己测试的,真的进步很大!!!
---------------------------------------------------------------------------------------------------------------------------------
根据示例,实现飞机大战部分效果。
任务设计:(需要用的背景图,玩家图等已上传到资源,有需要的拿取)
- 创建游戏中所有对象的类:玩家类、玩家子弹类、敌机类、敌机子弹类;
- 显示背景、玩家和敌机;
- 实现敌机左右移动的功能;
- 实现左右键控制玩家移动的功能;
- 敌机随机发射子弹,玩家使用空格键控制子弹发射;
实现效果图:
代码模版(根据模版和任务,即可完成最终飞机大战小游戏)
import time
import pygame
from pygame.locals import * #检测事件,如监控键盘按键
import sys
import random
#玩家类:
#属性:显示窗口、位置、图片、子弹列表、移动状态
#方法:显示、移动、开火
class Player():
pass
#玩家子弹类:
#属性:显示窗口、位置、图片
#方法:显示、移动
class Emeny():
pass
#敌机类
#属性:显示窗口、位置、图片、子弹列表、移动状态、被击中次数
#方法:显示、移动、开火
class display():
pass
#敌机子弹类
#属性:显示窗口、位置、图片
#方法:显示、移动
class EmenyBullet():
pass
#键盘监控
def key_control(player):
pass
#mian方法
class main():
pass
#-------
if __name__ == '__main__':
main()
---------------------------------------------------------------------------------------------------------------------------------
我的代码:
# 综合训练3:飞机大战
#
# 根据示例,实现飞机大战部分效果。
#
# a. 创建游戏中所有对象的类:玩家类、玩家子弹类、敌机类、敌机子弹类;
# b. 显示背景、玩家和敌机;
# c. 实现敌机左右移动的功能;
# d. 实现左右键控制玩家移动的功能;
# e. 敌机随机发射子弹,玩家使用空格键控制子弹发射;
#
import time
import pygame
from pygame.locals import * #检测事件,如监控键盘按键
import sys
import random
#玩家类:
#属性:显示窗口、位置、图片、子弹列表、移动状态
#方法:显示、移动、开火
class Player():
def __init__(self,screen):
self.screen = screen #一个传参,设置玩家飞机在此窗口对象
self.localtionX = 0 #设定飞机的初始值位置
self.localtionY = 500
self.image = pygame.image.load(r"C:\Users\gw\OneDrive\桌面\python\feiji\hero.gif") #100*124
self.playerBulletList = []
self.moveLeft = 0 #设置键盘 0为左移,1为右移
self.moveRight = 1
def display(self):
self.screen.blit(self.image, (self.localtionX, self.localtionY))
for s in self.playerBulletList: #显示子弹 遍历每一个子弹对象,并显示
s.display()
s.move()
if s.localtionY < 0:
self.playerBulletList.remove(s)
def move(self):
if self.moveLeft == 1 and self.localtionX > -30:
self.localtionX -= 5
if self.moveRight == 1 and self.localtionX < 360:
self.localtionX += 5
def fire(self):
playerBullet = PlayerBullet(self.screen,(self.localtionX,self.localtionY)) #在子弹列表中增加一个子弹对象到playerBulletList
self.playerBulletList.append(playerBullet)
#玩家子弹类:
#属性:显示窗口、位置、图片
#方法:显示、移动
class PlayerBullet():
def __init__(self,screen,localtionX,localtionY):
self.screen = screen
self.localtionX = localtionX + 54
self.localtionY = localtionY - 21
self.image = pygame.image.load(r"C:\Users\gw\OneDrive\桌面\python\feiji\bullet-1.gif") #9*21
def display(self):
self.screen.blit(self.image,(self.localtionX,self.localtionY))
def move(self): #子弹的Y不会改变,但是飞机x的位置改变时,子弹位置也要改变
self.localtionY -= 20
#敌机类
#属性:显示窗口、位置、图片、子弹列表、移动状态
#方法:显示、移动、开火
class Enemy():
def __init__(self, screen):
self.screen = screen # 一个传参,设置玩家飞机在此窗口对象
self.localtionX = 0 # 设定飞机的初始值位置
self.localtionY = 0
self.image = pygame.image.load(r"C:\Users\gw\OneDrive\桌面\python\feiji\enemy0.png") #51x39
self.enemyBulletList = []
self.moveState = 1 # 1为右移
def display(self):
self.screen.blit(self.image,(self.localtionX,self.localtionY))
# 显示子弹
for s in self.enemyBulletList: #遍历每一个子弹对象,并显示
s.display()
s.move()
if s.localtionY >= 600: #在子弹列表中增加一个子弹对象
self.enemyBulletList.remove(s)
def move(self):
if self.moveState == 1:
self.localtionX += 5 # 向右移动5像素
elif self.moveState == 0:
self.localtionX -= 5 # 向左移动5像素
if self.localtionX <= -25: # 当敌机移动到边缘时改变方向
self.moveState = 1
if self.localtionX >= 285:
self.moveState = 0
def fire(self): # 在子弹列表中增加一个子弹对象
enemyBullet = EnemyBullet(self.screen, self.localtionX, self.localtionY)
self.enemyBulletList.append(enemyBullet)
#玩家子弹类:
#属性:显示窗口、位置、图片
#方法:显示、移动
class EnemyBullet():
def __init__(self, screen, localtionX, localtionY):
self.screen = screen
self.localtionX = localtionX + 20
self.localtionY = localtionY + 30
self.image = pygame.image.load(r"C:\Users\gw\OneDrive\桌面\python\feiji\bullet-1.gif") # 9*21
def display(self):
self.screen.blit(self.image, (self.localtionX, self.localtionY))
def move(self): # 子弹的Y不会改变,但是飞机x的位置改变时,子弹位置也要改变
self.localtionY += 20
# 捕捉用户操作
def key_control(player):
for event in pygame.event.get():
if event.type == QUIT:
print("正在退出.....")
sys.exit(0) # 强制退出
elif event.type == KEYDOWN: # 键盘输入
if event.key == K_LEFT:
print("玩家向左!")
player.moveLeftState = 1
if event.key == K_RIGHT:
print("玩家向右!")
player.moveRightState = 1
if event.key == K_SPACE: # 捕捉空格键
print("玩家开火!")
player.fire()
elif event.type == KEYUP: # 键盘释放
if event.key == K_LEFT: # 释放左键
print("停止向左...")
player.moveLeftState = 0
if event.key == K_RIGHT: # 释放右键
print("停止向右...")
player.moveRightState = 0
class main():
screen = pygame.display.set_mode((300,600)) #创建窗口对象
background = pygame.image.load(r"C:\Users\gw\OneDrive\桌面\python\feiji\background.png") #获取背景
player = Player(screen) #创建玩家对象,并传入显示窗口
enemy = Enemy(screen)
while 1 == 1:
screen.blit(background,(0,0)) #显示背景
player.display() # 显示玩家
enemy.display() #显示敌机
enemy.move() #移动敌机
player.move() # 玩家移动
# 敌机随机开火
r = random.randint(1,6)
if r == 1:
enemy.fire()
key_control(player) # 捕捉用户操作
pygame.display.update()#刷新窗口
time.sleep(0.05)
if __name__ == '__main__':
main()