杭电胡老师的实验三:

要求:
通过在远端主机上搭建一个远程骰宝服务器,其它主机可以通过客户端程序
RemoteBet与远程的骰宝服务器联系,进行交互式游戏设计。命令行格式如下:
RemoteBet
如: RemoteBet 127.0.0.1
规则如下:
ya tc <数量> <coin|silver|gold> 押头彩(两数顺序及点数均正确) 一赔三十五
ya dc <数量> <coin|silver|gold> 押大彩(两数点数正确) 一赔十七
ya kp <数量> <coin|silver|gold> 押空盘(两数不同且均为偶数) 一赔五
ya qx <数量> <coin|silver|gold> 押七星(两数之和为七) 一赔五
ya dd <数量> <coin|silver|gold> 押单对(两数均为奇数) 一赔三
ya sx <数量> <coin|silver|gold> 押散星(两数之和为三、五、九、十一) 一赔二
每盘按从上到下的顺序只出现一种点型(头彩和大彩可同时出现),其他情况都算庄家赢。
庄家唱道:新开盘!预叫头彩!
庄家将两枚玉骰往银盘中一撒。
┌───┐ ┌───┐
│● ● │ │ │
│● ● │ │ ● │
│● ● │ │ │
└───┘ └───┘
庄家唱道:头彩骰号是六、一!
输入你压的值:
ya tc 10 gold
庄家将两枚玉骰扔进两个金盅,一手持一盅摇将起来。
庄家将左手的金盅倒扣在银盘上,玉骰滚了出来。
┌───┐
│● ●│
│ ● │
│● ●│
└───┘
庄家将右手的金盅倒扣在银盘上,玉骰滚了出来。
┌───┐
│ ● │
│ │
│ ● │
└───┘
庄家叫道:五、二……七星。
你赢了多少?or 你输了多少?

假设服务器的IP地址为127.0.0.1,客户端程序连接到服务器进行远程骰宝游戏,然后按照服务器发回的游戏规则和提示进行游戏。
·
·
·
·
·
我用协程做的,使用时要导入gevent这个包

游戏服务器:

"""
@author: Bre Athy
@contact: https://www.zhihu.com/people/you-yi-shi-de-hu-xi
@productware: PyCharm
@file: 游戏服务器.py
@time: 2019/11/10 23:40
"""
import socket,json,random,gevent
from gevent import monkeyusers=[]# 初始钱币
thecoin=thesilver=thegold=30
def service_client(new_socket):def sendToClient(dict_info):new_socket.send(json.dumps(dict_info).encode("utf-8"))# 接收请求while True:recv_data=new_socket.recv(1024).decode("utf-8")data=json.loads(recv_data)print(data)dice1, dice2 = random.randint(1, 6), random.randint(1, 6)if data['alt']=="游戏开始":uid=len(users)user={"uid":uid,"coin":thecoin,"silver":thesilver,"gold":thegold,'dice1':dice1,'dice2':dice2}users.append({"uid":uid,"money":thecoin+thesilver*100+thegold*10000,"dice1":dice1,"dice2":dice2})sendToClient(user)elif data['alt']=="压注":bet=Trueif data['type']=='tc' and dice1==data['dice1'] and dice2==data['dice2']:users[data["uid"]]["money"]+=data['money']*35elif data['type']=='dc' and ((dice1==data['dice1'] and dice2==data['dice2']) or (dice1==data['dice2'] and dice2==data['dice1'])):users[data["uid"]]["money"]+=data['money']*17elif data['type']=='kp' and (dice1!=dice2 and dice1%2==0 and dice2%2==0):users[data["uid"]]["money"]+=data['money']*5elif data['type']=='qx' and dice1+dice2==7 :users[data["uid"]]["money"]+=data['money']*5elif data['type']=='dd' and dice1%2==1 and dice2%2==1:users[data["uid"]]["money"]+=data['money']*3elif data['type']=='sx' and dice1+dice2 in [3,5,9,11]:users[data["uid"]]["money"]+=data['money']*2else:users[data['uid']]['money']-=data['money']bet=FalsesendToClient({'dice1':dice1,'dice2':dice2,'bet':bet})elif data['alt']=="新开盘":users[data['uid']]['dice1']=dice1users[data['uid']]['dice2']=dice2sendToClient({'dice1':dice1,'dice2':dice2})else:print("信息有误!出错内容:%s"%data)def main():"服务器基本功能"monkey.patch_all()# 创建套接字tcp_sever_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)# 绑定端口tcp_sever_socket.bind(("",6666))# 准备监听tcp_sever_socket.listen(128)while True:# 等待客户端链接new_socket,client_addr=tcp_sever_socket.accept()# 为客户端服务gevent.spawn(service_client,new_socket)if __name__ == "__main__":main()

游戏客户端:

"""
@author: Bre Athy
@contact: https://www.zhihu.com/people/you-yi-shi-de-hu-xi
@productware: PyCharm
@file: 游戏客户端.py
@time: 2019/11/10 23:40
"""
import socket,json,time
TZ=["""
┌────────┐
│        │
│   ●    │
│        │
└────────┘""","""
┌────────┐
│   ●    │
│        │
│   ●    │
└────────┘""","""
┌────────┐
│    ●   │
│        │
│ ●    ● │
└────────┘""","""
┌────────┐
│ ●    ● │
│        │
│ ●    ● │
└────────┘""","""
┌────────┐
│ ●    ● │
│   ●    │
│ ●    ● │
└────────┘""","""
┌────────┐
│  ●  ●  │
│  ●  ●  │
│  ●  ●  │
└────────┘"""
]
alb=['〇','一','二','三','四','五','六']c_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
info={}
addr=("127.0.0.1",6666)def sendAndWait(dict_info):"传进来一个字典自动发送,返回一个字典"info=json.dumps(dict_info).encode("utf-8")c_socket.send(info)recv_data=c_socket.recv(1024).decode("utf-8")return json.loads(recv_data)def getInfo():print("当前coin:%d  silver:%d  gold:%d"%(info['coin'],info['silver'],info['gold']))def myprint(words,thetime):print(words)time.sleep(thetime)def main():global addrprint("★"*8,"欢迎体验骰宝游戏","★"*8)while True:print("请按 括号内提示 输入服务器地址启动游戏 <RemoteBet IP address>:")addr=(input()[10:],6666)# addr=("127.0.0.1",6666)print("连接服务器ing...")try:c_socket.connect(addr)breakexcept:print("连接服务器失败,你输入的IP地址为: %s 请重新输入!"%addr[0])global infoinfo={"alt":"游戏开始"}info=sendAndWait(info)print("★"*8,"游戏开始","★"*8)print("★"*4,"输入 Help 查看游戏帮助","★"*4)getInfo()myprint("进入赌场,你走进了一张桌子......",3)myprint("庄家唱到:新开盘!预叫头彩!",2)myprint("庄家将两枚玉骰往银盘中一撒。",2)myprint(TZ[int(info['dice1'])-1],1)myprint(TZ[int(info['dice2'])-1],1)myprint("庄家唱道:头彩骰号是%s、%s!"%(alb[int(info['dice1'])],alb[int(info['dice2'])]),2)while True:print("请下注<help查看帮助>:")cmd=input().lower()# 帮助if cmd == "help":help="""★★★★★★★★游戏帮助★★★★★★★★
新开盘: new
查看余额:ye
钱币转换:zh <数量> <coin|silver|gold> to <coin|silver|gold>     金:银:硬=1:100:10000
ya tc <数量> <coin|silver|gold> 押头彩(两数顺序及点数均正确)        一赔三十五
ya dc <数量> <coin|silver|gold> 押大彩(两数点数正确)               一赔十七
ya kp <数量> <coin|silver|gold> 押空盘(两数不同且均为偶数)          一赔五
ya qx <数量> <coin|silver|gold> 押七星(两数之和为七)               一赔五
ya dd <数量> <coin|silver|gold> 押单对(两数均为奇数)               一赔三
ya sx <数量> <coin|silver|gold> 押散星(两数之和为三、五、九、十一)  一赔二
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★"""print(help)# 新开盘elif cmd =="new":myprint("你离开了这个赌局,换到了新的一桌",3)info['alt']="新开盘"ret=sendAndWait(info)info['dice1'],info['dice2']=ret['dice1'],ret['dice2']myprint("庄家唱道:这位爷留步: 新开盘!预叫头彩!", 2)myprint("你停了下来,定睛看去,", 3)myprint("庄家慢慢将两枚玉骰往银盘中一撒。", 2)myprint(TZ[info['dice1'] - 1], 1)myprint(TZ[info['dice2'] - 1], 1)myprint("庄家唱道:头彩骰号是%s、%s!" % (alb[int(info['dice1'])], alb[int(info['dice2'])]), 2)# 查看余额elif cmd == "ye":getInfo()# 个人信息elif cmd == "@@@":print(info)# 下注elif len(cmd.split(" "))==4:try:a, b, c, d=tuple(cmd.split(" "))assert a=="ya"assert b in ['tc','dc','kp','qx','dd','sx']if not c.isdigit():raise ValueErrorassert d in ['gold','coin','silver']except:print("输入有误! 请重新输入!<输入 Help 查看游戏帮助>")else:if int(c) > info[d]:print("你没有那么多 %s!"%(d[0].upper()+d[1:]))continueinfo['money']=int(c) if d=='coin' else (int(c)*100 if d=='silver' else int(c)*10000)info['alt']='压注'info['type']=bret=sendAndWait(info)d1,d2=ret['dice1'],ret['dice2']if ret['bet']:if b=='tc':info[d]+=int(c)*35elif b=='dc':info[d]+=int(c)*17elif b=='kp':info[d]+=int(c)*5elif b=='qx':info[d]+=int(c)*5elif b=='dd':info[d]+=int(c)*3elif b=='sx':info[d]+=int(c)*2else:info[d]-=int(c)if d=='gold':gu="金蛊"elif d=='silver':gu="银蛊"else:gu='铜蛊'myprint("庄家将两枚玉骰扔进两个%s,一手持一盅摇将起来。"%gu,3)myprint("庄家将左手的%s倒扣在银盘上,玉骰滚了出来。"%gu,2)myprint(TZ[d1-1],2)myprint("庄家将右手的%s倒扣在银盘上,玉骰滚了出来。"%gu,2)myprint(TZ[d2-1],3)rs="庄赢"if d1+d2 in [3,5,9,11]:rs="散星"if d1%2==1 and d2%2==1:rs="单对"if d1+d2==7:rs="七星"if d1!=d2 and d1%2==0 and d2%2==0:rs="空盘"if (d1==info['dice1'] and d2==info['dice2']) or (d1==info['dice2'] and d2==info['dice1']):rs="大彩"if d1==info['dice1'] and d2==info['dice2']:rs="头彩"myprint("庄家叫道:%s、%s······%s。"%(alb[d1],alb[d2],rs),3)if ret['bet']:myprint("庄家唱道:恭喜恭喜这位爷,赢了%s!"%rs,3)else:myprint("没压中,哎呀",2)# 钱币转换elif len(cmd.split(" "))==5:try:a, money, c, d ,e = tuple(cmd.split(" "))assert a == "zh"if not money.isdigit():raise ValueErrorassert c in ['gold','silver','coin']assert d == "to"assert e in ['gold','silver','coin']except:print("输入有误! 请重新输入!<输入 Help 查看游戏帮助>")else:if int(money) > info[c]:print("你没有那么多 %s!"%(c[0].upper()+c[1:]))continueif c == e:print("转换成功!当前余额:")getInfo()elif (c == 'gold' and e =='silver') or (c == 'silver' and e == 'coin'):info[c]-=int(money)info[e]+=int(money)*100print("转换成功!当前余额:")getInfo()elif (c == 'silver' and e =='gold') or (c == 'coin' and e == 'silver'):if int(money)%100!=0:print("转换失败 ! 请输入100的倍数!")continueinfo[c]-=int(money)info[e]+=int(money)//100print("转换成功!当前余额:")getInfo()elif c == 'coin' and e =='gold':if int(money)%10000!=0:print("转换失败 ! 请输入10000的倍数!")continueinfo[c]-=int(money)info[e]+=int(money)//10000print("转换成功!当前余额:")getInfo()else:info[c]-=int(money)info[e]+=int(money)*10000print("转换成功!当前余额:")getInfo()else:print("输入有误! 请重新输入!<输入 Help 查看游戏帮助>")if __name__ == "__main__":main()

TCP交互式游戏《基于TCP的C/S程序设计》相关推荐

  1. nginx tcp代理_nginx 基于tcp/udp代理

    nginx从1.9.0版本开始,新增了ngx_stream_core_module模块,使nginx支持四层负载均衡.默认编译的时候该模块并未编译进去,需要编译的时候添加--with-stream,使 ...

  2. c语言tcp多线程聊天,基于tcp和多线程的多人聊天室-C语言

    之前在学习关于网络tcp和多线程的编程,学了知识以后不用一下总绝对心虚,于是就编写了一个基于tcp和多线程的多人聊天室. 具体的实现过程: 服务器端:绑定socket对象->设置监听数-> ...

  3. 猜拳游戏(基于TCP socket的编程)

    本地版猜拳游戏(基于TCP socket的编程) Designed by Rossi 被迫营业的产物,不过最终效果还是不错的 文章目录 本地版猜拳游戏(基于TCP socket的编程) 猜拳介绍 一. ...

  4. 基于TCP协议的游戏代理接口测试工具<一>:设计初衷与工具构想

    设计初衷 大势所逼 众所周知,区别于HTTP之类的协议,由于tcp协议包体通信的高度定制化导致业内基本没有通用的接口工具用于游测人员进行日常使用,大部分的情况是基于这种状态下只能进行测试工具定制.在日 ...

  5. Qt基于tcp网络服务器的简易版多人贪吃蛇小游戏(多线程)

    文章目录 前言 一.项目的简单介绍 二.总体步骤 1.服务器端 2 客户端 总结 前言 花费一周的时间,搭建了一个自己的破烂服务器,以此记录我那逝去的时间 一.项目的简单介绍 这是一个多人贪吃蛇游戏, ...

  6. 异常处理、socke基于TCP协议编程

    一.异常处理 1.错误和异常 1.程序中难免出现错误,而错误分成两种 (1)语法错误(这种错误过不了Python解释器的语法检测,必须在程序执行前改正) #语法错误示范一 if#语法错误示范二 def ...

  7. 基于TCP协议的网络程序(基础学习)

    下图是基于TCP协议的客户端/服务器程序的一般流程: 图 37.2. TCP协议通讯流程 服务器调用socket().bind().listen()完成初始化后,调用accept()阻塞等待,处于监听 ...

  8. 浅谈基于TCP和UDP的协议设计

    From:http://blog.sina.com.cn/s/blog_48d4cf2d0101859x.html 一个基于TCP/WebSockets的超级精简的长连接消息协议:https://st ...

  9. java socket发送定长报文_一个基于TCP协议的Socket通信实例

    原标题:一个基于TCP协议的Socket通信实例 1. 前言 一般接口对接多以http/https或webservice的方式,socket方式的对接比较少并且会有一些难度.正好前段时间完成了一个so ...

  10. 小隐隐于野:基于TCP反射DDoS攻击分析

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 作者:腾讯DDoS安全专家.腾讯云游戏安全专家 陈国 0x00 引言 近期,腾讯云防护了一次针对云上某游戏业务的混合DDoS攻击.攻击持续了 ...

最新文章

  1. echarts空数据如何设置_拼多多分时折扣如何设置优化?分时数据怎么看?
  2. mqtt 异步消息 长连接 解析
  3. answer my questions from the book构建之法.
  4. Spring Cloud依赖
  5. 99. Recover Binary Search Tree
  6. OJ1085: 求奇数的乘积(多实例测试)(C语言)
  7. Linux(CentOS 6.5)下配置Mono和Jexus并且部署ASP.NET MVC5
  8. android学习笔记---44_在线视频播放器,网络视频解析器,SurfaceView 控件使用方法
  9. UFLDL机器学习 Andrew Ng-Deep Learning课程
  10. django基于大数据的应届生求职系统--python-计算机毕业设计
  11. 解决warnings potentially fixable with the `--fix`
  12. 关于【正点原子STM32F1开发指南】第五章delay.c文件里fac_us=SystemCoreClock/8000000的保姆级详解
  13. 三菱FX系列PLC简单总结
  14. 海桂嘉积中学2021高考成绩查询,圆梦行动 “我想做记者,我想学计算机” 屯昌文武山村“高考姐妹花”的美好心愿...
  15. MATLAB之多项式插值
  16. 铣床计算机功能按哪个键,数控铣床操作面板简介
  17. 〖Python 数据库开发实战 - Python与MySQL交互篇⑮〗- 项目实战 - 实现新闻管理 - 删除新闻功能
  18. 计算机组成原理之运算方法和运算器
  19. java htmlunit 模拟输入_教大家用HtmlUnit实现程序模拟页面表单提交
  20. 个人所得税的纳税标准

热门文章

  1. Java Swing实现局域网QQ
  2. win7鼠标指针主题包_轻松办公之全局鼠标手势软件
  3. radius源码下载
  4. vmware 删除后安装不了,‍vmware workstation.msi failed
  5. 如何将SWF的FLASH转成GIF动态图片呢.
  6. MIPS单周期CPU设计——lw和sw指令的设计
  7. 傅里叶变换及其实现(MATLAB)
  8. java贪吃蛇项目总结_贪吃蛇总结
  9. 基于阶梯式Tent混沌和模拟退火的樽海鞘群算法
  10. Win11快捷键大全