2048小游戏,可以自选配景颜色,方框颜色,音乐播放。
还可以展示当前玩家的排名,动态排名,及历史玩家的排名。
前期需求:


利用pygame加载目次音乐。MP3文件:
- def music_play():
- import pygame as py
- # 初始化
- py.mixer.init()
- # 文件加载
- py.mixer.music.load(r'.\test.mp3')
- # 播放 第一个是播放值 -1代表循环播放, 第二个参数代表开始播放的时间
- py.mixer.music.play(-1, 10)
复制代码 看下运行后的效果图:
=========参数设置:

=========配景设置:

=========方块设置:




==========源码分享:
[code]#!/usr/bin/env python3# -*- coding: utf-8 -*-# @Author : Codeooo# @Time : 2022/04/13"""2048游戏本模块已完备实现2048游戏的算法及分数的计算算法本游戏的界面采用python 尺度库 tkinter 来实现此界面的布局采用tkinter中的grid布局"""import copyimport random # 导入随机模块random,重要用于随机天生新的数字及数字摆方位置import math # 导入数学模块,用来计算分数# _map_data 绑定一个 4 x 4 列表,此列表为2048游戏舆图,初始值如下:from tkinter.colorchooser import askcolor_map_data = [ [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]score_list = [] # 分数列表# -------------------------以下为2048游戏的根本算法---------------------------def reset(): '''重新设置游戏数据,将舆图恢复为初始状态,并加入两个数据 2 作用初始状态''' _map_data[:] = [] # _map_data.clear() _map_data.append([0, 0, 0, 0]) _map_data.append([0, 0, 0, 0]) _map_data.append([0, 0, 0, 0]) _map_data.append([0, 0, 0, 0]) # 在空白舆图上添补两个2 fill2() fill2()def get_space_count(): """获取没有数字的方格的数目,假如数目为0则说有无法添补新数据,游戏即将竣事 """ count = 0 for r in _map_data: count += r.count(0) return countdef get_score(): '''获取游戏的分数,得分规则是每次有两个数加在一起则天生相应的分数。 如 2 和 2 归并后得4分, 8 和 8 分并后得 16分. 根据一个大于2的数字就可以知道他共归并了多少次,可以直接算出分数: 如: 4 肯定由两个2归并,得4分 8 肯定由两个4归并,则计:8 + 4 + 4 得32分 ... 以此类推 ''' score = 0 for r in _map_data: for c in r: score += 0 if c < 4 else c * int((math.log(c, 2) - 1.0)) return score # 导入数学模块def fill2(): '''添补2到空位置,假如填度乐成返回True,假如已满,则返回False''' blank_count = get_space_count() # 得到舆图上空白位置的个数 if 0 == blank_count: return False # 天生随机位置, 如,当只有四个空时,则天生0~3的数,代表自左至右,自上而下的空位置 pos = random.randrange(0, blank_count) offset = 0 for row in _map_data: # row为行row for col in range(4): # col 为列,column if 0 == row[col]: if offset == pos: # 把2添补到第row行,第col列的位置,返回True row[col] = 2 return True offset += 1def is_gameover(): """判定游戏是否竣事,假如竣事返回True,否是返回False """ for r in _map_data: # 假如程度方向另有0,则游戏没有竣事 if r.count(0): return False # 程度方向假如有两个相邻的元素类似,应当是可以归并的,则游戏没有竣事 for i in range(3): if r == r[i + 1]: return False for c in range(4): # 竖直方向假如有两个相邻的元素类似,应当可以归并的,则游戏没有竣事 for r in range(3): if _map_data[r][c] == _map_data[r + 1][c]: return False # 以上都没有,则游戏竣事 return True# 以下是2048游戏的根本算法,此算法是在达内的美女老师"贾琳倩"提供算法上改进而来# 此种算法不是最优算法,但我以为这是目前最容易明确的算法def _left_move_number(line): '''左移一行数字,假如有数据移动则返回True,否则返回False: 如: line = [0, 2, 0, 8] 即表达如下一行: +---+---+---+---+ | 0 | 2 | 0 | 8 | |