前言
halo,包子们晚上好
今天给大家整一个基于pygame实现的可视化麻将
现在不是很多小伙伴都喜欢打麻将的嘛,逢年过节都会搓搓麻将的嘛,所以呀小编这边不就给大家安排上啦,源码啥的都可以直接给大家使用的哟
快跟你的小伙伴一起玩耍吧
相关文件
关注小编,私信小编领取哟!
当然别忘了一件三连哟~~
公众号:Python日志
开发工具
Python版本:3.7.8
相关模块:
pygame模块;
random模块;
GameTable模块;
Rule模块;
以及一些python自带的模块。
环境搭建
安装Python并添加到环境变量,pip安装需要的相关模块即可。
游戏规则
游戏中采取日麻无赤宝牌规则。共计 136 张麻将牌,其中包含 1-9 万/条/筒与东南西北中发白各 4 张(无花牌)。基本规则与国标麻将一致,区别主要在于:每轮对局中存在“宝牌”,胡牌时手牌中若持有宝牌则会有对应奖励;日麻胡牌需要满足特定条件,即为“役”,无役无法胡牌。
设计思路
效果展示
开始界面
玩家进入游戏后,首先会来到登录界面,登录界面中有我为这个游戏所设计的一个 Logo。此时玩家需要在 ID 栏中输入自己的 ID,并选择登录。登录后会来到欢迎界面,并提示玩家可以选择开始游戏
游戏界面
代码展示
基础操作
import copy
import pygame
import random
from GameTable import Gametable
from Rule import huJudge
from pygame.locals import *
from sys import exit
class Mahjong():
def __init__(self):
self.__clock = pygame.time.Clock()
self.screenSet() # 游戏画面设置
self.playerSet() # 玩家设置
self.sitSet() # 座次设置
self.gameStart() # 游戏开始
def screenSet(self):
pygame.init()
screen = pygame.display.set_mode((600, 400))
# screen 的本质上就是一个 Surface 对象,它是游戏的主窗口,
# 也就是整个游戏中尺寸最大的“纸”,任何其他的 Surface 对象都需要附着在这张最大的“纸”上
pygame.display.set_caption('Mahjong 源码领取QQ群:494958217')
def playerSet(self):
# self.__playername = input("请输入您的昵称:")
self.__playername = "飞翔大神天使" # 方便测试用
print("您好,{}!欢迎来到麻将世界!".format(self.__playername))
def sitSet(self):
self.__sit = random.randint(0, 3)
# self.__sit = 3
print("您这把{}起!".format("东南西北"[self.__sit]))
def prepare(self):
print("\n\n正在清理牌桌...")
self.__table = Gametable() # 清理牌桌
print("正在获取初始手牌...")
self.__hands = self.getfHands(self.__sit)
print(self.__hands)
def reset(self):
print("\n\n正在清理牌桌...")
self.__table = Gametable() # 清理牌桌
print("正在获取初始手牌...")
self.__hands = self.getfHands(self.__sit)
print(self.__hands)
def getfHands(self, sit):
hands = []
base = (sit-1) * 4 # 摸牌起始位置
# 东起 0,南起 4, 西起 8, 北起 12
for i in range(3): # 分3次摸2垛
hands.append(self.__table.getTiles()[i * 16 + base])
hands.append(self.__table.getTiles()[i * 16 + base + 1])
hands.append(self.__table.getTiles()[i * 16 + base + 2])
hands.append(self.__table.getTiles()[i * 16 + base + 3])
hands.append(self.__table.getTiles()[48 + base])
self.handsSort(hands)
return hands
def handsSort(self, hands):
hands.sort(key=Gametable.tiles.index)
return hands
def gameStart(self):
self.__game_num = 0 # 当前对局数
# self.__current_turn = 0 # 当前局数
self.__wind = "东" # 从东场开始
gamepara = self.__sit # 参数记录起始位置
while(self.__game_num < 8):
self.reset() # 准备下一局对局
print("sit:", self.__sit, "gamenum:", self.__game_num)