PHP实现扎金花游戏之大小比赛的方法

本文实例讲述了PHP实现扎金花游戏之大小比赛的方法。分享给大家供大家参考。具体分析如下:

程序离不开算法,前面讨论过寻路的算法。不过,当时的示例图中,可选的路径是唯一的。我们挑选一个算法,就是说要把这个唯一的路径选出来,怎么选呢?

还记得上初中的时候经常下午放学就躲在路边扎金花来赌*钱,貌似还上瘾了,现在过年的时候还经常一起扎金花赌*钱,但运气不啥好,每次都是输啊。

今天阳光明媚,由于清明节才出去玩了,所以今天没有去哪。闲着没事就想了下怎么用程序实现金花中两幅牌的大小比较,现在把它实现了,有些方法还是蛮重要的,因此就记下来。

好了,不废话了。

扎金花两副牌的比较规则就不说了,注明一下是顺子的时候 : JQK < A23 < QKA

思路:扎金花

1. 随机生成两幅牌,每副牌结构为

代码如下:

array( 
    array('Spade','K'), 
    array('Club','6'), 
    array('Spade','J'), 
)

代码如下:

array( 
    array('Spade','K'), 
    array('Club','6'), 
    array('Spade','J'), 
)

2. 计算每副牌的分值:每副牌有个原始大小(即排除对子,顺子,金花,顺金,筒子的大小),再

每张牌的分值为一个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':1030314

对于顺子,将结果加上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

3. 比较两幅牌的大小(用所计算的分值来比较)

就这么简单!!

代码如下(PHP)

代码如下:

<?php 
class PlayCards 

    public $suits = array('Spade', 'Heart', 'Diamond', 'Club'); 
    public $figures = array('2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A'); 
    public $cards = array(); 
    public function __construct() 
    { 
        $cards = array(); 
        foreach($this->suits as $suit){ 
            foreach($this->figures as $figure){ 
                $cards[] = array($suit,$figure); 
            } 
        } 
        $this->cards = $cards; 
    } 
    public function getCard() 
    { 
        shuffle($this->cards); 
        //生成3张牌 
        return array(array_pop($this->cards), array_pop($this->cards), array_pop($this->cards));    
    } 
    public function compareCards($card1,$card2) 
    { 
        $score1 = $this->ownScore($card1); 
        $score2 = $this->ownScore($card2); 
        if($score1 > $score2) return 1; 
        elseif($score1 < $score2) return -1; 
        return 0;        
    } 
    private function ownScore($card) 
    { 
        $suit = $figure = array(); 
        foreach($card as $v){ 
            $suit[] = $v[0]; 
            $figure[] = array_search($v[1],$this->figures)+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; 
    } 

 
//test 
$playCard = new PlayCards(); 
$card1 = $playCard->getCard(); 
$card2 = $playCard->getCard(); 
$result = $playCard->compareCards($card1,$card2);

echo 'card1 is ',printCard($card1),'<br/>'; 
echo 'card2 is ',printCard($card2),'<br/>'; 
$str = 'card1 equit card2'; 
if($result == 1) $str =  'card1 is larger than card2'; 
elseif($result == -1) $str = 'card1 is smaller than card2'; 
echo $str; 
function printCard($card) 

    $str = '('; 
    foreach($card as $v){ 
        $str .= $v[0].$v[1].','; 
    } 
    return trim($str,',').')'; 
}

代码如下:

<?php 
class PlayCards 

    public $suits = array('Spade', 'Heart', 'Diamond', 'Club'); 
    public $figures = array('2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A'); 
    public $cards = array(); 
    public function __construct() 
    { 
        $cards = array(); 
        foreach($this->suits as $suit){ 
            foreach($this->figures as $figure){ 
                $cards[] = array($suit,$figure); 
            } 
        } 
        $this->cards = $cards; 
    } 
    public function getCard() 
    { 
        shuffle($this->cards); 
        //生成3张牌 
        return array(array_pop($this->cards), array_pop($this->cards), array_pop($this->cards));    
    } 
    public function compareCards($card1,$card2) 
    { 
        $score1 = $this->ownScore($card1); 
        $score2 = $this->ownScore($card2); 
        if($score1 > $score2) return 1; 
        elseif($score1 < $score2) return -1; 
        return 0;        
    } 
    private function ownScore($card) 
    { 
        $suit = $figure = array(); 
        foreach($card as $v){ 
            $suit[] = $v[0]; 
            $figure[] = array_search($v[1],$this->figures)+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; 
    } 

 
//test 
$playCard = new PlayCards(); 
$card1 = $playCard->getCard(); 
$card2 = $playCard->getCard(); 
$result = $playCard->compareCards($card1,$card2);

echo 'card1 is ',printCard($card1),'<br/>'; 
echo 'card2 is ',printCard($card2),'<br/>'; 
$str = 'card1 equit card2'; 
if($result == 1) $str =  'card1 is larger than card2'; 
elseif($result == -1) $str = 'card1 is smaller than card2'; 
echo $str;

function printCard($card) 

    $str = '('; 
    foreach($card as $v){ 
        $str .= $v[0].$v[1].','; 
    } 
    return trim($str,',').')'; 
}

希望本文所述对大家的php程序设计有所帮助。

(0)

相关推荐

  • php实现贪吃蛇小游戏

    贪吃蛇游戏是经典手机游戏,既简单又耐玩.通过控制蛇头方向吃蛋,使得蛇变长,从而获得积分.在诺基亚时代,风靡整个手机界,今天我们来看看另类的,如何使用php来实现贪吃蛇小游戏 废话不多说,代码奉上: control.php <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> </head> <body>  <a href="control.php

  • jQuery+PHP实现的掷色子抽奖游戏实例

    本文实例讲述了jQuery+PHP实现的掷色子抽奖游戏详细步骤.分享给大家供大家参考.具体分析如下: 该游戏是以大富翁游戏为背景,综合运用jQuery和PHP知识,设计出以掷色子点数来达成抽奖的效果,当然抽奖概率是可控的,开发者可以将本实例稍作修改即可运用到网站中的抽奖活动场景中.效果图如下: 完整实例代码点击此处本站下载. HTML部分: 首先我们需要准备两粒色子和奖品素材,这些作者已经打包上传了,请大家放心下载.我们将在html页面中写下如下的html结构代码,.wrap用来放置色子和提示信

  • PHP网页游戏学习之Xnova(ogame)源码解读(一)

    一. 引言 xnova(ogame)是一款世界上最火的战争策略类网页游戏之一,也是大部分同类网页游戏效仿的对象.你只需要网页浏览器,无需下载客户端就可进行的网络游戏. Xnova是个怎么样的游戏? 你是一个跨星系的统治者,利用不同的战略扩大你的实力.你将从一个自己的星球上开始你的事业,在那里你用现有的资源建造一个你的经济和军事基础.通过科学 研究你获得达到新的.优势的技术的入口和新的武器系统.随着游戏的进行你将对多个星球移民,与其它的玩家联盟,与其它的玩家作生意或者发动战争.无论你想 要做什么,

  • php实现的简易扫雷游戏实例

    本文实例讲述了php实现的简易扫雷游戏.分享给大家供大家参考.具体如下: <?php $init = $_POST["init"];//game restart $clickvalue = $_POST["clickvalue"];//minesweeping $checkflag = 0;//Victory or defeat $click_count = 0;//clicks count if($init == null && $click

  • php 网页游戏开发入门教程一(webgame+design)

    一.简单的程序框架. webgame程序构成: 三大部分. 第一是数据流程.第二是程序.第三是美术. 其中,数据流程包括了功能.也只有在功能中才能体现数据流程. 数据流程相当的麻烦,后面再讨论. 比如最简单的卖买产品. 要实现这个功能. 那么需要有产品基础表.产品详细表.商店表.背包表.如果扩展性更强,相应的双表是少不不了的. 表的问题都简单了.关键是这个物品有什么用.这样物品的来源,一大堆数据,物品的走向,又是一大堆数据. 最后,这些数据得绕成一个圈. 绕圈是一件困难的事情.特别是功能和道具多

  • php猜单词游戏

    直接复制本地运行就可以了 <?php session_start(); header("Content-type:text/html;charset=utf-"); $url='http://'$_SERVER['HTTP_HOST']$_SERVER['PHP_SELF']; function get_word(){ $wordtext="Redistribution and use in source and binary forms, with or withou

  • php实现的网页版剪刀石头布游戏示例

    本文实例讲述了php实现的网页版剪刀石头布游戏.分享给大家供大家参考,具体如下: <?php /* * Created on 2016-11-25 * */ if (isset($_POST['sub'])) { $what = $_POST['what']; //需要输入的数组 $my_array = array("剪刀","石头","布"); //获胜规则 $guize = array(array("剪刀",&quo

  • PHP游戏编程25个脚本代码

    清单 1.简单的掷骰器 许多游戏和游戏系统都需要骰子.让我们先从简单的部分入手:掷一个六面骰子.实际上,滚动一个六面骰子就是从 1 到 6 之间选择一个随机数字.在 PHP 中,这十分简单:echo rand(1,6);. 在许多情况下,这基本上很简单.但是在处理机率游戏时,我们需要一些更好的实现.PHP 提供了更好的随机数字生成器:mt_rand().在不深入研究两者差别的情况下,可以认为 mt_rand 是一个更快.更好的随机数字生成器:echo mt_rand(1,6);.如果把该随机数字

  • php数字游戏 计算24算法

    算法思路:把每一个数字看做一个独立的数学表达式,表达式之间加上标点符号组合成新表达式,一共组合4次,表达式之间的所有组合可以通过递归来实现. 代码如下: 复制代码 代码如下: <?php /** * A 24 maker * @version 1.0.0 * @author laruence<laruence at yahoo.com.cn> * @copyright (c) 2009 http://www.laruence.com */ class TwentyFourCal { pu

  • PHP 编写的 25个游戏脚本

    无论是一个人玩简单的使用纸和笔的游戏,还是同一群人玩复杂的桌面角色扮演游戏,或者任意类型的联机游戏,本系列都提供了适合您的内容."用 PHP 可以编写的 30 个游戏脚本" 系列中的每篇文章都将分别用不到 300 词的文字介绍 10 个脚本(3d10 表示 "掷三个 10 面的骰子"),这些介绍性文字甚至对于开发新手来说都十分简单,而且对于经验丰富的游戏玩家来说也十分有用.本系列的目的在于为您提供可以修改的内容来满足自身的需求,以便您可以在下一次游戏交流会上通过展示

  • PHP网页游戏学习之Xnova(ogame)源码解读(二)

    三. 安装(install/index.php) 这个文件是安装页面,一开始就可以看到定义了两个常量: define('INSIDE' , true); define('INSTALL' , true); 因为这两个常量在接下来的代码中总是用到,所以在这里先说明下.INSIDE是用来防止攻击的:INSTALL是用来记录现在是否处于安装游戏的进程中. 接下来Include两个文件:extension.inc和common,这两个都是正宗的php文件.首先extension.inc里面加入了防止攻击

随机推荐