通过在远端主机上搭建一个远程骰宝服务器,主机可以服务器联系,进行交互式游戏设计。

  • 游戏要求
  • 思路
  • 源码
    • bet_code_sample.py
    • server.py
    • client.py
  • 测试
  • 问题

游戏要求

规则如下:
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> 押散星(两数之和为三、五、九、十一) 一赔二

思路

在用户首次连接到服务器时,服务器发送两个骰子(作为头彩骰子号)以及游戏规则,同时将其暂时保存在列表中,之后等待用户回复;用户买定离手,客户端将消息回送给服务器端;服务器执行以下操作:随机丢出两个骰子、计算用户玩家的得失、清空暂存信息表和更新用户资金数,最后两个骰子和得失信息回送给客户端。
对于 client 端,接收到的消息被切分保存在message_list列表中:
message_list[0] 保存了标识符(rule,头彩和掷骰)用以确定执行的操作;
message_list[1]、message_list[2] 分别保存了第一个头彩骰子(或者第一个正式骰子)和第二个头彩骰子(或者第二个正式骰子);
message_list[3]、message_list[4] 分别保存了第一个正式骰子和第二个正式骰子对应的数
message_list[5] 保存了正式骰子对应的类型(头彩、七星等)
message_list[6] 保存了用户本轮的收益
对于 server 端,接收到的消息同样被切分保存在message_list列表中:
message_list[0] 保存了标识符,用以确定服务端执行的操作;
message_list[1] 用户本轮游戏选择的骰子类型
message_list[2] 用户本轮游戏所压的金额
message_list[3] 用户本轮游戏压的金额类型(金,银等)

源码

bet_code_sample.py

#!/usr/bin/env python3num_dict = {1: "一",2: "二",3: "三",4: "四",5: "五",6: "六",
}money_dict = {'gold': '金','silver': '银','coin': '铜',
}money_num = {"gold": 50,"silver": 50,"coin": 50,
}tz_type_dict = {'tc': '头彩','dc': '大彩','kp': '空盘','qx': '七星','dd': '单对','sx': '散星','zy': '庄赢',
}dice = ["""
┌─────┐
│     │
│  ●  │
│     │
└─────┘""", """
┌─────┐
│  ●  │
│     │
│  ●  │
└─────┘""", """
┌─────┐
│  ●  │
│     │
│ ● ● │
└─────┘""", """
┌─────┐
│ ● ● │
│     │
│ ● ● │
└─────┘""", """
┌─────┐
│ ● ● │
│  ●  │
│ ● ● │
└─────┘""", """
┌─────┐
│ ● ● │
│ ● ● │
│ ● ● │
└─────┘"""
]toucai = {}temp_dice = {}#记录顺序:key:地址;value:下注类型,金额,钱币类型
User = {}

server.py

import socket
import bet_code_sample
import random
import gevent
from gevent import monkeyPORT = 9999
ADDRESS = '127.0.0.1'
MAX_BYTES = 65535#产生一个随机骰子
def random_dice():num = random.randint(0 ,5)return bet_code_sample.dice[num] ,str(num+1)#选项菜单
def menu(sc):print('[+] connected with', addr)bet_code_sample.User[addr] = [0 ,0 ,0 ,bet_code_sample.money_num]while True:data = sc.recv(MAX_BYTES)message = data.decode('utf-8')message_list = message.split('@')if message_list[0] == 'rule':message = ('rule@规则如下:\n''ya tc <数量> <coin|silver|gold> 押头彩(两数顺序及点数均正确)      一赔三十五\n''ya dc <数量> <coin|silver|gold> 押大彩(两数点数正确)      一赔十七\n''ya kp <数量> <coin|silver|gold> 押空盘(两数不同且均为偶数)       一赔五\n''ya qx <数量> <coin|silver|gold> 押七星(两数之和为七)      一赔五\n''ya dd <数量> <coin|silver|gold> 押单对(两数均为奇数)      一赔三\n''ya sx <数量> <coin|silver|gold> 押散星(两数之和为三、五、九、十一)   一赔二\n')elif message_list[0] == 'begin':dice1, num1 = random_dice()dice2, num2 = random_dice()# 头彩骰子存入数组bet_code_sample.toucai[addr] = [dice1 ,dice2]message = '头彩' + '@' + dice1 + '@' + dice2 + '@' + num1 + '@' + num2elif message_list[0] == 'cheak':message = '金' + str(bet_code_sample.User[addr][3]['gold']) + ';' +\'银' + str(bet_code_sample.User[addr][3]['silver']) + ';' +\'铜' + str(bet_code_sample.User[addr][3]['coin']) + '\n'elif message_list[0] == 'exit':reply = 'finished'return replyelse:if int(bet_code_sample.User[addr][3][message_list[2]]) < int(message_list[1]):message = 'deficient'else:print('有鱼上钩了')#记录顺序:key:地址;value:类型,金额,钱币类型,用户初始账户金钱bet_code_sample.User[addr][0] = message_list[0]bet_code_sample.User[addr][1] = message_list[1]bet_code_sample.User[addr][2] = message_list[2]print(bet_code_sample.User)#4、发送随机骰子dice1, num1 = random_dice()dice2, num2 = random_dice()bet_code_sample.temp_dice[addr] = [dice1 ,dice2]response, additional = result(addr ,num1, num2)profit = calculate(response, additional, addr)message = '掷骰' + '@' + dice1 + '@' + dice2 + '@' + num1 + '@' + num2 + '@' + response + '@' + profitdata = message.encode('utf-8')sc.sendall(data)#返回对应骰子类型
def result(addr ,num1 ,num2):additional = 'None'#注:是头彩一定是大彩if ((num1 == bet_code_sample.toucai[addr][0]) and (num2 == bet_code_sample.toucai[addr][1])) or \((num1 == bet_code_sample.toucai[addr][1]) and (num2 == bet_code_sample.toucai[addr][0])):if (num1 == bet_code_sample.toucai[addr][0]) and (num2 == bet_code_sample.toucai[addr][1]):additional = 'tc'else:additional = 'dc'if (num1 != num2) and (int(num1) % 2 == 0) and (int(num2) % 2 == 0):return 'kp' ,additionalelif (int(num1) + int(num2)) == 7:return 'qx' ,additionalelif (int(num1) % 2 == 1) and (int(num2) % 2 == 1):return 'dd' ,additionalelif (int(num1) + int(num2)) in [3 ,5 ,9 ,11]:return 'sx' ,additionalelse:return 'None' ,additional#计算对应内容的收益,返回字符串
def calculate(response ,additional ,addr):money_type = bet_code_sample.User[addr][2]#特殊情况response为头彩时if additional != 'None':if bet_code_sample.User[addr][0] == additional:if additional == 'tc':#赋予该用户新的金钱持有数bet_code_sample.User[addr][3][money_type] = str(int(bet_code_sample.User[addr][3][money_type]) + int(bet_code_sample.User[addr][1]) * 34)return '+' + str(int(bet_code_sample.User[addr][1]) * 34) + ' ' + bet_code_sample.money_dict[bet_code_sample.User[addr][2]]elif additional == 'dc':bet_code_sample.User[addr][3][money_type] = str(int(bet_code_sample.User[addr][3][money_type]) + int(bet_code_sample.User[addr][1]) * 17)return '+' + str(int(bet_code_sample.User[addr][1]) * 17) + ' ' + bet_code_sample.money_dict[bet_code_sample.User[addr][2]]#其他情况response等于压的注if response == bet_code_sample.User[addr][0]:if response == 'kp' or response == 'qx':bet_code_sample.User[addr][3][money_type] = str(int(bet_code_sample.User[addr][3][money_type]) + int(bet_code_sample.User[addr][1]) * 4)return '+' + str(int(bet_code_sample.User[addr][1]) * 4) + ' ' + bet_code_sample.money_dict[bet_code_sample.User[addr][2]]elif response == 'dd':bet_code_sample.User[addr][3][money_type] = str(int(bet_code_sample.User[addr][3][money_type]) + int(bet_code_sample.User[addr][1]) * 2)return '+' + str(int(bet_code_sample.User[addr][1]) * 2) + ' ' + bet_code_sample.money_dict[bet_code_sample.User[addr][2]]elif response == 'sx':bet_code_sample.User[addr][3][money_type] = str(int(bet_code_sample.User[addr][3][money_type]) + int(bet_code_sample.User[addr][1]) * 1)return '+' + str(int(bet_code_sample.User[addr][1]) * 1) + ' ' + bet_code_sample.money_dict[bet_code_sample.User[addr][2]]else:bet_code_sample.User[addr][3][money_type] = str(int(bet_code_sample.User[addr][3][money_type]) - int(bet_code_sample.User[addr][1]) * 1)return '-' + str(int(bet_code_sample.User[addr][1])) + ' ' + bet_code_sample.money_dict[bet_code_sample.User[addr][2]]if __name__ == '__main__':monkey.patch_all()# 创建空套接字sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 地址端口绑定sock.bind((ADDRESS, PORT))# 端口监听,且限制后备连接数为5sock.listen(5)print('listen at', sock.getsockname())while True:sc ,addr = sock.accept()gevent.spawn(menu ,sc)sock.close()sc.close()

client.py

import socket
import sys
import os
import bet_code_sample
import time
import randomPORT = 9999
MAX_BYTES = 65535#连接服务端
def init_connection(sock):addr = input('请输入游戏服务器地址:\n')try:#连接地址端口sock.connect((addr ,PORT))except Exception:print('Error')sys.exit()print('连接成功!')return addr#实现屏幕摇骰子特效
def dice_Special_effects(dice_data=None ,rule=None):if dice_data == None:count = random.randint(10 ,15)for i in range(count):print(rule)print('庄家唱道:新开盘!预叫头彩!')print('第一次掷骰子:')print(bet_code_sample.dice[random.randint(0 ,5)])time.sleep(0.01+0.001*i*i)os.system('cls')else:count = random.randint(10 ,15)for i in range(count):print(rule)print('庄家唱道:新开盘!预叫头彩!')print('第一次掷骰子:')print(dice_data)print('第二次掷骰子:')print(bet_code_sample.dice[random.randint(0 ,5)])time.sleep(0.01+0.001*i*i)os.system('cls')print(rule)print('第一次掷骰子:')print(dice_data)print('第二次掷骰子:')#消息处理
def msgmng(message ,rule=None):while True:message_list = message.split('@')if message_list[0] == 'rule':return messageelif message_list[0] == '头彩':dice_Special_effects(rule=rule)print(message_list[1])dice_Special_effects(message_list[1] ,rule)print(message_list[2])print('庄家唱道:头彩骰号是' + bet_code_sample.num_dict[int(message_list[3])] + '、' + bet_code_sample.num_dict[int(message_list[4])] + '!')elif message_list[0] == '掷骰':dice_Special_effects(rule=rule)print(message_list[1])dice_Special_effects(message_list[1], rule)print(message_list[2])print('庄家叫道:' + bet_code_sample.num_dict[int(message_list[3])] + '、' +bet_code_sample.num_dict[int(message_list[4])] + '......' + bet_code_sample.tz_type_dict[message_list[5]] + '!')print('您的净收益为:' + message_list[6])return message#消息发送接受
def msgsend_rcv(sock ,message):data = message.encode('utf-8')sock.sendall(data)data = sock.recv(MAX_BYTES)message = data.decode('utf-8')return message#持续连接状态下进行的操作
def connecting(sock):#显示规则rule = msgsend_rcv(sock, 'rule')print(rule)os.system('pause')while True:message = msgsend_rcv(sock, 'begin')#显示摇骰子  头彩  特效msgmng(message ,rule = rule)#用户操作投注while True:temp_message = input('请输入:\n''投注(如:ya tc 10 gold)\n''退出:exit\n''查看金钱:cheak\n')temp_message_list = temp_message.split(' ')if temp_message_list[0] == 'exit':message = 'exit'msgsend_rcv(sock, message)sock.close()breakelif temp_message_list[0] == 'cheak':message = 'cheak'message = msgsend_rcv(sock, message)print(message)time.sleep(0.001)elif temp_message_list[0] == 'ya':try:if bet_code_sample.tz_type_dict[temp_message_list[1]]:if int(temp_message_list[2]):if bet_code_sample.money_num[temp_message_list[3]]:message = temp_message_list[1] + '@' + temp_message_list[2] + '@' + temp_message_list[3]breakexcept Exception:passprint('请重新输入!')message = msgsend_rcv(sock, message)if message == 'deficient':print('资金不足!请充值!')else:# 显示摇骰子  真骰子  特效msgmng(message ,rule=rule)os.system('pause')if __name__ == '__main__':# 空套接字创建sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)addr = init_connection(sock)connecting(sock)

测试

服务器连接:

玩家押注:

居然赚钱了:

查看金钱(默认均为50):

问题

1、暂存界面有些地方文字显示有些许错误,但是不涉及关键的代码,也懒得改了
2、对比网上大部分的代码来看,着重将投掷骰子的代码放在服务器端的代码中,扔出来以后再发送给客户端,这样一来可以避免客户修改客户端代码达到无限谋利的情况,二来我可以随时更改投骰子的算法(现在采用的时简单的随机数种子生成器即random),以达到商家骗取玩家金钱的目的。因此,千万记得,赌博害人啊!!!

python----------基于TCP的交互式游戏设计相关推荐

  1. 基于python的游戏设计与实现-基于Python的网络中国象棋游戏设计与实现

    基于Python的网络中国象棋游戏设计与实现 摘要中国象棋是一种家喻户晓的棋类游戏,随着互联网时代的到来,人们的娱乐方式也逐渐向PC端和移动端上发展.本文将传统的中国象棋游戏和当下的互联网技术结合作为 ...

  2. 基于java的扫雷论文_毕业论文基于JAVA的扫雷游戏设计

    毕业论文基于JAVA的扫雷游戏设计 课 程 设 计 报 告 课程名称: 计算机技术综合课程设计 题 目: 基于JAVA语言的扫雷游戏设计 学 院: 信息工程 系: 计算机 专 业: 计算机科学与技术 ...

  3. 基于verilog贪吃蛇游戏设计

    概述 基于verilog贪吃蛇游戏设计.使用verilog语言 小游戏主要分为以下几个模块:顶层模块.VGA显示模块.蛇身控制模块.苹果控制模块. 系统主要分为顶层模块.VGA显示模块.蛇身控制模块. ...

  4. 信息系html5论文,基于HTML5的智力游戏设计电子信息工程本科学生毕业论文.doc

    基于HTML5的智力游戏设计电子信息工程本科学生毕业论文 本科学生毕业论文(设计) 题目(中文):基于HTML5的智力游戏设计 (英文):Design of Intelligent Game Base ...

  5. android五子棋设计模板,基于android的五子棋游戏设计

    内容介绍 原文档由会员 hfnmb 发布 基于Android的五子棋游戏设计 软件工程 [摘 要]本论文主要阐述以面向对象的程序开发语言eclipse为开发工具, 基于智能手机Android之上设计一 ...

  6. 基于MATLAB的拼图游戏设计(图文详解,附完整代码)

                                                                               基于MATLAB的拼图游戏设计 内容摘要:MATL ...

  7. ​基于STM32F407的五子棋游戏设计​

    本博客为资源:基于STM32F407的五子棋游戏设计内的说明文档. 目录 一.设计目标 三.设计方案 1.游戏模式 2.游戏过程 3.游戏设计 四.硬件配置 1.TFT-LCD液晶屏模块 (1)工作原 ...

  8. java程序实现剪刀石头布功能_基于JAVA的剪刀石头布游戏设计——Java课程设计报告_...

    基于JAVA的剪刀石头布游戏设计 1剪刀石头布游戏设计思路阐述 在设计游戏时,我们要充分考虑到剪刀石头布游戏的特性,以及多种技术的实现: ⑴构造创建服务器端和客户端 ⑵创建输入输出流 ⑶编写服务器端处 ...

  9. c语言打地鼠窗口设计,基于单片机的打地鼠游戏设计

    覃丽姗 李宁 王恬灏 摘 要:打地鼠游戏是人们生活中常见的一种休闲小游戏,尤其受儿童的喜爱.打地鼠游戏玩法简单,考验人们的反应速度,能够充分的锻炼孩子的手眼协调能力.本文设计一种基于单片机的打地鼠游戏 ...

  10. Python零基础速成班-第11讲-Python日志Logging,小游戏设计game of life

    Python零基础速成班-第11讲-Python日志Logging,小游戏设计game of life 学习目标 Python日志Logging 小游戏设计game of life 课后作业(2必做) ...

最新文章

  1. ajax hapi上传文件,javascript – hapi.js Cors Pre-flight不返回Access-Control-Allow-Origin标头...
  2. Go语言写的解析器(支持json,linq,sql,net,http等)
  3. mysql 5.7.15 安装_mysql 5.7.15 安装配置方法图文教程
  4. 记一次内核模块查看 - 初步通过文件厂商判断有无可疑内核模块
  5. nginx反向代理tomcat时遇到一个问题
  6. 计算机无法用telnet,为何我的电脑cmd没法使用telnet命令?
  7. ORACLE修改表信息
  8. ACCESS数据库增强器需求及介绍
  9. 本html添加可信站点,js实现添加可信站点、修改activex安全设置,禁用弹出窗口阻止程序...
  10. 手把手教你用ls-dyna做入水冲击荷载仿真分析(一)大体介绍
  11. 想和你去吹吹风(张学友演唱歌曲)
  12. 帝国cms配置php,帝国cms如何安装
  13. 淘宝直播全屏页重排算法实践
  14. 六款自适应引导页HTML源码
  15. SQL server 获取一周前到两周后之间的所有日期
  16. IOS(iPad、iPhone)删除已下载系统更新
  17. 研究数字基带信号功率谱的意义
  18. java-php-python-ssm漠河旅游官网计算机毕业设计
  19. 股市逃顶的技巧和方法
  20. 传统目标跟踪方法简介

热门文章

  1. 静止轨道卫星几何校正——FY-4A几何校正(风云系列静止卫星可以参考)
  2. android手机常用浏览器,Android手机 三大浏览器对比评测
  3. java调用WebService接口工具
  4. Oracle的CaseWhen
  5. java 执行class文件
  6. 乐忧商城项目总结-5
  7. 素数表(Prime number table)
  8. 毕设-基于SSM仓库管理系统
  9. [原创]开心农场助手V1.21 发布
  10. ie加载项存在残留是什么_残余IE加载项无法修复