【Python多人游戏】德州扑克TEXAS

写在前面:

本项目仅限于娱乐及学习交流,严禁用于商业或非法用途,否则由此产生的一切后果均与作者无关!

项目链接:

GitHub - moyuweiqing/Texas: 德州扑克在线对战,多人对战


目录

1. 环境和第三方库

2. 技术栈

2.1 tkinter构建界面

 2.2 socket通信

2.3 threading多线程

2. 画牌

3. Player类

4. Texas类

5. 不足


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类,主要含有以下的方法:

Texas类的方法
函数名参数功能
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. 不足

  1. 对于双方都直到河牌圈之后比牌大小的情况 ,游戏中没有进行比较,玩家比牌的情况需要在服务器端输入赢家。
  2. 结算部分,对于不同筹码玩家之间的all in等一些存在筹码差距的情况,游戏中并没有进行处理。
  3. 由于本人对于网络通信的编程水平有限,socket编程部分代码比较水。 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

moyuweiqing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值