品鉴同事发来的炸金花的PHP程序代码
今天同事发来了一个炸金花的PHP程序,这个代码实现了两个人通过各自的三张牌进行权重计算,得到分数进行比较得到谁的牌大,我觉得里面还有一些问题,代码如下:
- <?php
- /**
- 每张牌的分值为一个2位数,不足2位的补前导0,例如'A':14,‘10':10,'2‘:'02‘,'k‘:13,'7‘:07
- 将3张牌按点数大小排序(从大到小),凑成一个6位数。例如'A27':140702,‘829':090802,‘JK8':131108,‘2A10':141002
- 例外,对于对子要将对子的位数放在前两位(后面会看到为什么这么做)。例如‘779':070709,‘7A7':070714,‘A33':030314
- 现在的分值是一个6位数,将对子设为一个原始值加上10*100000的值,现在为一个7位数。例如‘779':1070709,‘7A7':1070714,‘A33':030314
- 对于顺子,将结果加上20*100000.。例如‘345':2050403,‘QKA':2141312,‘23A':2140302
- 对于金花,将结果加上30*100000。例如‘Spade K,Spade 6,Spade J':3131106
- 因为顺金的时候其实是金花和顺子的和,所以顺金应该是50*10000。 例如‘Spade 7,Spade 6,Spade 8':5080706
- 对于筒子,将结果加上60*100000。例如'666‘:6060606,'JJJ‘:6111111
- */
- class PlayCards{
- public $suits = ['Spade','Heart','Diamond','Club'];// spades 黑桃 hearts 红桃 clubs 草花/梅花 diamonds 方片
- public $figures = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A'];
- public $cards = [];
- public function __construct(){
- $cards = [];
- foreach($this->suits as $suit){
- foreach($this->figures as $figure){
- $cards[] = [$suit,$figure];
- }
- }
- $this->cards = $cards; //初始化一副扑克
- }
- public function getCard(){
- shuffle($this->cards); //洗牌
- return [
- array_pop($this->cards),
- array_pop($this->cards),
- array_pop($this->cards),
- ];//取出三张牌
- }
- /**
- * @param $card1
- * @param $card2
- * 比较两个人的牌
- */
- public function compareCards($card1,$card2){
- $score1 = $this->ownScore($card1);
- $score2 = $this->ownScore($card2);
- if($score1>$score2){
- return 1;
- }elseif($score1<$score2){
- return -1;
- }else{
- return 0;
- }
- }
- /**
- * @param $card
- * @return int|string
- * 处理牌型
- */
- public function ownScore($card){
- $suit = [];$figure = [];
- foreach($card as $v){
- $suit[] = $v[0];
- $figure[] = array_search($v[1],$this->figures)+2;//从$this->figures中搜索出值为$v[1]的键,并将结果+2
- }
- //补齐前导0
- for($i = 0; $i < 3; $i++){
- $figure[$i] = str_pad($figure[$i],2,'0',STR_PAD_LEFT);
- }
- rsort($figure); //将元素降序排序
- //对于对子做特殊处理
- if($figure[1] == $figure[2]){
- $temp = $figure[0];
- $figure[0] = $figure[2];
- $figure[2] = $temp;
- }
- $score = $figure[0].$figure[1].$figure[2];
- //豹子 60*100000
- if($figure[0] == $figure[1] && $figure[0] == $figure[2]){
- $score += 60*100000;
- }
- //金花 30*100000
- if($suit[0] == $suit[1] && $suit[0] == $suit[2]){
- $score += 30*100000;
- }
- //顺子 20*100000
- if($figure[0] == $figure[1]+1 && $figure[1] == $figure[2]+1 || implode($figure) =='140302'){
- $score += 20*100000;
- }
- //对子 10*100000
- if($figure[0] == $figure[1] && $figure[1] != $figure[2]){
- $score += 10*100000;
- }
- return $score;
- }
- }
- $playCard = new PlayCards();
- $card1 = $playCard->getCard();
- $card2 = $playCard->getCard();
- var_dump($card1);
- var_dump($card2);
- $result = $playCard->compareCards($card1,$card2);
- echo $result;
品鉴同事发来的炸金花的PHP程序代码的更多相关文章
- 200行代码搞定炸金花游戏(PHP版)
<?php/* * 游戏名称:炸金花(又名三张牌.扎金花) * 开发时间:2009.1.14 * 编 程:多菜鸟 * 来 源:http://blog.csdn.net/kingerq/archi ...
- XidianOJ 1044 炸金花
题目描述 炸金花是一个风靡全球的扑克游戏,不少人因为这个游戏发了家,而更多的人则输得倾家荡产.为了帮助赌徒们戒掉它,现在决定派你去写一个程序,帮助赌徒们更好的认识这个游戏. 炸金花在这里被简化成这样一 ...
- 炸金花的JS实现从0开始之 -------现在什么都不会(1)
新年结束了.回想起来唯一留下乐趣的就是在家和朋友玩玩炸金花. 遂有此文. 对不起,我这时候还没有思路. 让我捋一捋. ... ... 捋一捋啊... ... 好了.今天先这样吧: (1)先整理出所有的 ...
- 炸金花游戏(4)--炸金花AI基准测试评估
前言: 本文将谈谈如何评估测试炸金花的AI, 其实这个也代表一类的问题, 德州扑克也是类似的解法. 本文将谈谈两种思路, 一种是基于基准AI对抗评估, 另一种是基于测试集(人工选定牌谱). 由于炸金花 ...
- 炸金花游戏(3)--基于EV(期望收益)的简单AI模型
前言: 炸金花这款游戏, 从技术的角度来说, 比德州差了很多. 所以他的AI模型也相对简单一些. 本文从EV(期望收益)的角度, 来尝试构建一个简单的炸金花AI. 相关文章: 德州扑克AI--Prog ...
- 自己写的微信小程序炸金花简单版
app.json: { "pages":[ "pages/index/index" ], "window":{ "navigati ...
- akoj-1222-炸金花
炸金花 Time Limit:1000MS Memory Limit:65536K Total Submit:40 Accepted:19 Description 炸金花是一个风靡全球的扑克游戏,喜 ...
- IOS本地化。
1,项目名本地化 点击项目,蓝色图标->info 最下面+号,添加chinese本地化. Supporting Files->infoPlist.strings 下会有两个文件,有一个是设 ...
- 【Android病毒分析报告】 - ZxtdPay 吸费恶魔
本文章由Jack_Jia编写,转载请注明出处. 文章链接:http://blog.csdn.net/jiazhijun/article/details/11581543 作者:Jack_Jia ...
随机推荐
- mybatis动态sql中的两个内置参数(_parameter和_databaseId)
mybatis动态sql中的两个内置参数(_parameter和_databaseId) <!-- mybatis动态sql的两个内置参数 不只是方法传递过来的参数可以被 ...
- mongoimport 导入数据
最后 利用mongodb自带的mongoimport工具可以上传csv文件 命令如下 mongoimport -h localhost --port 27017 -d test222 -c c21 - ...
- 微信小程序文字水平垂直居中对齐问题
我们知道常用的居中对齐方式有很多种例如: text-align:center; align-items:center; justify-content: center; margin: auto; # ...
- js在IE与firefox的差别。。。
1.firefox不能对innerText支持.firefox支持innerHTML但却不支持innerText,它支持textContent来实现innerText,不过默认把多余的空格也保留了.如 ...
- 【转】25个非常实用的jQuery/CSS3应用组件
今天分享25款功能十分强大的jQuery/CSS3应用插件,欢迎收藏. 1.jQuery水晶样式下拉导航 这是一款非常不错的jQuery多功能下拉菜单插件,菜单外观呈水晶样式,晶莹剔透,功能丰富,包含 ...
- 7款开源ERP系统比较
[网络转载] 现在有许多企业将ERP项目,在企 业中没有实施好,都归咎于软件产品不好.其实,这只是你们的借口.若想要将ERP软件真正与企业融合一体,首先得考虑企业的自身情况,再去选择适合的 ERP软件 ...
- "android.uid.systemandroid.view.InflateException: Binary XML file line #7: Error inflating class android.webkit.WebView
在android源码中编译app通过,运行时出现错误: "android.uid.systemandroid.view.InflateException: Binary XML file l ...
- 第三百五十三节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy的暂停与重启
第三百五十三节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy的暂停与重启 scrapy的每一个爬虫,暂停时可以记录暂停状态以及爬取了哪些url,重启时可以从暂停状态开始爬取过的UR ...
- Java如何显示不同格式的日期?
在Java中,如何以不同的格式来显示日期? 此示例使用DateFormatSymbols().DateFormatSymbols类的getWeekdays()方法来显示时间的格式. package c ...
- sqlite学习笔记1:编译数据库
首先说下我使用的是Linux环境 一 下载源代码 官网下载:点这里 二 编译 1 解压 下载完毕之后通常会在当前用户的"下载"文件夹中,首先cd到下载文件夹,然后创建一个文件件.用 ...