Python?Pygame實(shí)戰(zhàn)之五款童年經(jīng)典游戲合集
更新時(shí)間:2022年04月19日 08:42:07 作者:木木子學(xué)python
本文為大家總結(jié)了五款利用Python+Pygame實(shí)現(xiàn)的童年經(jīng)典游戲:推箱子、滑雪、八分音符醬、保衛(wèi)蘿卜和飛機(jī)大戰(zhàn),快跟隨小編一起學(xué)習(xí)一下
一、推箱子
1)代碼展示
import os
import sys
import cfg
import pygame
from modules import *
from itertools import chain
'''游戲地圖'''
class gameMap():
def __init__(self, num_cols, num_rows):
self.walls = []
self.boxes = []
self.targets = []
self.num_cols = num_cols
self.num_rows = num_rows
'''增加游戲元素'''
def addElement(self, elem_type, col, row):
if elem_type == 'wall':
self.walls.append(elementSprite('wall.png', col, row, cfg))
elif elem_type == 'box':
self.boxes.append(elementSprite('box.png', col, row, cfg))
elif elem_type == 'target':
self.targets.append(elementSprite('target.png', col, row, cfg))
'''畫游戲地圖'''
def draw(self, screen):
for elem in self.elemsIter():
elem.draw(screen)
'''游戲元素迭代器'''
def elemsIter(self):
for elem in chain(self.targets, self.walls, self.boxes):
yield elem
'''該關(guān)卡中所有的箱子是否都在指定位置, 在的話就是通關(guān)了'''
def levelCompleted(self):
for box in self.boxes:
is_match = False
for target in self.targets:
if box.col == target.col and box.row == target.row:
is_match = True
break
if not is_match:
return False
return True
'''某位置是否可到達(dá)'''
def isValidPos(self, col, row):
if col >= 0 and row >= 0 and col < self.num_cols and row < self.num_rows:
block_size = cfg.BLOCKSIZE
temp1 = self.walls + self.boxes
temp2 = pygame.Rect(col * block_size, row * block_size, block_size, block_size)
return temp2.collidelist(temp1) == -1
else:
return False
'''獲得某位置的box'''
def getBox(self, col, row):
for box in self.boxes:
if box.col == col and box.row == row:
return box
return None
'''游戲界面'''
class gameInterface():
def __init__(self, screen):
self.screen = screen
self.levels_path = cfg.LEVELDIR
self.initGame()
'''導(dǎo)入關(guān)卡地圖'''
def loadLevel(self, game_level):
with open(os.path.join(self.levels_path, game_level), 'r') as f:
lines = f.readlines()
# 游戲地圖
self.game_map = gameMap(max([len(line) for line in lines]) - 1, len(lines))
# 游戲surface
height = cfg.BLOCKSIZE * self.game_map.num_rows
width = cfg.BLOCKSIZE * self.game_map.num_cols
self.game_surface = pygame.Surface((width, height))
self.game_surface.fill(cfg.BACKGROUNDCOLOR)
self.game_surface_blank = self.game_surface.copy()
for row, elems in enumerate(lines):
for col, elem in enumerate(elems):
if elem == 'p':
self.player = pusherSprite(col, row, cfg)
elif elem == '*':
self.game_map.addElement('wall', col, row)
elif elem == '#':
self.game_map.addElement('box', col, row)
elif elem == 'o':
self.game_map.addElement('target', col, row)
'''游戲初始化'''
def initGame(self):
self.scroll_x = 0
self.scroll_y = 0
'''將游戲界面畫出來'''
def draw(self, *elems):
self.scroll()
self.game_surface.blit(self.game_surface_blank, dest=(0, 0))
for elem in elems:
elem.draw(self.game_surface)
self.screen.blit(self.game_surface, dest=(self.scroll_x, self.scroll_y))
'''因?yàn)橛螒蚪缑婷娣e>游戲窗口界面, 所以需要根據(jù)人物位置滾動(dòng)'''
def scroll(self):
x, y = self.player.rect.center
width = self.game_surface.get_rect().w
height = self.game_surface.get_rect().h
if (x + cfg.SCREENSIZE[0] // 2) > cfg.SCREENSIZE[0]:
if -1 * self.scroll_x + cfg.SCREENSIZE[0] < width:
self.scroll_x -= 2
elif (x + cfg.SCREENSIZE[0] // 2) > 0:
if self.scroll_x < 0:
self.scroll_x += 2
if (y + cfg.SCREENSIZE[1] // 2) > cfg.SCREENSIZE[1]:
if -1 * self.scroll_y + cfg.SCREENSIZE[1] < height:
self.scroll_y -= 2
elif (y + 250) > 0:
if self.scroll_y < 0:
self.scroll_y += 2
'''某一關(guān)卡的游戲主循環(huán)'''
def runGame(screen, game_level):
clock = pygame.time.Clock()
game_interface = gameInterface(screen)
game_interface.loadLevel(game_level)
font_path = os.path.join(cfg.FONTDIR, 'simkai.ttf')
text = '按R鍵重新開始本關(guān)'
font = pygame.font.Font(font_path, 15)
text_render = font.render(text, 1, (255, 255, 255))
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit(0)
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
next_pos = game_interface.player.move('left', is_test=True)
if game_interface.game_map.isValidPos(*next_pos):
game_interface.player.move('left')
else:
box = game_interface.game_map.getBox(*next_pos)
if box:
next_pos = box.move('left', is_test=True)
if game_interface.game_map.isValidPos(*next_pos):
game_interface.player.move('left')
box.move('left')
break
if event.key == pygame.K_RIGHT:
next_pos = game_interface.player.move('right', is_test=True)
if game_interface.game_map.isValidPos(*next_pos):
game_interface.player.move('right')
else:
box = game_interface.game_map.getBox(*next_pos)
if box:
next_pos = box.move('right', is_test=True)
if game_interface.game_map.isValidPos(*next_pos):
game_interface.player.move('right')
box.move('right')
break
if event.key == pygame.K_DOWN:
next_pos = game_interface.player.move('down', is_test=True)
if game_interface.game_map.isValidPos(*next_pos):
game_interface.player.move('down')
else:
box = game_interface.game_map.getBox(*next_pos)
if box:
next_pos = box.move('down', is_test=True)
if game_interface.game_map.isValidPos(*next_pos):
game_interface.player.move('down')
box.move('down')
break
if event.key == pygame.K_UP:
next_pos = game_interface.player.move('up', is_test=True)
if game_interface.game_map.isValidPos(*next_pos):
game_interface.player.move('up')
else:
box = game_interface.game_map.getBox(*next_pos)
if box:
next_pos = box.move('up', is_test=True)
if game_interface.game_map.isValidPos(*next_pos):
game_interface.player.move('up')
box.move('up')
break
if event.key == pygame.K_r:
game_interface.initGame()
game_interface.loadLevel(game_level)
game_interface.draw(game_interface.player, game_interface.game_map)
if game_interface.game_map.levelCompleted():
return
screen.blit(text_render, (5, 5))
pygame.display.flip()
clock.tick(100)
'''主函數(shù)'''
def main():
pygame.init()
pygame.mixer.init()
pygame.display.set_caption('推箱子 —— 源碼基地:#959755565#')
screen = pygame.display.set_mode(cfg.SCREENSIZE)
pygame.mixer.init()
audio_path = os.path.join(cfg.AUDIODIR, 'EineLiebe.mp3')
pygame.mixer.music.load(audio_path)
pygame.mixer.music.set_volume(0.4)
pygame.mixer.music.play(-1)
startInterface(screen, cfg)
for level_name in sorted(os.listdir(cfg.LEVELDIR)):
runGame(screen, level_name)
switchInterface(screen, cfg)
endInterface(screen, cfg)
'''run'''
if __name__ == '__main__':
main()2)效果展示

二、滑雪
1)代碼展示
import sys
import cfg
import pygame
import random
'''滑雪者類'''
class SkierClass(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
# 滑雪者的朝向(-2到2)
self.direction = 0
self.imagepaths = cfg.SKIER_IMAGE_PATHS[:-1]
self.image = pygame.image.load(self.imagepaths[self.direction])
self.rect = self.image.get_rect()
self.rect.center = [320, 100]
self.speed = [self.direction, 6-abs(self.direction)*2]
'''改變滑雪者的朝向. 負(fù)數(shù)為向左,正數(shù)為向右,0為向前'''
def turn(self, num):
self.direction += num
self.direction = max(-2, self.direction)
self.direction = min(2, self.direction)
center = self.rect.center
self.image = pygame.image.load(self.imagepaths[self.direction])
self.rect = self.image.get_rect()
self.rect.center = center
self.speed = [self.direction, 6-abs(self.direction)*2]
return self.speed
'''移動(dòng)滑雪者'''
def move(self):
self.rect.centerx += self.speed[0]
self.rect.centerx = max(20, self.rect.centerx)
self.rect.centerx = min(620, self.rect.centerx)
'''設(shè)置為摔倒?fàn)顟B(tài)'''
def setFall(self):
self.image = pygame.image.load(cfg.SKIER_IMAGE_PATHS[-1])
'''設(shè)置為站立狀態(tài)'''
def setForward(self):
self.direction = 0
self.image = pygame.image.load(self.imagepaths[self.direction])
'''
Function:
障礙物類
Input:
img_path: 障礙物圖片路徑
location: 障礙物位置
attribute: 障礙物類別屬性
'''
class ObstacleClass(pygame.sprite.Sprite):
def __init__(self, img_path, location, attribute):
pygame.sprite.Sprite.__init__(self)
self.img_path = img_path
self.image = pygame.image.load(self.img_path)
self.location = location
self.rect = self.image.get_rect()
self.rect.center = self.location
self.attribute = attribute
self.passed = False
'''移動(dòng)'''
def move(self, num):
self.rect.centery = self.location[1] - num
'''創(chuàng)建障礙物'''
def createObstacles(s, e, num=10):
obstacles = pygame.sprite.Group()
locations = []
for i in range(num):
row = random.randint(s, e)
col = random.randint(0, 9)
location = [col*64+20, row*64+20]
if location not in locations:
locations.append(location)
attribute = random.choice(list(cfg.OBSTACLE_PATHS.keys()))
img_path = cfg.OBSTACLE_PATHS[attribute]
obstacle = ObstacleClass(img_path, location, attribute)
obstacles.add(obstacle)
return obstacles
'''合并障礙物'''
def AddObstacles(obstacles0, obstacles1):
obstacles = pygame.sprite.Group()
for obstacle in obstacles0:
obstacles.add(obstacle)
for obstacle in obstacles1:
obstacles.add(obstacle)
return obstacles
'''顯示游戲開始界面'''
def ShowStartInterface(screen, screensize):
screen.fill((255, 255, 255))
tfont = pygame.font.Font(cfg.FONTPATH, screensize[0]//5)
cfont = pygame.font.Font(cfg.FONTPATH, screensize[0]//20)
title = tfont.render(u'滑雪游戲', True, (255, 0, 0))
content = cfont.render(u'按任意鍵開始游戲', True, (0, 0, 255))
trect = title.get_rect()
trect.midtop = (screensize[0]/2, screensize[1]/5)
crect = content.get_rect()
crect.midtop = (screensize[0]/2, screensize[1]/2)
screen.blit(title, trect)
screen.blit(content, crect)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
return
pygame.display.update()
'''顯示分?jǐn)?shù)'''
def showScore(screen, score, pos=(10, 10)):
font = pygame.font.Font(cfg.FONTPATH, 30)
score_text = font.render("Score: %s" % score, True, (0, 0, 0))
screen.blit(score_text, pos)
'''更新當(dāng)前幀的游戲畫面'''
def updateFrame(screen, obstacles, skier, score):
screen.fill((255, 255, 255))
obstacles.draw(screen)
screen.blit(skier.image, skier.rect)
showScore(screen, score)
pygame.display.update()
'''主程序'''
def main():
# 游戲初始化
pygame.init()
pygame.mixer.init()
pygame.mixer.music.load(cfg.BGMPATH)
pygame.mixer.music.set_volume(0.4)
pygame.mixer.music.play(-1)
# 設(shè)置屏幕
screen = pygame.display.set_mode(cfg.SCREENSIZE)
pygame.display.set_caption('滑雪大冒險(xiǎn)')
# 游戲開始界面
ShowStartInterface(screen, cfg.SCREENSIZE)
# 實(shí)例化游戲精靈
# --滑雪者
skier = SkierClass()
# --創(chuàng)建障礙物
obstacles0 = createObstacles(20, 29)
obstacles1 = createObstacles(10, 19)
obstaclesflag = 0
obstacles = AddObstacles(obstacles0, obstacles1)
# 游戲clock
clock = pygame.time.Clock()
# 記錄滑雪的距離
distance = 0
# 記錄當(dāng)前的分?jǐn)?shù)
score = 0
# 記錄當(dāng)前的速度
speed = [0, 6]
# 游戲主循環(huán)
while True:
# --事件捕獲
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT or event.key == pygame.K_a:
speed = skier.turn(-1)
elif event.key == pygame.K_RIGHT or event.key == pygame.K_d:
speed = skier.turn(1)
# --更新當(dāng)前游戲幀的數(shù)據(jù)
skier.move()
distance += speed[1]
if distance >= 640 and obstaclesflag == 0:
obstaclesflag = 1
obstacles0 = createObstacles(20, 29)
obstacles = AddObstacles(obstacles0, obstacles1)
if distance >= 1280 and obstaclesflag == 1:
obstaclesflag = 0
distance -= 1280
for obstacle in obstacles0:
obstacle.location[1] = obstacle.location[1] - 1280
obstacles1 = createObstacles(10, 19)
obstacles = AddObstacles(obstacles0, obstacles1)
for obstacle in obstacles:
obstacle.move(distance)
# --碰撞檢測(cè)
hitted_obstacles = pygame.sprite.spritecollide(skier, obstacles, False)
if hitted_obstacles:
if hitted_obstacles[0].attribute == "tree" and not hitted_obstacles[0].passed:
score -= 50
skier.setFall()
updateFrame(screen, obstacles, skier, score)
pygame.time.delay(1000)
skier.setForward()
speed = [0, 6]
hitted_obstacles[0].passed = True
elif hitted_obstacles[0].attribute == "flag" and not hitted_obstacles[0].passed:
score += 10
obstacles.remove(hitted_obstacles[0])
# --更新屏幕
updateFrame(screen, obstacles, skier, score)
clock.tick(cfg.FPS)
'''run'''
if __name__ == '__main__':
main()2)效果展示?

三、聲控把音符
1)代碼展示
import cfg
import cocos
import struct
from modules import *
from cocos.sprite import Sprite
from pyaudio import PyAudio, paInt16
'''定義聲控游戲類'''
class VCGame(cocos.layer.ColorLayer):
def __init__(self):
super(VCGame, self).__init__(255, 255, 255, 255, 800, 600)
# frames_per_buffer
self.num_samples = 1000
# 聲控條
self.vbar = Sprite(cfg.BLOCK_IMAGE_PATH)
self.vbar.position = 20, 450
self.vbar.scale_y = 0.1
self.vbar.image_anchor = 0, 0
self.add(self.vbar)
# 皮卡丘
self.pikachu = Pikachu(cfg.PIKACHU_IMAGE_PATH)
self.add(self.pikachu)
# 地面
self.floor = cocos.cocosnode.CocosNode()
self.add(self.floor)
position = 0, 100
for i in range(120):
b = Block(cfg.BLOCK_IMAGE_PATH, position)
self.floor.add(b)
position = b.x + b.width, b.height
# 聲音輸入
audio = PyAudio()
self.stream = audio.open(format=paInt16, channels=1, rate=int(audio.get_device_info_by_index(0)['defaultSampleRate']), input=True, frames_per_buffer=self.num_samples)
# 屏幕更新
self.schedule(self.update)
'''碰撞檢測(cè)'''
def collide(self):
diffx = self.pikachu.x - self.floor.x
for b in self.floor.get_children():
if (b.x <= diffx + self.pikachu.width * 0.8) and (diffx + self.pikachu.width * 0.2 <= b.x + b.width):
if self.pikachu.y < b.height:
self.pikachu.land(b.height)
break
'''定義游戲規(guī)則'''
def update(self, dt):
# 獲取每幀的音量
audio_data = self.stream.read(self.num_samples)
k = max(struct.unpack('1000h', audio_data))
self.vbar.scale_x = k / 10000.0
if k > 3000:
self.floor.x -= min((k / 20.0), 150) * dt
# 皮卡丘跳躍
if k > 8000:
self.pikachu.jump((k - 8000) / 1000.0)
# 碰撞檢測(cè)
self.collide()
'''重置'''
def reset(self):
self.floor.x = 0
'''run'''
if __name__ == '__main__':
cocos.director.director.init(caption="xiaohei Go Go Go ")
cocos.director.director.run(cocos.scene.Scene(VCGame()))2)效果展示

四、保衛(wèi)蘿卜
1)代碼展示
import sys
import cfg
import math
import random
import pygame
from modules import *
'''游戲初始化'''
def initGame():
# 初始化pygame, 設(shè)置展示窗口
pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode(cfg.SCREENSIZE)
pygame.display.set_caption('兔子')
# 加載必要的游戲素材
game_images = {}
for key, value in cfg.IMAGE_PATHS.items():
game_images[key] = pygame.image.load(value)
game_sounds = {}
for key, value in cfg.SOUNDS_PATHS.items():
if key != 'moonlight':
game_sounds[key] = pygame.mixer.Sound(value)
return screen, game_images, game_sounds
'''主函數(shù)'''
def main():
# 初始化
screen, game_images, game_sounds = initGame()
# 播放背景音樂
pygame.mixer.music.load(cfg.SOUNDS_PATHS['moonlight'])
pygame.mixer.music.play(-1, 0.0)
# 字體加載
font = pygame.font.Font(None, 24)
# 定義兔子
bunny = BunnySprite(image=game_images.get('rabbit'), position=(100, 100))
# 跟蹤玩家的精度變量, 記錄了射出的箭頭數(shù)和被擊中的獾的數(shù)量.
acc_record = [0., 0.]
# 生命值
healthvalue = 194
# 弓箭
arrow_sprites_group = pygame.sprite.Group()
# 獾
badguy_sprites_group = pygame.sprite.Group()
badguy = BadguySprite(game_images.get('badguy'), position=(640, 100))
badguy_sprites_group.add(badguy)
# 定義了一個(gè)定時(shí)器, 使得游戲里經(jīng)過一段時(shí)間后就新建一支獾
badtimer = 100
badtimer1 = 0
# 游戲主循環(huán), running變量會(huì)跟蹤游戲是否結(jié)束, exitcode變量會(huì)跟蹤玩家是否勝利.
running, exitcode = True, False
clock = pygame.time.Clock()
while running:
# --在給屏幕畫任何東西之前用黑色進(jìn)行填充
screen.fill(0)
# --添加的風(fēng)景也需要畫在屏幕上
for x in range(cfg.SCREENSIZE[0]//game_images['grass'].get_width()+1):
for y in range(cfg.SCREENSIZE[1]//game_images['grass'].get_height()+1):
screen.blit(game_images['grass'], (x*100, y*100))
for i in range(4): screen.blit(game_images['castle'], (0, 30+105*i))
# --倒計(jì)時(shí)信息
countdown_text = font.render(str((90000-pygame.time.get_ticks())//60000)+":"+str((90000-pygame.time.get_ticks())//1000%60).zfill(2), True, (0, 0, 0))
countdown_rect = countdown_text.get_rect()
countdown_rect.topright = [635, 5]
screen.blit(countdown_text, countdown_rect)
# --按鍵檢測(cè)
# ----退出與射擊
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.MOUSEBUTTONDOWN:
game_sounds['shoot'].play()
acc_record[1] += 1
mouse_pos = pygame.mouse.get_pos()
angle = math.atan2(mouse_pos[1]-(bunny.rotated_position[1]+32), mouse_pos[0]-(bunny.rotated_position[0]+26))
arrow = ArrowSprite(game_images.get('arrow'), (angle, bunny.rotated_position[0]+32, bunny.rotated_position[1]+26))
arrow_sprites_group.add(arrow)
# ----移動(dòng)兔子
key_pressed = pygame.key.get_pressed()
if key_pressed[pygame.K_w]:
bunny.move(cfg.SCREENSIZE, 'up')
elif key_pressed[pygame.K_s]:
bunny.move(cfg.SCREENSIZE, 'down')
elif key_pressed[pygame.K_a]:
bunny.move(cfg.SCREENSIZE, 'left')
elif key_pressed[pygame.K_d]:
bunny.move(cfg.SCREENSIZE, 'right')
# --更新弓箭
for arrow in arrow_sprites_group:
if arrow.update(cfg.SCREENSIZE):
arrow_sprites_group.remove(arrow)
# --更新獾
if badtimer == 0:
badguy = BadguySprite(game_images.get('badguy'), position=(640, random.randint(50, 430)))
badguy_sprites_group.add(badguy)
badtimer = 100 - (badtimer1 * 2)
badtimer1 = 20 if badtimer1>=20 else badtimer1+2
badtimer -= 1
for badguy in badguy_sprites_group:
if badguy.update():
game_sounds['hit'].play()
healthvalue -= random.randint(4, 8)
badguy_sprites_group.remove(badguy)
# --碰撞檢測(cè)
for arrow in arrow_sprites_group:
for badguy in badguy_sprites_group:
if pygame.sprite.collide_mask(arrow, badguy):
game_sounds['enemy'].play()
arrow_sprites_group.remove(arrow)
badguy_sprites_group.remove(badguy)
acc_record[0] += 1
# --畫出弓箭
arrow_sprites_group.draw(screen)
# --畫出獾
badguy_sprites_group.draw(screen)
# --畫出兔子
bunny.draw(screen, pygame.mouse.get_pos())
# --畫出城堡健康值, 首先畫了一個(gè)全紅色的生命值條, 然后根據(jù)城堡的生命值往生命條里面添加綠色.
screen.blit(game_images.get('healthbar'), (5, 5))
for i in range(healthvalue):
screen.blit(game_images.get('health'), (i+8, 8))
# --判斷游戲是否結(jié)束
if pygame.time.get_ticks() >= 90000:
running, exitcode = False, True
if healthvalue <= 0:
running, exitcode = False, False
# --更新屏幕
pygame.display.flip()
clock.tick(cfg.FPS)
# 計(jì)算準(zhǔn)確率
accuracy = acc_record[0] / acc_record[1] * 100 if acc_record[1] > 0 else 0
accuracy = '%.2f' % accuracy
showEndGameInterface(screen, exitcode, accuracy, game_images)
'''run'''
if __name__ == '__main__':
main()2)效果展示?

五、飛機(jī)大戰(zhàn)
1)代碼展示
import sys
import cfg
import pygame
from modules import *
'''游戲界面'''
def GamingInterface(num_player, screen):
# 初始化
pygame.mixer.music.load(cfg.SOUNDPATHS['Cool Space Music'])
pygame.mixer.music.set_volume(0.4)
pygame.mixer.music.play(-1)
explosion_sound = pygame.mixer.Sound(cfg.SOUNDPATHS['boom'])
fire_sound = pygame.mixer.Sound(cfg.SOUNDPATHS['shot'])
font = pygame.font.Font(cfg.FONTPATH, 20)
# 游戲背景圖
bg_imgs = [cfg.IMAGEPATHS['bg_big'], cfg.IMAGEPATHS['seamless_space'], cfg.IMAGEPATHS['space3']]
bg_move_dis = 0
bg_1 = pygame.image.load(bg_imgs[0]).convert()
bg_2 = pygame.image.load(bg_imgs[1]).convert()
bg_3 = pygame.image.load(bg_imgs[2]).convert()
# 玩家, 子彈和小行星精靈組
player_group = pygame.sprite.Group()
bullet_group = pygame.sprite.Group()
asteroid_group = pygame.sprite.Group()
# 產(chǎn)生小行星的時(shí)間間隔
asteroid_ticks = 90
for i in range(num_player):
player_group.add(Ship(i+1, cfg))
clock = pygame.time.Clock()
# 分?jǐn)?shù)
score_1, score_2 = 0, 0
# 游戲主循環(huán)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
# --玩家一: ↑↓←→控制, j射擊; 玩家二: wsad控制, 空格射擊
pressed_keys = pygame.key.get_pressed()
for idx, player in enumerate(player_group):
direction = None
if idx == 0:
if pressed_keys[pygame.K_UP]:
direction = 'up'
elif pressed_keys[pygame.K_DOWN]:
direction = 'down'
elif pressed_keys[pygame.K_LEFT]:
direction = 'left'
elif pressed_keys[pygame.K_RIGHT]:
direction = 'right'
if direction:
player.move(direction)
if pressed_keys[pygame.K_j]:
if player.cooling_time == 0:
fire_sound.play()
bullet_group.add(player.shot())
player.cooling_time = 20
elif idx == 1:
if pressed_keys[pygame.K_w]:
direction = 'up'
elif pressed_keys[pygame.K_s]:
direction = 'down'
elif pressed_keys[pygame.K_a]:
direction = 'left'
elif pressed_keys[pygame.K_d]:
direction = 'right'
if direction:
player.move(direction)
if pressed_keys[pygame.K_SPACE]:
if player.cooling_time == 0:
fire_sound.play()
bullet_group.add(player.shot())
player.cooling_time = 20
if player.cooling_time > 0:
player.cooling_time -= 1
if (score_1 + score_2) < 500:
background = bg_1
elif (score_1 + score_2) < 1500:
background = bg_2
else:
background = bg_3
# --向下移動(dòng)背景圖實(shí)現(xiàn)飛船向上移動(dòng)的效果
screen.blit(background, (0, -background.get_rect().height + bg_move_dis))
screen.blit(background, (0, bg_move_dis))
bg_move_dis = (bg_move_dis + 2) % background.get_rect().height
# --生成小行星
if asteroid_ticks == 0:
asteroid_ticks = 90
asteroid_group.add(Asteroid(cfg))
else:
asteroid_ticks -= 1
# --畫飛船
for player in player_group:
if pygame.sprite.spritecollide(player, asteroid_group, True, None):
player.explode_step = 1
explosion_sound.play()
elif player.explode_step > 0:
if player.explode_step > 3:
player_group.remove(player)
if len(player_group) == 0:
return
else:
player.explode(screen)
else:
player.draw(screen)
# --畫子彈
for bullet in bullet_group:
bullet.move()
if pygame.sprite.spritecollide(bullet, asteroid_group, True, None):
bullet_group.remove(bullet)
if bullet.player_idx == 1:
score_1 += 1
else:
score_2 += 1
else:
bullet.draw(screen)
# --畫小行星
for asteroid in asteroid_group:
asteroid.move()
asteroid.rotate()
asteroid.draw(screen)
# --顯示分?jǐn)?shù)
score_1_text = '玩家一得分: %s' % score_1
score_2_text = '玩家二得分: %s' % score_2
text_1 = font.render(score_1_text, True, (0, 0, 255))
text_2 = font.render(score_2_text, True, (255, 0, 0))
screen.blit(text_1, (2, 5))
screen.blit(text_2, (2, 35))
# --屏幕刷新
pygame.display.update()
clock.tick(60)
'''主函數(shù)'''
def main():
pygame.init()
pygame.font.init()
pygame.mixer.init()
screen = pygame.display.set_mode(cfg.SCREENSIZE)
pygame.display.set_caption('簡(jiǎn)易版——飛機(jī)大戰(zhàn) ')
num_player = StartInterface(screen, cfg)
if num_player == 1:
while True:
GamingInterface(num_player=1, screen=screen)
EndInterface(screen, cfg)
else:
while True:
GamingInterface(num_player=2, screen=screen)
EndInterface(screen, cfg)
'''run'''
if __name__ == '__main__':
main()2)效果展示

以上就是Python Pygame實(shí)戰(zhàn)之五款童年經(jīng)典游戲合集的詳細(xì)內(nèi)容,更多關(guān)于Python Pygame游戲的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
您可能感興趣的文章:
- 基于python?的Pygame最小開發(fā)框架
- 基于Python+Pygame實(shí)現(xiàn)經(jīng)典賽車游戲
- Python Pygame實(shí)戰(zhàn)之飛機(jī)大戰(zhàn)的實(shí)現(xiàn)
- Python Pygame實(shí)戰(zhàn)之塔防游戲的實(shí)現(xiàn)
- Python Pygame實(shí)戰(zhàn)之賽車游戲的實(shí)現(xiàn)
- Python Pygame實(shí)戰(zhàn)之水果忍者游戲的實(shí)現(xiàn)
- 基于Python利用Pygame實(shí)現(xiàn)翻轉(zhuǎn)圖像
- Python+Pygame制作"長(zhǎng)沙版"大富翁
- python中的pygame實(shí)現(xiàn)接球小游戲
相關(guān)文章
python機(jī)器學(xué)習(xí)高數(shù)篇之函數(shù)極限與導(dǎo)數(shù)
這篇文章主要介紹了python機(jī)器學(xué)習(xí)高數(shù)篇之函數(shù)極限和導(dǎo)數(shù),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08
PyTorch開源圖像分類工具箱MMClassification詳解
MMClassification是一款基于PyTorch的開源圖像分類工具箱,集成了常用的圖像分類網(wǎng)絡(luò),將數(shù)據(jù)加載,模型骨架,訓(xùn)練調(diào)參,流程等封裝為模塊調(diào)用,便于在模型間進(jìn)行轉(zhuǎn)換和比較,也高效簡(jiǎn)潔的實(shí)現(xiàn)了參數(shù)調(diào)整2022-09-09
python實(shí)現(xiàn)簡(jiǎn)單文件讀寫函數(shù)
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)簡(jiǎn)單文件讀寫函數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-02-02

