使用 pygame 的 8 位游戏
Pygame 是一个Python库,可专门用于设计和构建游戏。 Pygame 仅支持使用不同精灵构建的 2d 游戏。 Pygame 并不是特别适合设计游戏,因为它使用起来非常复杂,没有像 unity 这样的适当 GUI,但它确实为更复杂的项目构建了逻辑。
我们将使用以下规则创建一个简单的游戏:-
- 玩家只能垂直移动。
- 除了玩家块之外,还有另外两个块。
- 其中之一将是敌人块,其中之一将是得分块。
- 如果玩家与敌方方块发生碰撞,则会弹出游戏结束屏幕,如果玩家与得分块发生碰撞,则分数会增加,并且必须收集所有得分块。
我们将使用各种技术,例如函数的使用、随机变量、各种 pygame 函数等。
安装
在初始化 pygame 库之前,我们需要安装它。要安装它,请在终端中键入以下命令。
pip install pygame
安装 pygame 库后,我们需要编写以下代码来初始化 pygame 库:-
import pygame
pygame.init()
这些行非常不言自明。 pygame.init()函数启动 pygame 库。
然后我们需要初始化我们想要放置块的屏幕。这可以通过编写以下行来完成:-
res = (720, 720)
screen = pygame.display.set_mode(res)
元组 res 包含两个值,它们将定义我们游戏的分辨率。然后我们需要定义另一个变量 screen 来实际充当我们的工作台。这可以通过使用 pygame.display.set_mode((arg, arg)) 来完成。元组 (arg, arg) 可以存储到变量 res 中以减少处理器负载。
现在我们需要在运行代码时弹出一个实际的屏幕,这可以通过 for 和 while 循环以下列方式完成:-
while True:
for ev in pygame.event.get():
if ev.type==pygame.QUIT:
pygame.quit()
此处使用的 while 循环运行直到条件为真。我们在 pygame.event 中定义了一个变量 ev。现在,如果用户单击窗口的十字按钮,则条件变为 false,while 循环结束,终止当前窗口。
下面是实现。
Python3
# Python program to demonstrate
# 8 bit game
import pygame
import sys
import random
# initialize the constructor
pygame.init()
res = (720, 720)
# randomly assigns a value to variables
# ranging from lower limit to upper
c1 = random.randint(125, 255)
c2 = random.randint(0, 255)
c3 = random.randint(0, 255)
screen = pygame.display.set_mode(res)
clock = pygame.time.Clock()
red = (255, 0, 0)
green = (0, 255, 0)
blue = (0, 0, 255)
color_list = [red, green, blue]
colox_c1 = 0
colox_c2 = 0
colox_c3 = 254
colox_c4 = 254
# randomly assigns a colour from color_list
# to player
player_c = random.choice(color_list)
# light shade of menu buttons
startl = (169, 169, 169)
# dark shade of menu buttons
startd = (100, 100, 100)
white = (255, 255, 255)
start = (255, 255, 255)
width = screen.get_width()
height = screen.get_height()
# initial X position of player
lead_x = 40
# initial y position of player
lead_y = height / 2
x = 300
y = 290
width1 = 100
height1 = 40
enemy_size = 50
# defining a font
smallfont = pygame.font.SysFont('Corbel', 35)
# texts to be rendered on screen
text = smallfont.render('Start', True, white)
text1 = smallfont.render('Options', True, white)
exit1 = smallfont.render('Exit', True, white)
# game title
colox = smallfont.render('Colox', True, (c3, c2, c1))
x1 = random.randint(width / 2, width)
y1 = random.randint(100, height / 2)
x2 = 40
y2 = 40
speed = 15
# score of the player
count = 0
rgb = random.choice(color_list)
# enemy position
e_p = [width, random.randint(50, height - 50)]
e1_p = [random.randint(width, width + 100), random.randint(50, height
- 100)]
# function for game_over
def game_over():
while True:
# if the player clicks the cross
# button
for ev in pygame.event.get():
if ev.type == pygame.QUIT:
pygame.quit()
if ev.type == pygame.MOUSEBUTTONDOWN:
if 100 < mouse1[0] < 140 and height - 100 < mouse1[1] \
< height - 80:
pygame.quit()
if ev.type == pygame.MOUSEBUTTONDOWN:
if width - 180 < mouse1[0] < width - 100 and height \
- 100 < mouse1[1] < height - 80:
# calling function game
game(lead_x, lead_y, speed, count)
# fills the screen with specified colour
screen.fill((65, 25, 64))
smallfont = pygame.font.SysFont('Corbel', 60)
smallfont1 = pygame.font.SysFont('Corbel', 25)
game_over = smallfont.render('GAME OVER', True, white)
game_exit = smallfont1.render('exit', True, white)
restart = smallfont1.render('restart', True, white)
mouse1 = pygame.mouse.get_pos()
# exit
if 100 < mouse1[0] < 140 and height - 100 < mouse1[1] < height - 80:
pygame.draw.rect(screen, startl, [100, height - 100, 40,20])
else:
pygame.draw.rect(screen, startd, [100, height - 100, 40,20])
# restart
if width - 180 < mouse1[0] < width - 100 and height - 100 < mouse1[1] < height - 80:
pygame.draw.rect(screen, startl, [width - 180, height- 100, 80, 20])
else:
pygame.draw.rect(screen, startd, [width - 180, height- 100, 80, 20])
screen.blit(game_exit, (100, height - 100))
# superimposes one object on other
screen.blit(restart, (width - 180, height - 100))
screen.blit(game_over, (width / 2 - 150, 295))
# updates frames of the game
pygame.display.update()
pygame.draw.rect(screen, startd, [100, height - 100, 40, 20])
pygame.draw.rect(screen, startd, [width - 180, height - 100, 40, 50])
# function for body of the game
def game(
lead_y,
lead_X,
speed,
count,
):
while True:
for ev in pygame.event.get():
if ev.type == pygame.QUIT:
pygame.quit()
# player control
# keeps track of the key pressed
keys = pygame.key.get_pressed()
if keys[pygame.K_UP]:
# if up key is pressed then the players
# y pos will decrement by 10
lead_y -= 10
if keys[pygame.K_DOWN]:
# if down key is pressed then the y pos
# of the player is incremented by 10
lead_y += 10
screen.fill((65, 25, 64))
clock.tick(speed)
# draws a rectangle on the screen
rect = pygame.draw.rect(screen, player_c, [lead_x, lead_y, 40,40])
pygame.draw.rect(screen, (c1, c2, c3), [0, 0, width, 40])
pygame.draw.rect(screen, (c3, c2, c1), [0, 680, width, 40])
pygame.draw.rect(screen, startd, [width - 100, 0, 100, 40])
smallfont = pygame.font.SysFont('Corbel', 35)
exit2 = smallfont.render('Exit', True, white)
# exit
# gets the X and y position of mouse
# pointer and stores them as a tuple
mouse = pygame.mouse.get_pos()
if width - 100 < mouse[0] < width and 0 < mouse[1] < 40:
pygame.draw.rect(screen, startl, [width - 100, 0, 100, 40])
else:
pygame.draw.rect(screen, startd, [width - 100, 0, 100, 40])
if width - 100 < mouse[0] < width and 0 < mouse[1] < 40:
if ev.type == pygame.MOUSEBUTTONDOWN:
pygame.quit()
# enemy position
if e_p[0] > 0 and e_p[0] <= width:
# if the enemy block's X coordinate is between 0 and
# the width of the screen the X value gets
# decremented by 10
e_p[0] -= 10
else:
if e_p[1] <= 40 or e_p[1] >= height - 40:
e_p[1] = height / 2
if e1_p[1] <= 40 or e1_p[1] >= height - 40:
e1_p[1] = random.randint(40, height - 40)
e_p[1] = random.randint(enemy_size, height - enemy_size)
e_p[0] = width
# game over
# collision detection
if lead_x <= e_p[0] <= lead_x + 40 and lead_y >= e_p[1] >= lead_y - 40:
game_over()
# checks if the player block has collided with the enemy block
if lead_y <= e_p[1] + enemy_size <= lead_y + 40 and lead_x <= e_p[0] <= lead_x + 40:
game_over()
pygame.draw.rect(screen, red, [e_p[0], e_p[1], enemy_size,enemy_size])
if e1_p[0] > 0 and e1_p[0] <= width + 100:
e1_p[0] -= 10
else:
if e1_p[1] <= 40 or e1_p[1] >= height - 40:
e1_p[1] = height / 2
e1_p[1] = random.randint(enemy_size, height - 40)
e1_p[0] = width + 100
if lead_x <= e1_p[0] <= lead_x + 40 and lead_y >= e1_p[1] >= lead_y - 40:
e1_p[0] = width + 100
e1_p[1] = random.randint(40, height - 40)
count += 1
speed += 1
if lead_y <= e1_p[1] + enemy_size <= lead_y + 40 and lead_x <= e1_p[0] <= lead_x + 40:
e1_p[0] = width + 100
e1_p[1] = random.randint(40, height - 40)
# increases the score when blue box is hit
count += 1
# increases the speed as score increases
speed += 1
if count >= 45:
# freezes the game FPS to 60 if
# score reaches 45 or more
speed = 60
if lead_y <= 38 or lead_y >= height - 38:
game_over()
if e1_p[0] <= 0:
game_over()
pygame.draw.rect(screen, blue, [e1_p[0], e1_p[1], enemy_size,
enemy_size])
score1 = smallfont.render('Score:', True, white)
screen.blit(score1, (width - 120, height - 40))
screen.blit(exit2, (width - 80, 0))
pygame.display.update()
# intro
def intro(
colox_c1,
colox_c2,
colox,
exit1,
text1,
text,
):
intro = True
while intro:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
screen.fill((65, 25, 64))
mouse = pygame.mouse.get_pos()
# start screen
if x < mouse[0] < x + width1 and y < mouse[1] < y + height1:
# if mouse is hovered on a button
# its colour shade becomes lighter
pygame.draw.rect(screen, startl, [x, y, width1, height1])
else:
if x < mouse[0] < x + width1 + 40 and y + 70 < mouse[1] < y \
+ 70 + height1:
pygame.draw.rect(screen, startl, [x, y + 70, width1+40,height1])
else:
if x < mouse[0] < width1 + x and y + 140 < mouse[1] < y + 140 + height1:
pygame.draw.rect(screen, startl, [x, y + 140,width1,height1])
else:
pygame.draw.rect(screen, startd, [x, y, width1,height1])
pygame.draw.rect(screen, startd, [x, y + 70, width1
+ 40, height1])
pygame.draw.rect(screen, startd, [x, y + 140,width1, height1])
# start button
if event.type == pygame.MOUSEBUTTONDOWN:
if x < mouse[0] < x + width1 and y < mouse[1] < y + height1:
#music()
game(lead_y, lead_x, speed, count)
if event.type == pygame.MOUSEBUTTONDOWN:
if x < mouse[0] < width1 + x and y + 140 < mouse[1] < y + 140 + height1:
pygame.quit()
# this handles the colour breezing effect
if 0 <= colox_c1 <= 254 or 0 <= colox_c2 <= 254:
colox_c1 += 1
colox_c2 += 1
if colox_c1 >= 254 or colox_c2 >= 254:
colox_c1 = c3
colox_c2 = c3
pygame.draw.rect(screen, (c2, colox_c1, colox_c2), [0, 0, 40,
height])
pygame.draw.rect(screen, (c2, colox_c1, colox_c2), [width - 40,
0, 40, height])
smallfont = pygame.font.SysFont('Corbel', 35)
sig = smallfont.render('Designed by :- Antriksh', True, white)
text = smallfont.render('Start', True, white)
text1 = smallfont.render('Options', True, white)
exit1 = smallfont.render('Exit', True, white)
colox = smallfont.render('Colox', True, (c1, colox_c1,
colox_c2))
screen.blit(colox, (312, 50))
screen.blit(text, (312, 295))
screen.blit(text1, (312, 365))
screen.blit(exit1, (312, 435))
screen.blit(sig, (320, height - 50))
clock.tick(60)
pygame.display.update()
intro(
colox_c1,
colox_c2,
colox,
exit1,
text1,
text,
)
输出: