1.添加enemy
在添加完Player后,就可以添加一些敌人,让我们的游戏丰富起来了,我们可以做一个躲避方块的游戏了
跟创建玩家一样的道理,先绘制出enemy
import pygame
import sys
import random
pygame.init()
width = 500
height = 500
size = width, height
screen = pygame.display.set_mode((size))
pygame.display.set_caption('Hello World')
class Player():
def __init__(self):
self.surface = pygame.surface.Surface((50, 50)) #创建玩家的外观
self.surface.fill('blue') #设置Player的颜色
self.rect = self.surface.get_rect() #玩家位置
def draw(self):
screen.blit(self.surface, self.rect)
def move(self):
#玩家移动
self.speed = 5
p = pygame.key.get_pressed()
if p[pygame.K_UP]:
self.rect.top -= self.speed
if p[pygame.K_DOWN]:
self.rect.top += self.speed
if p[pygame.K_RIGHT]:
self.rect.right += self.speed
if p[pygame.K_LEFT]:
self.rect.right -= self.speed
#限制移动范围
if self.rect.right >= width:
self.rect.right -= self.speed
if self.rect.left <= 0:
self.rect.right += self.speed
if self.rect.bottom >= height:
self.rect.top -= self.speed
if self.rect.top <= 0:
self.rect.top += self.speed
class Enemy():
def __init__(self):
self.surface = pygame.surface.Surface((50, 50)) #创建敌人的外观
self.surface.fill('red') #设置Enemy的颜色
self.rect = self.surface.get_rect(x=random.randint(width + 10, width + 50), y=random.randint(0, height)) #敌人位置
def draw(self):
screen.blit(self.surface, self.rect)
clock = pygame.time.Clock()
player = Player() #实例化玩家类
enemy = Enemy()
while True: #设置一个循环
for event in pygame.event.get(): #事件检测
if event.type == pygame.QUIT: #如果检测到按下退出则执行下一条
pygame.quit() #退出窗口
sys.exit() #退出整个程序
player.move()
screen.fill('white') #将窗口设为白色
player.draw() #调用player类的draw函数
Enemy.draw()
pygame.display.flip() #刷新窗口
clock.tick(60) #帧率
然后添加Enemy的移动逻辑
import pygame
import sys
import random
pygame.init()
width = 500
height = 500
size = width, height
screen = pygame.display.set_mode((size))
pygame.display.set_caption('Hello World')
class Player():
def __init__(self):
self.surface = pygame.surface.Surface((50, 50)) #创建玩家的外观
self.surface.fill('blue') #设置Player的颜色
self.rect = self.surface.get_rect() #玩家位置
def draw(self):
screen.blit(self.surface, self.rect)
def move(self):
#玩家移动
self.speed = 5
p = pygame.key.get_pressed()
if p[pygame.K_UP]:
self.rect.top -= self.speed
if p[pygame.K_DOWN]:
self.rect.top += self.speed
if p[pygame.K_RIGHT]:
self.rect.right += self.speed
if p[pygame.K_LEFT]:
self.rect.right -= self.speed
#限制移动范围
if self.rect.right >= width:
self.rect.right -= self.speed
if self.rect.left <= 0:
self.rect.right += self.speed
if self.rect.bottom >= height:
self.rect.top -= self.speed
if self.rect.top <= 0:
self.rect.top += self.speed
class Enemy():
def __init__(self):
self.surface = pygame.surface.Surface((30, 30)) #创建敌人的外观
self.surface.fill('red') #设置Enemy的颜色
self.rect = self.surface.get_rect(x=random.randint(width + 10, width + 50), y=random.randint(0, height)) #随机敌人位置
def draw(self):
screen.blit(self.surface, self.rect)
def move(self):
self.speed = 7
self.rect.right -= self.speed
clock = pygame.time.Clock()
player = Player() #实例化玩家类
enemy = Enemy()
while True: #设置一个循环
for event in pygame.event.get(): #事件检测
if event.type == pygame.QUIT: #如果检测到按下退出则执行下一条
pygame.quit() #退出窗口
sys.exit() #退出整个程序
player.move()
enemy.move()
screen.fill('white') #将窗口设为白色
player.draw() #调用player类的draw函数
enemy.draw()
pygame.display.flip() #刷新窗口
clock.tick(60) #帧率
这是运行游戏,就可以看到红色的方块移动过来了
然后创建更多enemy,用自定义函数USEREVENT,和延时装置定时生成敌人,生成批量敌人
先把实例化改成这样,创建一个空列表
enemy = Enemy() -------> enemies = []
调用函数
for enemy in enemies:
enemy.draw()
设置一个自定义事件,0.3秒执行一次
ADD_ENEMY = pygame.USEREVENT
pygame.time.set_timer(ADD_ENEM, 500) #过0.5秒执行一次,单位毫秒
增加ADD_ENEMY的事件执行
while True: #设置一个循环
for event in pygame.event.get(): #事件检测
if event.type == pygame.QUIT: #如果检测到按下退出则执行下一条
pygame.quit() #退出窗口
sys.exit() #退出整个程序
if event.type == ADD_ENEMY:
enemies.append(Enemy())
此时就会不断的生成小方块在我们的屏幕上
完整代码:
import pygame
import sys
import random
pygame.init()
width = 500
height = 500
size = width, height
ADD_ENEMY = pygame.USEREVENT
pygame.time.set_timer(ADD_ENEMY, 500) #过0.3秒执行一次,单位毫秒
screen = pygame.display.set_mode((size))
pygame.display.set_caption('躲避方块')
class Player():
def __init__(self):
self.surface = pygame.surface.Surface((50, 50)) #创建玩家的外观
self.surface.fill('blue') #设置Player的颜色
self.rect = self.surface.get_rect() #玩家位置
def draw(self):
screen.blit(self.surface, self.rect)
def move(self):
#玩家移动
self.speed = 5
p = pygame.key.get_pressed()
if p[pygame.K_UP]:
self.rect.top -= self.speed
if p[pygame.K_DOWN]:
self.rect.top += self.speed
if p[pygame.K_RIGHT]:
self.rect.right += self.speed
if p[pygame.K_LEFT]:
self.rect.right -= self.speed
#限制移动范围
if self.rect.right >= width:
self.rect.right -= self.speed
if self.rect.left <= 0:
self.rect.right += self.speed
if self.rect.bottom >= height:
self.rect.top -= self.speed
if self.rect.top <= 0:
self.rect.top += self.speed
class Enemy():
def __init__(self):
self.surface = pygame.surface.Surface((30, 30)) #创建敌人的外观
self.surface.fill('red') #设置Enemy的颜色
self.rect = self.surface.get_rect(x=random.randint(width + 10, width + 50), y=random.randint(0, height)) #随机敌人位置
def draw(self):
screen.blit(self.surface, self.rect)
def move(self):
self.speed = 5
self.rect.right -= self.speed
clock = pygame.time.Clock()
player = Player() #实例化玩家类
enemies = []
while True: #设置一个循环
for event in pygame.event.get(): #事件检测
if event.type == pygame.QUIT: #如果检测到按下退出则执行下一条
pygame.quit() #退出窗口
sys.exit() #退出整个程序
if event.type == ADD_ENEMY:
enemies.append(Enemy())
player.move()
for enemy in enemies:
enemy.move()
screen.fill('white') #将窗口设为白色
player.draw() #调用player类的draw函数
for enemy in enemies:
enemy.draw()
pygame.display.flip() #刷新窗口
clock.tick(60) #帧率
碰撞检测
Enemy已经添加了,但是我们碰到小方块却啥事没有,所以我们得添加碰撞检测,来检测玩家是否与小方块发生碰撞
import pygame
import sys
import random
pygame.init()
width = 500
height = 500
size = width, height
ADD_ENEMY = pygame.USEREVENT
pygame.time.set_timer(ADD_ENEMY, 500) #过0.3秒执行一次,单位毫秒
screen = pygame.display.set_mode((size))
pygame.display.set_caption('躲避方块')
class Player(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.surface = pygame.surface.Surface((50, 50)) #创建玩家的外观
self.surface.fill('blue') #设置Player的颜色
self.rect = self.surface.get_rect() #玩家位置
def draw(self):
screen.blit(self.surface, self.rect)
def move(self):
#玩家移动
self.speed = 5
p = pygame.key.get_pressed()
if p[pygame.K_UP]:
self.rect.top -= self.speed
if p[pygame.K_DOWN]:
self.rect.top += self.speed
if p[pygame.K_RIGHT]:
self.rect.right += self.speed
if p[pygame.K_LEFT]:
self.rect.right -= self.speed
#限制移动范围
if self.rect.right >= width:
self.rect.right -= self.speed
if self.rect.left <= 0:
self.rect.right += self.speed
if self.rect.bottom >= height:
self.rect.top -= self.speed
if self.rect.top <= 0:
self.rect.top += self.speed
class Enemy(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.surface = pygame.surface.Surface((30, 30)) #创建敌人的外观
self.surface.fill('red') #设置Enemy的颜色
self.rect = self.surface.get_rect(x=random.randint(width + 10, width + 50), y=random.randint(0, height)) #随机敌人位置
def draw(self):
screen.blit(self.surface, self.rect)
def move(self):
self.speed = 5
self.rect.right -= self.speed
clock = pygame.time.Clock()
player = Player() #实例化玩家类
enemies = pygame.sprite.Group()
while True: #设置一个循环
for event in pygame.event.get(): #事件检测
if event.type == pygame.QUIT: #如果检测到按下退出则执行下一条
pygame.quit() #退出窗口
sys.exit() #退出整个程序
if event.type == ADD_ENEMY:
enemies.append(Enemy())
player.move()
for enemy in enemies:
enemy.move()
screen.fill('white') #将窗口设为白色
player.draw() #调用player类的draw函数
for enemy in enemies:
enemy.draw()
pygame.display.flip() #刷新窗口
clock.tick(60) #帧率
将Enemy的实例化改成
enemies = [] ----> enemies = pygame.sprite.Group()
运行以上代码时enemies.apend(Enemy())会报错,因为将enemies改成sprite.Group()了,而sprite.Group()没有apend这个方法, 所以要将apend改成add
import pygame
import sys
import random
pygame.init()
width = 500
height = 500
size = width, height
ADD_ENEMY = pygame.USEREVENT
pygame.time.set_timer(ADD_ENEMY, 500) #过0.3秒执行一次,单位毫秒
screen = pygame.display.set_mode((size))
pygame.display.set_caption('躲避方块')
class Player(pygame.sprite.Sprite):
def __init__(self):
super.__init__(self)
self.surface = pygame.surface.Surface((50, 50)) #创建玩家的外观
self.surface.fill('blue') #设置Player的颜色
self.rect = self.surface.get_rect() #玩家位置
def draw(self):
screen.blit(self.surface, self.rect)
def move(self):
#玩家移动
self.speed = 5
p = pygame.key.get_pressed()
if p[pygame.K_UP]:
self.rect.top -= self.speed
if p[pygame.K_DOWN]:
self.rect.top += self.speed
if p[pygame.K_RIGHT]:
self.rect.right += self.speed
if p[pygame.K_LEFT]:
self.rect.right -= self.speed
#限制移动范围
if self.rect.right >= width:
self.rect.right -= self.speed
if self.rect.left <= 0:
self.rect.right += self.speed
if self.rect.bottom >= height:
self.rect.top -= self.speed
if self.rect.top <= 0:
self.rect.top += self.speed
class Enemy(pygame.sprite.Sprite):
def __init__(self):
super.__init__(self)
self.surface = pygame.surface.Surface((30, 30)) #创建敌人的外观
self.surface.fill('red') #设置Enemy的颜色
self.rect = self.surface.get_rect(x=random.randint(width + 10, width + 50), y=random.randint(0, height)) #随机敌人位置
def draw(self):
screen.blit(self.surface, self.rect)
def move(self):
self.speed = 5
self.rect.right -= self.speed
clock = pygame.time.Clock()
player = Player() #实例化玩家类
enemies = pygame.sprite.Group()
while True: #设置一个循环
for event in pygame.event.get(): #事件检测
if event.type == pygame.QUIT: #如果检测到按下退出则执行下一条
pygame.quit() #退出窗口
sys.exit() #退出整个程序
if event.type == ADD_ENEMY:
enemies.append(Enemy())
player.move()
for enemy in enemies:
enemy.move()
screen.fill('white') #将窗口设为白色
player.draw() #调用player类的draw函数
for enemy in enemies:
enemy.draw()
pygame.display.flip() #刷新窗口
clock.tick(60) #帧率
然后再用来检测sprite与组Group()之间的碰撞
for enemy in enemies:
if enemy.rect.colliderect(player.rect):
pygame.quit() #检测到碰撞就退出游戏
sys.exit()
计分板
先创建一个score变量, 然后渲染文字
score = 0
my_font = pygame.font.SysFont(None, 16)
# 参数分别为 显示内容、是否消除锯齿、字体颜色
text = my_font.render(f"分数:{scroe}", True, 'black')
然后再用blit渲染到屏幕上,最后根据个人喜好,微调数据,就可以得到一款小游戏了
import pygame
import sys
import random
import tkinter.messagebox as msgbox
pygame.init()
width = 500
height = 500
size = width, height
score = 0
ADD_ENEMY = pygame.USEREVENT
pygame.time.set_timer(ADD_ENEMY, 500) #过0.3秒执行一次,单位毫秒
screen = pygame.display.set_mode((size))
pygame.display.set_caption('躲避方块')
my_font = pygame.font.SysFont(None, 20)
class Player(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.surface = pygame.surface.Surface((50, 50)) #创建玩家的外观
self.surface.fill('blue') #设置Player的颜色
self.rect = self.surface.get_rect() #玩家位置
def draw(self):
screen.blit(self.surface, self.rect)
def move(self):
#玩家移动
self.speed = 5
p = pygame.key.get_pressed()
if p[pygame.K_UP]:
self.rect.top -= self.speed
if p[pygame.K_DOWN]:
self.rect.top += self.speed
if p[pygame.K_RIGHT]:
self.rect.right += self.speed
if p[pygame.K_LEFT]:
self.rect.right -= self.speed
#限制移动范围
if self.rect.right >= width:
self.rect.right -= self.speed
if self.rect.left <= 0:
self.rect.right += self.speed
if self.rect.bottom >= height:
self.rect.top -= self.speed
if self.rect.top <= 0:
self.rect.top += self.speed
class Enemy(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.surface = pygame.surface.Surface((30, 30)) #创建敌人的外观
self.surface.fill('red') #设置Enemy的颜色
self.rect = self.surface.get_rect(x=random.randint(width + 10, width + 50), y=random.randint(0, height)) #随机敌人位置
def draw(self):
screen.blit(self.surface, self.rect)
def move(self):
self.speed = 5
self.rect.right -= self.speed
clock = pygame.time.Clock()
player = Player() #实例化玩家类
enemies = pygame.sprite.Group()
while True: #设置一个循环
score += 1
# 参数分别为 显示内容、是否消除锯齿、字体颜色
text = my_font.render(f"score:{score}", True, 'black')
for event in pygame.event.get(): #事件检测
if event.type == pygame.QUIT: #如果检测到按下退出则执行下一条
pygame.quit() #退出窗口
sys.exit() #退出整个程序
if event.type == ADD_ENEMY:
enemies.add(Enemy())
for enemy in enemies:
if enemy.rect.colliderect(player.rect):
msgbox.showinfo('你失败了', f'你失败了,分数{score}')
pygame.quit()
sys.exit()
player.move()
for enemy in enemies:
enemy.move()
screen.fill('white') #将窗口设为白色
player.draw() #调用player类的draw函数
for enemy in enemies:
enemy.draw()
screen.blit(text, (10, 10))
pygame.display.flip() #刷新窗口
clock.tick(60) #帧率
运行效果: