今天第十四,十五天 - 自律代码100天

天数:第十四,十五天 

时间:2023年12月 28, 29日

内容:

训练:飞机大战小游戏(要求:键盘键入,随机数,面向对象,列表,自定义函数)

题目是网上找的,代码自己打,自己测试的,真的进步很大!!! 

---------------------------------------------------------------------------------------------------------------------------------

根据示例,实现飞机大战部分效果。

任务设计:(需要用的背景图,玩家图等已上传到资源,有需要的拿取)

  1. 创建游戏中所有对象的类:玩家类、玩家子弹类、敌机类、敌机子弹类;
  2. 显示背景、玩家和敌机
  3. 实现敌机左右移动的功能;
  4. 实现左右键控制玩家移动的功能;
  5. 敌机随机发射子弹玩家使用空格键控制子弹发射

实现效果图:

代码模版(根据模版和任务,即可完成最终飞机大战小游戏)

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()

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值