过年回家啦用python写一个宝石消消乐的游戏哄小朋友

开发工具

python版本:3.6.4

相关模块:

pygame;以及一些python自带的模块。

环境搭建

安装python并添加到环境变量,pip安装需要的相关模块即可。

原理简介

游戏规则:

玩家通过鼠标交换相邻的拼图,若交换后水平/竖直方向存在连续三个相同的拼图,则这些拼图消失,玩家得分,同时生成新的拼图以补充消失的部分,否则,交换失败,玩家不得分。玩家需要在规定时间内获取尽可能高的得分。

实现过程:

首先加载一些必要的游戏素材:

加载背景音乐:

pygame.mixer.init()
	pygame.mixer.music.load(os.path.join(ROOTDIR, "resources/audios/bg.mp3"))
	pygame.mixer.music.set_volume(0.6)
	pygame.mixer.music.play(-1)

加载音效: 

sounds = {}
	sounds['mismatch'] = pygame.mixer.Sound(os.path.join(ROOTDIR, 'resources/audios/badswap.wav'))
	sounds['match'] = []
	for i in range(6):
		sounds['match'].append(pygame.mixer.Sound(os.path.join(ROOTDIR, 'resources/audios/match%s.wav' % i)))

加载字体:

font = pygame.font.Font(os.path.join(ROOTDIR, 'resources/font.TTF'), 25)

图片加载:

gem_imgs = []
	for i in range(1, 8):
		gem_imgs.append(os.path.join(ROOTDIR, 'resources/images/gem%s.png' % i))

 接着我们就要设置一下游戏的主循环吧

主要循环:

game = gemGame(screen, sounds, font, gem_imgs)
	while True:
		score = game.start()
		flag = False

 我给大家讲一下原理:

逻辑其实很简单,就是不断检测是否有鼠标点击事件发生,如果有,则判断鼠标点击时的位置是否在某拼图块的位置区域内,若在,则选中该拼图块,否则不选中。

当有第二块拼图块被选中时,则判断两个拼图块是否满足拼图交换的条件,若满足,则交换拼图块,并获得奖励,否则不交换并取消选这两个拼图块的选中状态。

最后肯定就是设置游戏的结束和退出啦:

游戏倒计时结束后,进入游戏结束界面,界面显示用户当前得分。同时,若用户键入R键则重新开始游戏,键入ESC键则退出游戏。

游戏结束后玩家选择重开或退出:源码如下

		while True:
			for event in pygame.event.get():
				if event.type == pygame.QUIT or (event.type == pygame.KEYUP and event.key == pygame.K_ESCAPE):
					pygame.quit()
					sys.exit()
				elif event.type == pygame.KEYUP and event.key == pygame.K_r:
					flag = True
			if flag:
				break
			screen.fill((135, 206, 235))
			text0 = 'Final score: %s' % score
			text1 = 'Press <R> to restart the game.'
			text2 = 'Press <Esc> to quit the game.'
			y = 150
			for idx, text in enumerate([text0, text1, text2]):
				text_render = font.render(text, 1, (85, 65, 0))
				rect = text_render.get_rect()
				if idx == 0:
					rect.left, rect.top = (212, y)
				elif idx == 1:
					rect.left, rect.top = (122.5, y)
				else:
					rect.left, rect.top = (126.5, y)
				y += 100
				screen.blit(text_render, rect)
			pygame.display.update()
		game.reset()

 上面就是一步一步来讲代码思路理清楚的讲解啦 下面我把源码放到下面:


import os
import pygame
from utils import *
from config import *


'''游戏主程序'''
def main():
	pygame.init()
	screen = pygame.display.set_mode((WIDTH, HEIGHT))
	pygame.display.set_caption('Gemgem-Python交流群:932574150)
	# 加载背景音乐
	pygame.mixer.init()
	pygame.mixer.music.load(os.path.join(ROOTDIR, "resources/audios/bg.mp3"))
	pygame.mixer.music.set_volume(0.6)
	pygame.mixer.music.play(-1)
	# 加载音效
	sounds = {}
	sounds['mismatch'] = pygame.mixer.Sound(os.path.join(ROOTDIR, 'resources/audios/badswap.wav'))
	sounds['match'] = []
	for i in range(6):
		sounds['match'].append(pygame.mixer.Sound(os.path.join(ROOTDIR, 'resources/audios/match%s.wav' % i)))
	# 加载字体
	font = pygame.font.Font(os.path.join(ROOTDIR, 'resources/font.TTF'), 25)
	# 图片加载
	gem_imgs = []
	for i in range(1, 8):
		gem_imgs.append(os.path.join(ROOTDIR, 'resources/images/gem%s.png' % i))
	# 主循环
	game = gemGame(screen, sounds, font, gem_imgs)
	while True:
		score = game.start()
		flag = False
		# 一轮游戏结束后玩家选择重玩或者退出
		while True:
			for event in pygame.event.get():
				if event.type == pygame.QUIT or (event.type == pygame.KEYUP and event.key == pygame.K_ESCAPE):
					pygame.quit()
					sys.exit()
				elif event.type == pygame.KEYUP and event.key == pygame.K_r:
					flag = True
			if flag:
				break
			screen.fill((135, 206, 235))
			text0 = 'Final score: %s' % score
			text1 = 'Press <R> to restart the game.'
			text2 = 'Press <Esc> to quit the game.'
			y = 150
			for idx, text in enumerate([text0, text1, text2]):
				text_render = font.render(text, 1, (85, 65, 0))
				rect = text_render.get_rect()
				if idx == 0:
					rect.left, rect.top = (212, y)
				elif idx == 1:
					rect.left, rect.top = (122.5, y)
				else:
					rect.left, rect.top = (126.5, y)
				y += 100
				screen.blit(text_render, rect)
			pygame.display.update()
		game.reset()


'''test'''
if __name__ == '__main__':
	main()

希望大家能用到,喜欢的话记得给我来个三连哦。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的消消乐游戏Python代码,注释和说明文档已经加上了: ```python import random import tkinter as tk # 游戏界面的行列数 ROWS = 10 COLS = 10 # 方块的颜色 COLORS = ['red', 'blue', 'green', 'yellow', 'purple'] class Game: def __init__(self): self.board = [[None for _ in range(COLS)] for _ in range(ROWS)] self.score = 0 self.selected = None self.create_board() # 创建游戏界面 def create_board(self): self.root = tk.Tk() self.root.title('消消乐') self.buttons = [] for r in range(ROWS): row = [] for c in range(COLS): button = tk.Button(self.root, width=2, height=1, command=lambda r=r, c=c: self.click(r, c)) button.grid(row=r, column=c) row.append(button) self.buttons.append(row) self.update_board() # 更新游戏界面 def update_board(self): for r in range(ROWS): for c in range(COLS): color = self.board[r][c] if color is None: self.buttons[r][c].config(bg='white') else: self.buttons[r][c].config(bg=color) self.root.update() # 点击方块 def click(self, r, c): if self.selected is None: self.selected = (r, c) self.buttons[r][c].config(relief=tk.SUNKEN) elif self.selected == (r, c): self.selected = None self.buttons[r][c].config(relief=tk.RAISED) elif self.is_adjacent(self.selected, (r, c)): self.swap(self.selected, (r, c)) matches = self.find_matches() while matches: self.remove_matches(matches) self.drop_blocks() self.fill_board() matches = self.find_matches() self.selected = None self.update_board() # 判断两个方块是否相邻 def is_adjacent(self, a, b): return abs(a[0]-b[0]) + abs(a[1]-b[1]) == 1 # 交换两个方块 def swap(self, a, b): self.board[a[0]][a[1]], self.board[b[0]][b[1]] = self.board[b[0]][b[1]], self.board[a[0]][a[1]] # 找到所有的匹配 def find_matches(self): matches = [] for r in range(ROWS): for c in range(COLS): if self.board[r][c] is None: continue if c < COLS-2 and self.board[r][c] == self.board[r][c+1] == self.board[r][c+2]: matches.append((r, c, r, c+1, r, c+2)) if r < ROWS-2 and self.board[r][c] == self.board[r+1][c] == self.board[r+2][c]: matches.append((r, c, r+1, c, r+2, c)) return matches # 移除所有匹配 def remove_matches(self, matches): for match in matches: for r, c in zip(match[::2], match[1::2]): self.board[r][c] = None self.score += len(matches) # 方块下落 def drop_blocks(self): for c in range(COLS): bottom = ROWS-1 for r in range(ROWS-1, -1, -1): if self.board[r][c] is None: continue if r != bottom: self.board[bottom][c] = self.board[r][c] self.board[r][c] = None bottom -= 1 # 填充方块 def fill_board(self): for c in range(COLS): for r in range(ROWS): if self.board[r][c] is None: self.board[r][c] = random.choice(COLORS) # 开始游戏 def play(self): self.fill_board() self.update_board() self.root.mainloop() if __name__ == '__main__': game = Game() game.play() ``` 这个游戏使用了Tkinter库来创建游戏界面,并使用了一些简单的算法来实现游戏逻辑。游戏的规则是,玩家需要通过交换相邻的方块来匹配三个或更多相同颜色的方块,匹配成功后这些方块将被移除并得分,然后上面的方块将下落并填补空缺。游戏结束条件是没有可匹配的方块。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值