Python 2048益智小游戏源代码

Python 2048益智小游戏源代码,2048游戏共有16个格子,初始时会有两个格子上安放了两个数字2,每次可以选择上下左右其中一个方向去滑动,每滑动一次,所有的数字方块都会往滑动的方向靠拢外,系统也会在空白的地方随即出现一个数字方块,相同数字的方块在靠拢、相撞时会相加。系统给予的数字方块不是2就是4,玩家要想办法在这小小的16格范围中凑出“2048”这个数字方块。程序运行截图:
Python 2048益智小游戏源代码_第1张图片
核心程序代码:
2048.py

'''
Function:
	2048小游戏
Author:
	Python代码狂人
微信公众号:
	Python代码大全
'''
import cfg
import sys
import pygame
from modules.utils import *
from modules.Game2048 import *
from modules.endInterface import *


'''主程序'''
def main(cfg):
	# 游戏初始化
	pygame.init()
	screen = pygame.display.set_mode(cfg.SCREENSIZE)
	pygame.display.set_caption('2048 —— 微信公众号:Python代码大全')
	# 播放背景音乐
	pygame.mixer.music.load(cfg.BGMPATH)
	pygame.mixer.music.play(-1)
	# 实例化2048游戏
	game_2048 = Game2048(matrix_size=cfg.GAME_MATRIX_SIZE, max_score_filepath=cfg.MAX_SCORE_FILEPATH)
	# 游戏主循环
	clock = pygame.time.Clock()
	is_running = True
	while is_running:
		screen.fill(pygame.Color(cfg.BG_COLOR))
		# --按键检测
		for event in pygame.event.get():
			if event.type == pygame.QUIT:
				pygame.quit()
				sys.exit()
			elif event.type == pygame.KEYDOWN:
				if event.key in [pygame.K_UP, pygame.K_DOWN, pygame.K_LEFT, pygame.K_RIGHT]:
					game_2048.setDirection({pygame.K_UP: 'up', pygame.K_DOWN: 'down', pygame.K_LEFT: 'left', pygame.K_RIGHT: 'right'}[event.key])
		# --更新游戏状态
		game_2048.update()
		if game_2048.isgameover:
			game_2048.saveMaxScore()
			is_running = False
		# --将必要的游戏元素画到屏幕上
		drawGameMatrix(screen, game_2048.game_matrix, cfg)
		start_x, start_y = drawScore(screen, game_2048.score, game_2048.max_score, cfg)
		drawGameIntro(screen, start_x, start_y, cfg)
		# --屏幕更新
		pygame.display.update()
		clock.tick(cfg.FPS)
	return endInterface(screen, cfg)


'''run'''
if __name__ == '__main__':
	while True:
		if not main(cfg):
			break

cfg.py

'''配置文件'''
import os


'''FPS'''
FPS = 60
'''背景颜色'''
BG_COLOR = '#92877d'
'''屏幕大小'''
SCREENSIZE = (650, 370)
'''保存当前最高分的文件'''
MAX_SCORE_FILEPATH = 'score'
'''字体路径'''
FONTPATH = os.path.join(os.getcwd(), 'resources/font/Gabriola.ttf')
'''背景音乐路径'''
BGMPATH = os.path.join(os.getcwd(), 'resources/audio/bgm.mp3')
'''其他一些必要的常量'''
MARGIN_SIZE = 10
BLOCK_SIZE = 80
GAME_MATRIX_SIZE = (4, 4)

Game2048.py

'''
Function:
	定义2048小游戏
Author:
	Charles
微信公众号:
	Python代码大全
'''
import copy
import random
import pygame


'''2048游戏'''
class Game2048(object):
	def __init__(self, matrix_size=(4, 4), max_score_filepath=None, **kwargs):
		# matrix_size: (num_rows, num_cols)
		self.matrix_size = matrix_size
		# 游戏最高分保存路径
		self.max_score_filepath = max_score_filepath
		# 初始化
		self.initialize()
	'''更新游戏状态'''
	def update(self):
		game_matrix_before = copy.deepcopy(self.game_matrix)
		self.move()
		if game_matrix_before != self.game_matrix: self.randomGenerateNumber()
		if self.score > self.max_score: self.max_score = self.score
	'''根据指定的方向, 移动所有数字块'''
	def move(self):
		# 提取非空数字
		def extract(array):
			array_new = []
			for item in array:
				if item != 'null': array_new.append(item)
			return array_new
		# 合并非空数字
		def merge(array):
			score = 0
			if len(array) < 2: return array, score
			for i in range(len(array)-1):
				if array[i] == 'null':
					break
				if array[i] == array[i+1]:
					array[i] *= 2
					array.pop(i+1)
					array.append('null')
					score += array[i]
			return extract(array), score
		# 不需要移动的话直接return
		if self.move_direction is None: return
		# 向上
		if self.move_direction == 'up':
			for j in range(self.matrix_size[1]):
				col = []
				for i in range(self.matrix_size[0]):
					col.append(self.game_matrix[i][j])
				col = extract(col)
				col.reverse()
				col, score = merge(col)
				self.score += score
				col.reverse()
				col = col + ['null',] * (self.matrix_size[0] - len(col))
				for i in range(self.matrix_size[0]):
					self.game_matrix[i][j] = col[i]
		# 向下
		elif self.move_direction == 'down':
			for j in range(self.matrix_size[1]):
				col = []
				for i in range(self.matrix_size[0]):
					col.append(self.game_matrix[i][j])
				col = extract(col)
				col, score = merge(col)
				self.score += score
				col = ['null',] * (self.matrix_size[0] - len(col)) + col
				for i in range(self.matrix_size[0]):
					self.game_matrix[i][j] = col[i]
		# 向左
		elif self.move_direction == 'left':
			for idx, row in enumerate(copy.deepcopy(self.game_matrix)):
				row = extract(row)
				row.reverse()
				row, score = merge(row)
				self.score += score
				row.reverse()
				row = row + ['null',] * (self.matrix_size[1] - len(row))
				self.game_matrix[idx] = row
		# 向右
		elif self.move_direction == 'right':
			for idx, row in enumerate(copy.deepcopy(self.game_matrix)):
				row = extract(row)
				row, score = merge(row)
				self.score += score
				row = ['null',] * (self.matrix_size[1] - len(row)) + row
				self.game_matrix[idx] = row
		self.move_direction = None
	'''在新的位置随机生成数字'''
	def randomGenerateNumber(self):
		empty_pos = []
		for i in range(self.matrix_size[0]):
			for j in range(self.matrix_size[1]):
				if self.game_matrix[i][j] == 'null': empty_pos.append([i, j])
		i, j = random.choice(empty_pos)
		self.game_matrix[i][j] = 2 if random.random() > 0.1 else 4
	'''初始化'''
	def initialize(self):
		self.game_matrix = [['null' for _ in range(self.matrix_size[1])] for _ in range(self.matrix_size[0])]
		self.score = 0
		self.max_score = self.readMaxScore()
		self.move_direction = None
		self.randomGenerateNumber()
		self.randomGenerateNumber()
	'''设置移动方向'''
	def setDirection(self, direction):
		assert direction in ['up', 'down', 'left', 'right']
		self.move_direction = direction
	'''保存最高分'''
	def saveMaxScore(self):
		f = open(self.max_score_filepath, 'w', encoding='utf-8')
		f.write(str(self.max_score))
		f.close()
	'''读取游戏最高分'''
	def readMaxScore(self):
		try:
			f = open(self.max_score_filepath, 'r', encoding='utf-8')
			score = int(f.read().strip())
			f.close()
			return score
		except:
			return 0
	'''游戏是否结束'''
	@property
	def isgameover(self):
		for i in range(self.matrix_size[0]):
			for j in range(self.matrix_size[1]):
				if self.game_matrix[i][j] == 'null': return False
				if (i == self.matrix_size[0] - 1) and (j == self.matrix_size[1] - 1):
					continue
				elif (i == self.matrix_size[0] - 1):
					if (self.game_matrix[i][j] == self.game_matrix[i][j+1]):
						return False
				elif (j == self.matrix_size[1] - 1):
					if (self.game_matrix[i][j] == self.game_matrix[i+1][j]):
						return False
				else:
					if (self.game_matrix[i][j] == self.game_matrix[i+1][j]) or (self.game_matrix[i][j] == self.game_matrix[i][j+1]):
						return False
		return True

完整程序代码下载:Python 2048益智小游戏源代码
更多Python源代码,请关注公众号:Python代码大全
Python 2048益智小游戏源代码_第2张图片

你可能感兴趣的:(Python代码大全,python,爬虫,开发语言,2048)