访问http://localhost:8888/game随机获取一张扑克牌。
豹子(炸弹):三张点相同的牌。例:AAA、222。
顺金(同花顺、色托):花色相同的顺子。例:黑桃456、红桃789。最大的顺金为花色相同的JQK,最小的顺金为花色相同的123。
金花(色皮):花色相同,非顺子。例:黑桃368,方块145。
顺子(拖拉机):花色不同的顺子。例:黑桃5红桃6方块7。最大的顺子为花色不同的QKA,最小的顺子为花色不同的123。
对子:两张点数相同的牌。例:223,334。
单张:三张牌不组成任何类型的牌。

思路:
1、发牌
2、获取牌面花色和值
3、判断牌的性质,如:金花、顺子、对子···
4、对比双方的牌
5、返回状态:谁胜谁负,以及双方的牌
6、渲染到前端页面

项目结构:

rule.py:扎金花规则

import random

class Rule(object):

    def __init__(self):
''' 初始化的时候就赋予玩家一和玩家二各3张牌 '''
self.data = list(range(0, 52)) self.player1 = []
for i in range(0, 3):
poker = self.deal()
self.player1.append({
'color': poker[0],
'value': poker[1]}) self.player2 = []
for i in range(0, 3):
poker = self.deal()
self.player2.append({
'color': poker[0],
'value': poker[1]}) def deal(self):
''' 发牌规则 '''
data = random.choice(self.data)
index = self.data.index(data)
self.data.pop(index)
if data < 13:
color = 'black'
value = data % 13 + 1
if value == 1:
value == 14
elif data < 26:
color = 'red'
value = data % 13 + 1
if value == 1:
value == 14
elif data < 39:
color = 'cube'
value = data % 13 + 1
if value == 1:
value == 14
elif data < 52:
color = 'plum'
value = data % 13 + 1
if value == 1:
value == 14
return color, value def compare_value(self, data1, data2):
''' 先对其进行排序,排序后便于比较。
data1: 这里是pai1的牌面值
data2: 这里是pai2的牌面值
'''
data1.sort(reverse=True)
data2.sort(reverse=True)
for i in range(0, 3):
if data1[i] == data2[i]:
continue
elif data1[i] > data2[i]:
return 1
else:
return 2 def get_color(self, player):
''' 获取花色 '''
color = []
for poker in player:
color.append(poker['color'])
return color def get_value(self, player):
''' 获取牌面值 '''
value = []
for poker in player:
value.append(poker['value'])
return value def is_jinhua(self, player):
''' 判断是否为金花:花色相同,非顺子。例:黑桃368,方块145 '''
data = self.get_color(player)
if data[0] != data[1] or \
data[0] != data[2] or \
data[1] != data[2]:
return False
else:
return True def is_triple(self, player):
''' 判断否为豹子:三个数相同 '''
data = self.get_value(player)
if data[0] == data[1] and data[1] == data[2] and data[0] == data[2]:
return True
else:
return False def is_shunzi(self, player):
''' 判断是否为花色不同的顺子。例:黑桃5红桃6方块7 '''
data = self.get_value(player)
data.sort(reverse=True)
if data[0] - data[1] == 1 and data[1] - data[2] == 1 and data[0] - data[2] == 2:
return True
else:
return False def is_shunjin(self, player):
''' 判断是否为顺金 '''
if self.is_shunzi(player) and self.is_jinhua(player):
return True
else:
return False def is_pair(self, player):
''' 判断是否为对子 '''
data = self.get_value(player)
if data[0] == data[1] or data[1] == data[2] or data[0] == data[2]:
return True
else:
return False def find_pair(self, player):
''' 如果是对子,找出哪两张牌是一对 '''
data = self.get_value(player)
if data[0] == data[1]:
return 0, 1
if data[1] == data[2]:
return 1, 2
if data[0] == data[2]:
return 0, 2 def compare_baozi(self):
''' 豹子之间比较大小 '''
if self.is_triple(self.player1) and not self.is_triple(self.player2):
return 1
if not self.is_triple(self.player1) and self.is_triple(self.player2):
return 2
if not self.is_triple(self.player1) and not self.is_triple(self.player2):
return None
if self.is_triple(self.player1) and self.is_triple(self.player2):
data1 = self.get_value(self.player1)
data2 = self.get_value(self.player2)
return self.compare_value(data1, data2) def compare_shunjin(self):
''' 顺金之间比大小 '''
if self.is_shunjin(self.player1) and not self.is_shunjin(self.player2):
return 1
if not self.is_shunjin(self.player1) and self.is_shunjin(self.player2):
return 2
if not self.is_shunjin(self.player1) and not self.is_shunjin(self.player2):
return None
if self.is_shunjin(self.player1) and self.is_shunjin(self.player2):
data1 = self.get_value(self.player1)
data2 = self.get_value(self.player2)
return self.compare_value(data1, data2) def compare_jinhua(self):
''' 金花之间比大小 '''
if self.is_jinhua(self.player1) and not self.is_jinhua(self.player2):
return 1
if not self.is_jinhua(self.player1) and self.is_jinhua(self.player2):
return 2
if not self.is_jinhua(self.player1) and not self.is_jinhua(self.player2):
return None
if self.is_jinhua(self.player1) and self.is_jinhua(self.player2):
data1 = self.get_value(self.player1)
data2 = self.get_value(self.player2)
return self.compare_value(data1, data2) def compare_shunzi(self):
''' 关于顺子的比较 '''
# 顺子大于非顺子
if self.is_shunzi(self.player1) and not self.is_shunzi(self.player2):
return 1
if not self.is_shunzi(self.player1) and self.is_shunzi(self.player2):
return 2
if not self.is_shunzi(self.player1) and not self.is_shunzi(self.player2):
return None
# 都是顺子的话比较大小
if self.is_shunzi(self.player1) and self.is_shunzi(self.player2):
data1 = self.get_value(self.player1)
data2 = self.get_value(self.player2)
return self.compare_value(data1, data2) def compare_pair(self):
''' 对子之间的比较例:223,334 '''
if self.is_pair(self.player1) and not self.is_pair(self.player2):
return 1
if not self.is_pair(self.player1) and self.is_pair(self.player2):
return 2
if not self.is_pair(self.player1) and not self.is_pair(self.player2):
return None
if self.is_pair(self.player1) and self.is_pair(self.player2):
data1 = self.get_value(self.player1)
data2 = self.get_value(self.player2)
f1, s1 = self.find_pair(self.player1)
f2, s2 = self.find_pair(self.player2)
if data1[f1] > data2[f2]:
return 1
elif data1[f1] < data2[f2]:
return 2
else:
data1.pop(f1)
data1.pop(s1)
data2.pop(f2)
data2.pop(s2)
if data1[0] > data2[0]:
return 1
elif data1[0] < data2[0]:
return 2
else:
return 3 def comapre_common(self):
''' 这里是一般性的比较,不是豹子,顺子,金花等(散牌) '''
data1 = self.get_value(self.player1)
data2 = self.get_value(self.player2)
return self.compare_value(data1, data2) def compare(self):
''' 比较双方的牌 '''
player1, player2 = self.wrapper()
flag = self.compare_baozi()
if flag is not None:
return flag, player1, player2
flag = self.compare_shunjin()
if flag is not None:
return flag, player1, player2
flag = self.compare_jinhua()
if flag is not None:
return flag, player1, player2
flag = self.compare_shunzi()
if flag is not None:
return flag, player1, player2
flag = self.compare_pair()
if flag is not None:
return flag, player1, player2
flag = self.comapre_common()
if flag is not None:
return flag, player1, player2 def wrapper(self):
''' 拼接玩家一二玩家二的牌的图片,用于展示 '''
player1 = []
for poker in self.player1:
player1.append(poker['color'] + '_' + str('{0:02}'.format(poker['value']))+'.jpg')
player2 = []
for poker in self.player2:
player2.append(poker['color'] + '_' + str('{0:02}'.format(poker['value'])) + '.jpg')
return player1, player2 if __name__ == '__main__':
rule = Rule()
print(rule.compare())

game.html:前端渲染页面:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>扎金花</title>
</head>
<body>
{% for poker in player1 %}
<img src="/static/poker/{{ poker }}"/>
{% endfor %}
<br>
{% for poker in player2 %}
<img src="/static/poker/{{ poker }}"/>
{% endfor %}
<br>
<h1>恭喜玩家{{ status }}获胜!</h1>
</body>
</html>

zhaJinHua.py:主程序

from flask import Flask
from flask import render_template
from rule import Rule app = Flask(__name__) @app.route('/game')
def game():
rule = Rule()
status, player1, player2 = rule.compare()
return render_template('game.html', status=status, player1=player1, player2=player2) if __name__ == '__main__':
app.run(
host='0.0.0.0',
port=8888,
debug=True,
)

最后实现效果:

测开之路三十三:Flask实现扎金花游戏的更多相关文章

  1. 测开之路三十二:Flask基础之错误与重定向

    错误处理,框架默认的错误为:not Found 可以捕获,并自定义 准备一张自定义图片,放在static文件夹下,并在template下创建一个html文件,引用该图片 捕获404状态,返回自定义页面 ...

  2. 测开之路三十一:Flask基础之请求与相应

    from flask import requestrequest.pathrequest.methodrequest.formrequest.argsrequest.values 一般用form获取p ...

  3. 测开之路三十:Flask基础之jinja2模板继承

    实现某些位置的内容固定,某些位置的内容动态展示,如: 中文文档地址:http://docs.jinkan.org/docs/jinja2/templates.html#template-inherit ...

  4. 测开之路八十三:高级函数:map()和filter()

    # map(函数名,可迭代对象)# 给可迭代对象的每个值+5l = list(range(1, 21)) def add_number(x):    return x + 5 # 第一种方式print ...

  5. 测开之路七十三:用kafka实现消息队列之环境搭建

    一:装java环境,确保java能正确调用 kafka下载地址:http://kafka.apache.org/downloads 下载并解压kafka: 新建两个文件夹,用于存放zookeeper和 ...

  6. 测开之路六十三:UI测试平台之视图层

    实现效果,在页面时配置 后台执行 蓝图结构 视图代码 from flask import jsonifyfrom flask import requestfrom flask import Bluep ...

  7. 测开之路五十三:unittest运行参数

    Fixture:进行测试前的准备工作和测试后的清理操作.例如创建临时或是代理数据库,目录,服务进程等.用例(Case):最小的测试单元,检车特定输入的响应.TestCase作为所有用例的基类,测试ca ...

  8. 测开之路三十九:js基础

    js的两种使用方式 第一种使用方式:单独写js文件 在static下新建一个js文件并写入内容 alert('这是一个弹窗'); 在html文件里面,用script标签引入 <script sr ...

  9. 测开之路三十八:css布局之定位

    常用的布局方式: static:静态定位(默认),什么都不用管,元素会按照默认顺序排列,排不下是会默认换行relative:相对定位(同一层),相对于某一个元素进行定位fixed:绝对定位,指定位置a ...

随机推荐

  1. 1、Laravel 环境配置及安装

    一.开发工具及环境 PHPStorm + phpStudy 最新版 Composer 安装 https://www.phpcomposer.com/ 下载就可以,设置中国镜像 安装完成后 compos ...

  2. ERROR [localhost-startStop-1] - Context initialization failed org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from ServletContext resource [/WEB-INF/ap

    ERROR [localhost-startStop-1] - Context initialization failed org.springframework.beans.factory.Bean ...

  3. Linux-第二篇常用命令

    1.常用目录文件操作命令 cd:切换目录 格式:cd 目录 ls:显示文件和目录列表.可选参数: -l 列出文件的详细信息 -a 列出当前目录所有文件,包含隐藏文件 ll:查看目录接口,相当于是ls ...

  4. c#批量插入

    一.创建一个用来测试的数据库和表 USE [Test] GO /****** Object: Table [dbo].[student] Script Date: 2019/4/11 15:38:59 ...

  5. [暑假集训Day2T3]团建活动

    个人认为这周题中较难的一道. 题意大概为:给定一张N个点M条边的无向图,求出无向图的一棵最小生成树,满足一号节点的度数不超过给定的整数K.保证 N <= 20 首先用map存取节点,之后抛去1号 ...

  6. P4036 [JSOI2008]火星人(splay+hash+二分)

    P4036 [JSOI2008]火星人 Splay维护hash,查询二分 $a[x].vl=a[lc].vl*ha[a[rc].sz+1]+a[x].w*ha[a[rc].sz]+a[rc].vl$ ...

  7. 烂漫爱心表白动画 分类: C# 2014-10-07 19:08 28人阅读 评论(0) 收藏

    曾经我说过我会用程序来表达我对你的爱. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &quo ...

  8. JavaScript的进制转换

    先介绍两个API: 一.number 类型的 toString 方法 语法 JavaScript: numberObject.toString( [ radix ] ) 参数 参数 描述 radix ...

  9. 如何判断元素是否在可视区域内--getBoundingClientRect

    介绍 Element.getBoundingClientRect()方法返回元素的大小及其相对于视口的位置. 根据MDN文档 getBoundingClientRect 方法返回的是一个DOMRect ...

  10. ahocorasick使用

    一.作用 字符串匹配,比如现在有个大的列表,客户输入一句话,如何根据客户输入的一句话,从大列表中匹配出字符串交集 具体请详细查阅 二.示例 比如我们有一个wordlist列表,长度很长,包含43430 ...