【pygame游戏开发】这几个经典游戏,勾起了少年的快乐
前言
嗨喽,大家好呀~这里是爱看美女的茜茜呐
今天给大家分享几个好玩有趣的小游戏,
既提升了学习的兴趣,又提升了学习效率,告别枯燥的学习。
代码软件:
-
python 3.8: 解释器
-
pycharm: 代码编辑器
一、飞机大战
1. 所需素材
字体
图片
音乐
2. 源码部分
模块导入
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 = 0bg_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()# 产生小行星的时间间隔asteroid_ticks = 90for i in range(num_player):player_group.add(Ship(i+1, cfg))clock = pygame.time.Clock()# 分数score_1, score_2 = 0, 0# 游戏主循环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 = Noneif 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 = 20elif 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 = 20if player.cooling_time > 0:player.cooling_time -= 1if (score_1 + score_2) < 500:background = bg_1elif (score_1 + score_2) < 1500:background = bg_2else:background = bg_3# --向下移动背景图实现飞船向上移动的效果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 = 90asteroid_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 = 1explosion_sound.play()elif player.explode_step > 0:if player.explode_step > 3:player_group.remove(player)if len(player_group) == 0:returnelse: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 += 1else:score_2 += 1else:bullet.draw(screen)# --画小行星for asteroid in asteroid_group:asteroid.move()asteroid.rotate()asteroid.draw(screen)# --显示分数score_1_text = '玩家一得分: %s' % score_1score_2_text = '玩家二得分: %s' % score_2text_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)
主函数
def main():pygame.init()pygame.font.init()pygame.mixer.init()screen = pygame.display.set_mode(cfg.SCREENSIZE)pygame.display.set_caption('飞机大战 —— 九歌')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)
3. 效果展示
二、打地鼠
素材获取点击跳转名片领取
1. 所需素材
字体
图片
音乐
2. 代码部分
模块导入
import cfg
import pygame
import random
from modules.sprites.mole import *
from modules.sprites.hammer import *
from modules.interfaces.endinterface import *
from modules.interfaces.startinterface import *
游戏初始化
def initGame():pygame.init()pygame.mixer.init()screen = pygame.display.set_mode(cfg.SCREENSIZE)pygame.display.set_caption('Whac A Mole-青灯教育')return screen
主函数
def main():# 初始化screen = initGame()# 加载背景音乐和其他音效pygame.mixer.music.load(cfg.BGM_PATH)pygame.mixer.music.play(-1)audios = {'count_down': pygame.mixer.Sound(cfg.COUNT_DOWN_SOUND_PATH),'hammering': pygame.mixer.Sound(cfg.HAMMERING_SOUND_PATH)}# 加载字体font = pygame.font.Font(cfg.FONT_PATH, 40)# 加载背景图片bg_img = pygame.image.load(cfg.GAME_BG_IMAGEPATH)# 开始界面startInterface(screen, cfg.GAME_BEGIN_IMAGEPATHS)# 地鼠改变位置的计时hole_pos = random.choice(cfg.HOLE_POSITIONS)change_hole_event = pygame.USEREVENTpygame.time.set_timer(change_hole_event, 800)# 地鼠mole = Mole(cfg.MOLE_IMAGEPATHS, hole_pos)# 锤子hammer = Hammer(cfg.HAMMER_IMAGEPATHS, (500, 250))# 时钟clock = pygame.time.Clock()# 分数your_score = 0flag = False# 初始时间init_time = pygame.time.get_ticks()# 游戏主循环while True:# --游戏时间为60stime_remain = round((61000 - (pygame.time.get_ticks() - init_time)) / 1000.)# --游戏时间减少, 地鼠变位置速度变快if time_remain == 40 and not flag:hole_pos = random.choice(cfg.HOLE_POSITIONS)mole.reset()mole.setPosition(hole_pos)pygame.time.set_timer(change_hole_event, 650)flag = Trueelif time_remain == 20 and flag:hole_pos = random.choice(cfg.HOLE_POSITIONS)mole.reset()mole.setPosition(hole_pos)pygame.time.set_timer(change_hole_event, 500)flag = False# --倒计时音效if time_remain == 10:audios['count_down'].play()# --游戏结束if time_remain < 0: breakcount_down_text = font.render('Time: '+str(time_remain), True, cfg.WHITE)# --按键检测for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()elif event.type == pygame.MOUSEMOTION:hammer.setPosition(pygame.mouse.get_pos())elif event.type == pygame.MOUSEBUTTONDOWN:if event.button == 1:hammer.setHammering()elif event.type == change_hole_event:hole_pos = random.choice(cfg.HOLE_POSITIONS)mole.reset()mole.setPosition(hole_pos)# --碰撞检测if hammer.is_hammering and not mole.is_hammer:is_hammer = pygame.sprite.collide_mask(hammer, mole)if is_hammer:audios['hammering'].play()mole.setBeHammered()your_score += 10# --分数your_score_text = font.render('Score: '+str(your_score), True, cfg.BROWN)# --绑定必要的游戏元素到屏幕(注意顺序)screen.blit(bg_img, (0, 0))screen.blit(count_down_text, (875, 8))screen.blit(your_score_text, (800, 430))mole.draw(screen)hammer.draw(screen)# --更新pygame.display.flip()clock.tick(60)# 读取最佳分数(try块避免第一次游戏无.rec文件)try:best_score = int(open(cfg.RECORD_PATH).read())except:best_score = 0# 若当前分数大于最佳分数则更新最佳分数if your_score > best_score:f = open(cfg.RECORD_PATH, 'w')f.write(str(your_score))f.close()# 结束界面score_info = {'your_score': your_score, 'best_score': best_score}is_restart = endInterface(screen, cfg.GAME_END_IMAGEPATH, cfg.GAME_AGAIN_IMAGEPATHS, score_info, cfg.FONT_PATH, [cfg.WHITE, cfg.RED], cfg.SCREENSIZE)return is_restart
3. 效果展示
三、打乒乓
素材获取点击跳转名片领取
1. 所需素材
字体
图片
音乐
2. 代码部分
import os
import cfg
import sys
import pygame
import random
from modules import *
游戏初始化
def initGame():# 初始化pygame, 设置展示窗口pygame.init()screen = pygame.display.set_mode(cfg.SCREENSIZE)pygame.display.set_caption('catch coins —— 九歌')# 加载必要的游戏素材game_images = {}for key, value in cfg.IMAGE_PATHS.items():if isinstance(value, list):images = []for item in value: images.append(pygame.image.load(item))game_images[key] = imageselse:game_images[key] = pygame.image.load(value)game_sounds = {}for key, value in cfg.AUDIO_PATHS.items():if key == 'bgm': continuegame_sounds[key] = pygame.mixer.Sound(value)# 返回初始化数据return screen, game_images, game_sounds
主函数
def main():# 初始化screen, game_images, game_sounds = initGame()# 播放背景音乐pygame.mixer.music.load(cfg.AUDIO_PATHS['bgm'])pygame.mixer.music.play(-1, 0.0)# 字体加载font = pygame.font.Font(cfg.FONT_PATH, 40)# 定义herohero = Hero(game_images['hero'], position=(375, 520))# 定义食物组food_sprites_group = pygame.sprite.Group()generate_food_freq = random.randint(10, 20)generate_food_count = 0# 当前分数/历史最高分score = 0highest_score = 0 if not os.path.exists(cfg.HIGHEST_SCORE_RECORD_FILEPATH) else int(open(cfg.HIGHEST_SCORE_RECORD_FILEPATH).read())# 游戏主循环clock = pygame.time.Clock()while True:# --填充背景screen.fill(0)screen.blit(game_images['background'], (0, 0))# --倒计时信息countdown_text = 'Count down: ' + str((90000 - pygame.time.get_ticks()) // 60000) + ":" + str((90000 - pygame.time.get_ticks()) // 1000 % 60).zfill(2)countdown_text = font.render(countdown_text, True, (0, 0, 0))countdown_rect = countdown_text.get_rect()countdown_rect.topright = [cfg.SCREENSIZE[0]-30, 5]screen.blit(countdown_text, countdown_rect)# --按键检测for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()key_pressed = pygame.key.get_pressed()if key_pressed[pygame.K_a] or key_pressed[pygame.K_LEFT]:hero.move(cfg.SCREENSIZE, 'left')if key_pressed[pygame.K_d] or key_pressed[pygame.K_RIGHT]:hero.move(cfg.SCREENSIZE, 'right')# --随机生成食物generate_food_count += 1if generate_food_count > generate_food_freq:generate_food_freq = random.randint(10, 20)generate_food_count = 0food = Food(game_images, random.choice(['gold',] * 10 + ['apple']), cfg.SCREENSIZE)food_sprites_group.add(food)# --更新食物for food in food_sprites_group:if food.update(): food_sprites_group.remove(food)# --碰撞检测for food in food_sprites_group:if pygame.sprite.collide_mask(food, hero):game_sounds['get'].play()food_sprites_group.remove(food)score += food.scoreif score > highest_score: highest_score = score# --画herohero.draw(screen)# --画食物food_sprites_group.draw(screen)# --显示得分score_text = f'Score: {score}, Highest: {highest_score}'score_text = font.render(score_text, True, (0, 0, 0))score_rect = score_text.get_rect()score_rect.topleft = [5, 5]screen.blit(score_text, score_rect)# --判断游戏是否结束if pygame.time.get_ticks() >= 90000:break# --更新屏幕pygame.display.flip()clock.tick(cfg.FPS)# 游戏结束, 记录最高分并显示游戏结束画面fp = open(cfg.HIGHEST_SCORE_RECORD_FILEPATH, 'w')fp.write(str(highest_score))fp.close()return showEndGameInterface(screen, cfg, score, highest_score)
配置文件
WIDTH = 500
HEIGHT = 500
CURRPATH = os.path.abspath(os.path.dirname(__file__))
RESOURCESDIRPATH = os.path.join(CURRPATH, 'resources')
AUDIOSDIRPATH = os.path.join(RESOURCESDIRPATH, 'audios')
FONTDIRPATH = os.path.join(RESOURCESDIRPATH, 'font')
IMAGESDIRPATH = os.path.join(RESOURCESDIRPATH, 'images')
BALLPICPATH = os.path.join(IMAGESDIRPATH, 'ball.png')
RACKETPICPATH = os.path.join(IMAGESDIRPATH, 'racket.png')
FONTPATH = os.path.join(FONTDIRPATH, 'font.TTF')
GOALSOUNDPATH = os.path.join(AUDIOSDIRPATH, 'goal.wav')
HITSOUNDPATH = os.path.join(AUDIOSDIRPATH, 'hit.wav')
BGMPATH = os.path.join(AUDIOSDIRPATH, 'bgm.mp3')
WHITE = (255, 255, 255)
3. 效果展示
四、吃金币
1. 所需素材
字体
图片
音乐
2. 代码部分
导入模块
import os
import cfg
import sys
import pygame
import random
from modules import *
游戏初始化
def initGame():# 初始化pygame, 设置展示窗口pygame.init()screen = pygame.display.set_mode(cfg.SCREENSIZE)pygame.display.set_caption('catch coins —— 九歌')# 加载必要的游戏素材game_images = {}for key, value in cfg.IMAGE_PATHS.items():if isinstance(value, list):images = []for item in value: images.append(pygame.image.load(item))game_images[key] = imageselse:game_images[key] = pygame.image.load(value)game_sounds = {}for key, value in cfg.AUDIO_PATHS.items():if key == 'bgm': continuegame_sounds[key] = pygame.mixer.Sound(value)# 返回初始化数据return screen, game_images, game_sounds
主函数
def main():# 初始化screen, game_images, game_sounds = initGame()# 播放背景音乐pygame.mixer.music.load(cfg.AUDIO_PATHS['bgm'])pygame.mixer.music.play(-1, 0.0)# 字体加载font = pygame.font.Font(cfg.FONT_PATH, 40)# 定义herohero = Hero(game_images['hero'], position=(375, 520))# 定义食物组food_sprites_group = pygame.sprite.Group()generate_food_freq = random.randint(10, 20)generate_food_count = 0# 当前分数/历史最高分score = 0highest_score = 0 if not os.path.exists(cfg.HIGHEST_SCORE_RECORD_FILEPATH) else int(open(cfg.HIGHEST_SCORE_RECORD_FILEPATH).read())# 游戏主循环clock = pygame.time.Clock()while True:# --填充背景screen.fill(0)screen.blit(game_images['background'], (0, 0))# --倒计时信息countdown_text = 'Count down: ' + str((90000 - pygame.time.get_ticks()) // 60000) + ":" + str((90000 - pygame.time.get_ticks()) // 1000 % 60).zfill(2)countdown_text = font.render(countdown_text, True, (0, 0, 0))countdown_rect = countdown_text.get_rect()countdown_rect.topright = [cfg.SCREENSIZE[0]-30, 5]screen.blit(countdown_text, countdown_rect)# --按键检测for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()key_pressed = pygame.key.get_pressed()if key_pressed[pygame.K_a] or key_pressed[pygame.K_LEFT]:hero.move(cfg.SCREENSIZE, 'left')if key_pressed[pygame.K_d] or key_pressed[pygame.K_RIGHT]:hero.move(cfg.SCREENSIZE, 'right')# --随机生成食物generate_food_count += 1if generate_food_count > generate_food_freq:generate_food_freq = random.randint(10, 20)generate_food_count = 0food = Food(game_images, random.choice(['gold',] * 10 + ['apple']), cfg.SCREENSIZE)food_sprites_group.add(food)# --更新食物for food in food_sprites_group:if food.update(): food_sprites_group.remove(food)# --碰撞检测for food in food_sprites_group:if pygame.sprite.collide_mask(food, hero):game_sounds['get'].play()food_sprites_group.remove(food)score += food.scoreif score > highest_score: highest_score = score# --画herohero.draw(screen)# --画食物food_sprites_group.draw(screen)# --显示得分score_text = f'Score: {score}, Highest: {highest_score}'score_text = font.render(score_text, True, (0, 0, 0))score_rect = score_text.get_rect()score_rect.topleft = [5, 5]screen.blit(score_text, score_rect)# --判断游戏是否结束if pygame.time.get_ticks() >= 90000:break# --更新屏幕pygame.display.flip()clock.tick(cfg.FPS)# 游戏结束, 记录最高分并显示游戏结束画面fp = open(cfg.HIGHEST_SCORE_RECORD_FILEPATH, 'w')fp.write(str(highest_score))fp.close()return showEndGameInterface(screen, cfg, score, highest_score)
3. 效果展示
五、消消乐
1. 所需素材
图片素材
音频素材
2. 代码
导入模块
import pygame
import random
from pygame.locals import *
游戏音乐设置
class SoundPlay:game_bgm = "sound/GameSceneBGM.ogg"world_bgm = 'sound/WorldSceneBGM.ogg'eliminate = ('sound/eliminate1.ogg', 'sound/eliminate2.ogg', 'sound/eliminate3.ogg', 'sound/eliminate4.ogg',\\'sound/eliminate5.ogg') # 消除声音score_level = ('sound/good.ogg', 'sound/great.ogg', 'sound/amazing.ogg', 'sound/excellent.ogg',\\'sound/unbelievable.ogg') # 得分声音click = "sound/click.bubble.ogg" # 点击选中声音board_sound = 'sound/board.ogg' # 落板子声音click_button = 'sound/click_common_button.ogg' # 点击按钮声音money_sound = 'sound/money.ogg' # 点击银币声音ice_break = 'sound/ice_break.ogg' # 冰消除声音def __init__(self, filename, loops=0):self.sound = pygame.mixer.Sound(filename)self.sound.play(loops)
制作树类
class Tree(pygame.sprite.Sprite):"""树类"""tree = 'pic2/tree.png' # 树fruit = 'pic2/fruit.png' # 果子energy_num = 'pic2/energy_num.png' # 精力money = 'pic2/money.png' # 银币energy_buy = 'pic2/energy_buy.png' # 购买精力x, y = 340, 510h = 90position = ([x, y], [x+50, y-25], [x+105, y-45], [x-5, y-h-5], [x+55, y-25-h+10], [x+105, y-45-h], \\[x, y-h*2], [x+50+10, y-25-h*2-5], [x+105+25, y-45-h*2-14], [x+30, y-h*3-30]) # 果子坐标组energy_num_position = (15, 70) # 精力坐标energy_buy_position = (250, 400)def __init__(self, icon, position):super().__init__()self.image = pygame.image.load(icon).convert_alpha()self.rect = self.image.get_rect()self.rect.bottomleft = position # 左下角为坐标def draw(self, screen):screen.blit(self.image, self.rect)class ManagerTree:"""管理树类"""__screen_size = (900, 600)screen = pygame.display.set_mode(__screen_size, DOUBLEBUF, 32)fruit_list = []fruit_image = pygame.image.load(Tree.fruit).convert_alpha()fruit_width = fruit_image.get_width()fruit_height = fruit_image.get_height()type = 0 # 0树界面,1加精力界面energy_full = False # 精力已满标志 初始未满money_empty = False # 银币不足def load_text(self, text, position, txt_size=25, txt_color=(255, 255, 255)):my_font = pygame.font.SysFont(None, txt_size)text_screen = my_font.render(text, True, txt_color)self.screen.blit(text_screen, position)def draw_tree(self, energy_num, money_num):"""画tree"""Tree(Tree.tree, (0, 600)).draw(self.screen) # 画树Tree(Tree.energy_num, Tree.energy_num_position).draw(self.screen) # 画精力# print("energy", energy_num)if energy_num > 30:self.load_text(str(30) + '/30', (22, 55), 21)else:self.load_text(str(energy_num)+'/30', (22, 55), 21)# print("money", money_num)Tree(Tree.money, (15, 135)).draw(self.screen) # 画银币self.load_text(str(money_num), (32, 124), 21)for i in range(0, 10): # 画果子Tree(Tree.fruit, Tree.position[i]).draw(self.screen)self.load_text(str(i+1), (Tree.position[i][0]+15, Tree.position[i][1]-47))if self.type == 1:Tree(Tree.energy_buy, Tree.energy_buy_position).draw(self.screen)if self.energy_full:self.load_text("energy is full!", (430, 310), 30, (255, 0, 0))pygame.display.flip()pygame.time.delay(500)self.energy_full = Falseif self.money_empty:self.load_text("money is not enough!", (410, 310), 30, (255, 0, 0))pygame.display.flip()pygame.time.delay(500)self.money_empty = False
制作鼠标点击效果
def mouse_select(self, button, level, energy_num, money_num):"""鼠标点击"""if button.type == MOUSEBUTTONDOWN:mouse_down_x, mouse_down_y = button.posprint(button.pos)if level == 0:if self.type == 0: # 树界面for i in range(0, 10):if Tree.position[i][0] < mouse_down_x < Tree.position[i][0] + self.fruit_width \\and Tree.position[i][1] - self.fruit_height < mouse_down_y < Tree.position[i][1]:if energy_num <= 0:self.type = 1else:level = i + 1if Tree.energy_num_position[0] < mouse_down_x < Tree.energy_num_position[0]+60 \\and Tree.energy_num_position[1]-60 < mouse_down_y < Tree.energy_num_position[1]: # 精力60*60SoundPlay(SoundPlay.click)self.type = 1else: # 加精力弹窗界面if 408 < mouse_down_x < 600 and 263 < mouse_down_y < 313: # 点加精力按钮SoundPlay(SoundPlay.click_button)if money_num < 50:self.money_empty = Trueif energy_num >= 30:self.energy_full = Trueelif energy_num < 30 and money_num >= 50:energy_num += 5money_num -= 50elif 619 < mouse_down_x < 638 and 158 < mouse_down_y < 177: # 点叉号self.type = 0if button.type == MOUSEBUTTONUP:passreturn level, energy_num, money_num
制作出现元素
class Element(pygame.sprite.Sprite):""" 元素类 """# 图标元组,包括6个小动物,animal = ('pic2/fox.png', 'pic2/bear.png', 'pic2/chick.png', 'pic2/eagle.png', 'pic2/frog.png', 'pic2/cow.png')ice = 'pic2/ice.png' # 冰层brick = 'pic2/brick.png' # 砖frame = 'pic2/frame.png' # 选中框bling = ("pic2/bling1.png", "pic2/bling2.png", "pic2/bling3.png", "pic2/bling4.png", "pic2/bling5.png",\\"pic2/bling6.png", "pic2/bling7.png", "pic2/bling8.png", "pic2/bling9.png") # 消除动画ice_eli = ('pic2/ice0.png', 'pic2/ice1.png', 'pic2/ice2.png', 'pic2/ice3.png', 'pic2/ice4.png', 'pic2/ice5.png',\\'pic2/ice6.png', 'pic2/ice7.png', 'pic2/ice8.png') # 消除冰块动画# 得分图片score_level = ('pic2/good.png', 'pic2/great.png', 'pic2/amazing.png', 'pic2/excellent.png', 'pic2/unbelievable.png')none_animal = 'pic2/noneanimal.png' # 无可消除小动物stop = 'pic2/exit.png' # 暂停键stop_position = (20, 530)def __init__(self, icon, position):super().__init__()self.image = pygame.image.load(icon).convert_alpha()self.rect = self.image.get_rect()self.rect.topleft = position # 左上角坐标self.speed = [0, 0]self.init_position = positiondef move(self, speed):self.speed = speedself.rect = self.rect.move(self.speed)if self.speed[0] != 0: # 如果左右移动if abs(self.rect.left-self.init_position[0]) == self.rect[2]:self.init_position = self.rect.topleftself.speed = [0, 0]else:if abs(self.rect.top-self.init_position[1]) == self.rect[3]:self.init_position = self.rect.topleftself.speed = [0, 0]def draw(self, screen):screen.blit(self.image, self.rect)class Board(pygame.sprite.Sprite):step_board = 'pic2/step.png' # 剩余步数板子step = ('pic2/0.png', 'pic2/1.png', 'pic2/2.png', 'pic2/3.png', 'pic2/4.png', 'pic2/5.png',\\'pic2/6.png', 'pic2/7.png', 'pic2/8.png', 'pic2/9.png', )task_board = 'pic2/task.png' # 任务板子ok = 'pic2/ok.png' # ok勾# 关数板子levelBoard = ('pic2/level0.png', 'pic2/level1.png', 'pic2/level2.png', 'pic2/level3.png', 'pic2/level4.png', 'pic2/level5.png','pic2/level6.png', 'pic2/level7.png', 'pic2/level8.png', 'pic2/level9.png', 'pic2/level10.png')# xxx = 'pic2/x.png' # 叉掉test = 'pic2/test.png'success_board = 'pic2/successtest1.png' # 过关成功板子fail_board = 'pic2/failBoard.png' # 任务失败step_add = 'pic2/step_add.png' # 增加步数next = "pic2/next.png" # 下一关按钮replay = "pic2/replay.png" # 重玩图片stars = 'pic2/startest.png' # 星星图片money = 'pic2/money.png' # 银币energy = 'pic2/energ.png' # 精力button_position = [[300, 465], [500, 465]]starts_position = [[280+50, 340], [375+38, 340], [460+35, 340]]def __init__(self, icon, position):super().__init__()self.image = pygame.image.load(icon).convert_alpha()self.speed = [0, 45]self.rect = self.image.get_rect()self.rect.bottomleft = position # 左下角为坐标值def move(self):self.rect = self.rect.move(self.speed)if self.rect.bottom >= 543:self.speed = [0, -45]if self.speed == [0, -45] and self.rect.bottom <= 450:self.speed = [0, 0]def draw(self, screen):screen.blit(self.image, self.rect)
数组
class Manager:""" 数组类 """__screen_size = (900, 600)screen = pygame.display.set_mode(__screen_size, DOUBLEBUF, 32)__brick_size = 50__bg = pygame.image.load('pic2/bg.png').convert()stop_width = 63selected = [-1, -1] # 现选中[row, col]exchange_sign = -1 # 未交换标志last_sel = [-1, -1] # 上一次选中[row, col]change_value_sign = False # 是否交换值标志,初始不交换death_sign = True # 死图标志,初始不是死图boom_sel = [-1, -1] # 四连消特效小动物所在位置 row,collevel = 0 # 当前关卡数 初始第0关money = 100 # 金币energy_num = 30 # 精力值num_sign = Truetype = 2 # 0代表游戏中; 1代表完成任务,过关; -1代表步数用完,任务未完成,过关失败; 2代表未游戏状态,板子界面reset_mode = True # 是否重新布局(每关布局)init_step = 15 # 每关规定步数step = init_step # 代表游戏所剩余的步数score = 0 # 得数min = 20 # 分数中间值1max = 50 # 分数中间值2animal_num = [0, 0, 0, 0, 0, 0] # 本关消除各小动物的个数ice_num = 0success_board = Board(Board.success_board, [200, 0]) # 过关成功板fail_board = Board(Board.fail_board, [200, 0]) # 任务失败板height, width = 9, 9row, col = 5, 5ice_list = [[-1 for col in range(21)]for row in range(21)] # -1不画,1画冰animal = [[-1 for col in range(21)]for row in range(21)] # -2消除的,-1不画,0-4小动物list_x, list_y = (__screen_size[0] - 11 * __brick_size) / 2, (__screen_size[1] - 11 * __brick_size) / 2 # 矩阵坐标def __init__(self, width, height):self.height = heightself.width = widthself.list_x = (Manager.__screen_size[0] - self.width * Manager.__brick_size) / 2self.list_y = (Manager.__screen_size[1] - self.height * Manager.__brick_size) / 2self.row, self.col = Manager.xy_rc(self.list_x, self.list_y)self.list_x, self.list_y = Manager.rc_xy(self.row, self.col)self.ice_list = [[-1 for col in range(21)]for row in range(21)]self.animal = [[-1 for col in range(21)]for row in range(21)]self.reset_animal()def reset_animal(self):for row in range(self.row, self.row + self.height):for col in range(self.col, self.col + self.width):self.animal[row][col] = random.randint(0, 5)@staticmethoddef rc_xy(row, col):"""row col 转 x,y坐标"""return int(Manager.list_x + (col-Manager.col)*Manager.__brick_size), int\\(Manager.list_y+(row-Manager.row)*Manager.__brick_size)@staticmethoddef xy_rc(x, y):"""x,y坐标转row col"""return int((y-Manager.list_y)/Manager.__brick_size+Manager.row), int\\((x-Manager.list_x)/Manager.__brick_size+Manager.col)@staticmethoddef draw_brick(x, y):brick = Element(Element.brick, (x, y))Manager.screen.blit(brick.image, brick.rect)def draw_task(self, task_animal_num, which_animal, \\board_position=(400, 90), animal_position=(430, 35), txt_position=(455, 60)):
制作人物画板
"""画任务板子"""txt_size = 24txt_color = (0, 0, 0)Board(Board.task_board, board_position).draw(self.screen)if which_animal == 6:task_animal = Element(Element.ice, animal_position)else:task_animal = Element(Element.animal[which_animal], animal_position)task_animal.image = pygame.transform.smoothscale(task_animal.image, (40, 40))task_animal.draw(self.screen)if which_animal == 6:if task_animal_num-self.ice_num <= 0:Board(Board.ok, (txt_position[0], txt_position[1]+15)).draw(self.screen)else:self.load_text(str(task_animal_num-self.ice_num), txt_position, txt_size, txt_color)else:if task_animal_num - self.animal_num[which_animal] <= 0:Board(Board.ok, (txt_position[0], txt_position[1]+15)).draw(self.screen)else:self.load_text(str(task_animal_num - self.animal_num[which_animal]), txt_position, txt_size, txt_color)
3. 效果展示(仅部分)
初始页面
第一关画面
失败画面
第十关画面
尾语
感谢你观看我的文章呐~本次航班到这里就结束啦 🛬
希望本篇文章有对你带来帮助 🎉,有学习到一点知识~
躲起来的星星🍥也在努力发光,你也要努力加油(让我们一起努力叭)。
最后,宣传一下呀~👇👇👇更多源码、资料、素材、解答、交流皆点击下方名片获取呀👇👇👇