写在前面:
本项目仅限于娱乐及学习交流,严禁用于商业或非法用途,否则由此产生的一切后果均与作者无关!
项目链接:
GitHub - moyuweiqing/Texas: 德州扑克在线对战,多人对战
目录
1. 环境和第三方库
python版本: 3.7
第三方库及对应的版本:
pillow 7.1.1
2. 技术栈
2.1 tkinter构建界面
本项目使用tkinter构建客户端界面,用户可以在客户端的界面上进行游戏操作,由于tkinter是python自带的库,因此不需要额外导入。
tkinter界面
2.2 socket通信
socket通信,使用socket进行客户端与服务端的通信,但由于本人对于socket编程并不是很熟悉,所以socket通信部分的代码写得很烂,对于数据传输用的是类似于json结构的字符串,在传输后再将字符串转为json结构体进行解析。
2.3 threading多线程
使用多线程编程,同时监控服务端和客户端的多个传输信息的情况。
2. 画牌
使用tkinter进行画纸牌,用到了图片库PIL,代码比较简单。
from PIL import Image, ImageFont, ImageDraw
cardnum = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K']
flowers = {'spade': '♠', 'heart': '♥', 'diamond': '♦', 'club': '♣'}
for c in cardnum:
for f in flowers.keys():
im = Image.new('RGB', (100, 150), (255, 255, 255))
dr = ImageDraw.Draw(im)
ft = ImageFont.truetype(font='arial', size=40, encoding='gb18030')
if f == 'heart' or f == 'diamond':
dr.text((30, 50), c + flowers[f], fill='#FF0000', font=ft)
else:
dr.text((30, 50), c + flowers[f], fill='#000000', font=ft)
im.save('./cards/' + c + f + '.jpg')
im = Image.new('RGB', (100, 150), (255, 255, 255)).save('./cards/block.gif')
3. Player类
玩家类,玩家类的主要功能是建立玩家对象,并对玩家的行为进行操作,主要含有以下的方法:
函数名 | 参数 | 功能 |
__init__() | player_name: 玩家姓名 id: 玩家id,默认为客户端的ip和端口号 chip: 初始化筹码量 | 初始化一个玩家对象 |
game_init() | - | 初始化玩家角色、行为等 |
get_act() | act: 玩家当前角色 now_chip: 开局下的筹码 | 获取每一局玩家的角色和开始的筹码量 |
get_action() | last_chip: 上家的投入筹码量 | 获取客户的行为信息 |
change_name() | name: 玩家姓名 | 更改玩家姓名 |
change_chip() | action: 当前动作 now_chip: 投入筹码 | 改变筹码 |
check_out() | check_chip: 结算筹码 | 筹码结算 |
4. Texas类
Texas类是用于开始一句游戏的,里面会调用到Player类,主要含有以下的方法:
函数名 | 参数 | 功能 |
all_init() | -- | 游戏初始化 |
init_cards() | -- | 初始化纸牌 |
add_player() | player: 玩家类 | 添加游戏玩家 |
show_off() | -- | 展示所有牌 |
start_round_call() | -- | 开始第一轮叫牌 |
make_player_init() | -- | 游戏玩家初始化 |
get_max_chip() | -- | 获取当前最大已押筹码 |
get_status_info() | -- | 获取所有玩家的状态 |
get_call_list() | -- | 获取玩家起叫顺序 |
choose_act() | -- | 获取各玩家的位置角色 |
check_out() | -- | 结算 |
check_out2() | -- | 比牌结算 |
if_last_player() | -- | 判断是否是最后一个玩家 |
get_random_card() | -- | 获取随机的纸牌 |
send_cards() | -- | 发牌 |
send_flop() | -- | 翻牌圈发牌 |
send_turn() | -- | 转牌圈发牌 |
send_river() | -- | 河牌圈发牌 |
if_the_same_chip() | -- | 判断是否是一样的筹码 |
get_all_user() | -- | 获取各玩家的位置情况 |
__init__() | -- | 初始化类 |
5. 不足
- 对于双方都直到河牌圈之后比牌大小的情况 ,游戏中没有进行比较,玩家比牌的情况需要在服务器端输入赢家。
- 结算部分,对于不同筹码玩家之间的all in等一些存在筹码差距的情况,游戏中并没有进行处理。
- 由于本人对于网络通信的编程水平有限,socket编程部分代码比较水。