Python实战

敬请T期待 Lv3

外星人入侵游戏开发

一、开发框架

总文件:alien_invasion

包含文件:

  • image文件
  • alien_invasion.py
  • game_functions.py
  • ship.py
  • settings.py
  • bullet.py

alien.invasion.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#alien_invasion.py
#一系列整个游戏都要用到的对象,游戏的主循环
import pygame#模块pygame包含开发游戏所需的功能

from settings import Settings
from ship import Ship
import game_functions as gf

def run_game():
#初始化游戏并创建一个屏幕对象
pygame.init()#初始化背景设置
ai_settings = Settings()
screen = pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))
"""
我们调用pygame.display.set_mode()来创建一个名为screen的显示窗口,这个游戏的所有图形元素都将在其中绘制。
通过将这些尺寸值传递给pygame.display.set_mode(),我们创建了一个宽1200像素、高800像素的游戏窗口
(你可以根据自己的显示器尺寸调整这些值)。
surface是屏幕的一部分,用于显示游戏元素。在这个游戏中,每个元素(如外星人或飞船)都是一个surface。
display.set_mode()返回的surface表示整个游戏窗口。
我们激活游戏的动画循环后,每经过一次循环都将自动重绘这个surface。
"""
pygame.display.set_caption("Alien Invasion")

#设置背景色
bg_color = (230,230,230)

#创建一艘飞船
ship = Ship(ai_settings,screen)#创建一个名为ship的Ship实例

#开始游戏的主循环
while True:
gf.check_events(ship)
gf.ship.updat()#玩家输入时,飞船位置更新
gf.update_screen(ai_settings,screen,ship)

run_game()

game_functions.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#game_functions.py
"""包含一系列函数,由它完成游戏的大部分工作.
check_events()检测相关事件,按键的按下与松开,并且辅助check_keydown_events()和check_keyup_events()处理事件
包含模块update_screen()用于每次执行主循环时的屏幕绘制
"""
import sys
import pygame

def check_keydown_events(event,ship):#检查鼠标键按下
"""响应按键"""
if event.key == pygame.K_RITGHT:
ship.moving_right = True
elif event.key == pygame.K_LEFT:
ship.moving_left = True

def check_keyup_events(event,ship):#检查鼠标键松开
if event.key == pygame.K_RIGHT:
ship.moving_right = False
elif event.key ==pygame.K_LEFT:
ship.moving_left = False

def check_events(event,ship):
"""响应按键和鼠标事件"""
for events in pygame.event.get():
if events.type == pygame.QUIT:
sys.exit()
elif events.type == pygame.KEYDOWN:#鼠标键按下时
check_keydown_events(event,ship)
elif events.type ==pygame.KEYUP:#鼠标键松开时
check_keyup_events(event,ship)

def update_screen(ai_settings,screen,ship):
"""更新屏幕上的图像,并切换到新屏幕"""
# 每次循环都重新绘制屏幕
screen.fill(ai_settings.bg_color) # 这个方法只接受一个实参:一种颜色。
ship.blitme() # 将飞船绘制到屏幕

# 让最近绘制的屏幕可见
pygame.display.flip() # 命令Pygame让最近绘制的屏幕可见。营造平滑移动的效果。



ship.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#Ship.py
'''包含__init__()、管理飞船位置的方法update()以及在屏幕上绘制飞船的方法blitme()'''
import pygame
class Ship():
def __init__(self,ai_settings,screen):#screen指定了要将飞船绘制到什么地方
"""初始化飞船并设置其初始位置"""
self.screen = screen
self.ai_settings = ai_settings
#加载飞船图像并获取其外接矩形
self.image = pygame.image.load('.\images\ship.bmp')
self.rect = self.image.get_rect()#飞船图像
self.screen_rect = screen.get_rect()#屏幕
#将每艘新飞船放在屏幕底部中央
self.rect.centerx = self.screen_rect.centerx#self.rect.centerx(飞船中心的x坐标)
self.rect.bottom = self.screen_rect.bottom#self.rect.bottom(飞船下边缘的y坐标)
#在飞船的属性center中存储小数值
self.center = float(self.rect.centerx)
#移动标志
self.moving_right = False #向右移动标志
self.mobing_left = False #向左移动标志

def updat(self):
"""根据移动标志调整飞船的位置"""
#更新飞船的center值,而不是rect
#self.rect.right返回飞船外接矩形的右边缘的x坐标,如果这个值小于self.screen_rect.right的值,就说明飞船未触及屏幕右边缘
if self.moving_right and self.rect.right < self.screen_rect.right:
self.rect.centerx += self.ai_settings.ship_speed_factor
#如果rect的左边缘的x坐标大于零,就说明飞船未触及屏幕左边缘
if self.moving_left and self.rect.left > 0:
self.rect.centerx -= self.ai_settings.ship_speed_factor
#根据self.rect.center更新rect对象
self.rect.centerx = self.center

def blitme(self):
"""在指定位置绘制飞船"""
self.screen.blit(self.image,self.rect)

settings.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#setting.py
#包含Setting类,只含有__init__(),初始化控制游戏外观和飞船的速度属性,射击子弹的属性
class Settings():
"""存储《外星入侵》的所有设置的类"""
def __init__(self):
#初始化游戏的设置
#屏幕设置
self.screen_width = 1200
self.screen_height = 800
self.bg_color = (230,230,230)#灰色
#飞船的设置
self.ship_speed_factor = 1.5
#设置子弹
self.bullet_speed_factor = 1
self.bullet_width = 3
self.bullet_hight = 15
self.bullet_color = 60,60,60


bullet.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#bullet.py
import pygame
from pygame.sprite import Sprite#精灵,可将游戏中相关的元素编组,进而同时操作编组中的所有元素。

class Bullet(Sprite):
"""一个对飞船发射的子弹进行管理的类"""
def __init__(self, ai_settings, screen,ship):
"""在飞船所处的位置创建一个子弹对象"""
super(Bullet,self)._init__()
self.screen = screen

#在(0,0)处创建一个表示子弹的矩形,在设置正确的位置
self.rect = pygame.Rect(0,0,ai_settings.bullet_width,ai_settings.bullet_height)
self.rect.centerx = ship.rect.centerx
self.rect.top = ship.rect.top

#存储用小数表示的位置
self.y = float(self.rect.y)
self.color = ai_settings.bullet_color
self.speed_factor = ai_settings.bullet_speed_factor

def update(self):
"""向上移动子弹"""
#更新表示子弹的位置的小数值
self.y -= self.speed_factor
#更新表示子弹的rect位置
self.rect.y = self.y

def draw_bullet(self):
"""在屏幕上绘制子弹"""
"""函数draw.rect()使用存储在self.color中的颜色填充表示子弹的rect占据的屏幕部分"""
pygame.draw.rect(self.screen,self.color,self.rect)

images文件

  • ship

项目进度:12.6.4

敬请T期待

樱花树

原文链接:https://blog.csdn.net/sxc1414749109/article/details/139392284

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#cherry.py
from turtle import *
from random import random
from math import cos,radians

def draw_tree(branch_length,level):
#递归绘制树干
pendown()
#根据当前的方向和角度改变颜色
t=cos(radians(heading()+45))/8+0.25
pencolor(t,t,t)
pensize(branch_length/10)
forward(branch_length)

if level > 0 :#如果还有分支级别
#随意生成分支角度和长度
angle1=random()*15+10
angle2=random()*15+10
new_length=branch_length*(random()*0.25+0.7)

#绘制右侧分支
right(angle1)
draw_tree(new_length,level-1)

#绘制左侧分支
left(angle1+angle2)
draw_tree(new_length,level-1)


right(angle2)
else: # 如果已经到达最底层
# 在分支末端绘制花朵
draw_flower()

penup()
backward(branch_length)

#绘制树枝末端树叶
def draw_flower():

right(90)#调整方向,准备绘制花朵
pencolor("pink")
circle(3)#绘制花朵

left(90)#调整方向,准备绘制其他元素

#偶尔在地面上绘制落花
if random() > 0.7:
penup()#抬笔,停止绘画
current_heading=heading()#记录当前方向
angle = -40+random()*80
setheading(angle)#设置方向
#计算落花的距离
distance=int(800 * random() * 0.5 + 400 * random() * 0.3 + 200 * random() * 0.2)
forward(distance)
#落笔
pendown()
right(90)
#根据当前的方向和角度计算颜色
n=cos(radians(heading()-45))/4+0.5
pencolor(n*0.5+0.5, 0.4+n*0.4, 0.4+n*0.4)
circle(2)

left(90)
penup()
setheading(angle)
backward(distance)#后退回原来的位置
setheading(current_heading)#恢复至原始方向


def main():
"""主函数用于设置绘图环境并开始绘制过程"""
bgcolor(0.956, 0.9255, 0.9882) # 设置背景颜色为浅紫色
speed(10)
hideturtle()
tracer(100)#设置追踪延迟

penup()#抬笔
backward(100)#后退一段距离
left(90)
backward(300)

draw_tree(100, 12)
done()


if __name__ == "__main__":
main() #主函数

效果图:

cherry

  • Title: Python实战
  • Author: 敬请T期待
  • Created at : 2024-02-07 10:17:45
  • Updated at : 2024-07-13 23:17:08
  • Link: https://kingwempity.github.io/2024/02/07/Python实战/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments
On this page
Python实战