中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [讨论]斗地主牌型检测模块测试 V0.2[2010-3-12]
作者:
标题: [讨论]斗地主牌型检测模块测试 V0.2[2010-3-12] 上一主题 | 下一主题
sl543001
中级用户




积分 499
发帖 225
注册 2008-12-30
状态 离线
『楼 主』:  [讨论]斗地主牌型检测模块测试 V0.2[2010-3-12]

俺的斗地主脚本已经基本完成了前台界面,现正处于后台部分.http://www.cn-dos.net/forum/viewthread.php?tid=50331&fpage=1
最近写了牌型检测模块,V0.2版在2楼测试完成后再优化嵌入斗地主脚本
如玩家输入一串牌7890JQKA,电脑返回 顺子 字样
玩家输入一串牌JQKA2,电脑返回 违规 字样
0代表10 N代表王
现发布测试,大家有事没事欢迎回帖!
代码如下:[此代码使用穷举法,目前仅测试可用性及准确性,暂未优化]
@echo off&SETLOCAL ENABLEDELAYEDEXPANSION&(CHCP 437 &GRAFTABL 936)>NUL
title sybn 斗地主牌型检测模块V0.1
:2
set /p p6s=请输入牌型如7890JQKA,N代表王,0代表10[可以乱序输入]:
set p6s=0%p6s:1=A%
set px=违规!
for %%a in (3 4 5 6 7 8 9 0 J Q K A 2 N) do set ps%%a=0
for /l %%a in (1,1,20) do for /f %%b in ("!p6s:~%%a,1!") do set /a ps%%b+=1
set /a p6zs=%ps3%+%ps4%+%ps5%+%ps6%+%ps7%+%ps8%+%ps9%+%ps0%+%psj%+%psq%+%psk%+%psa%+%ps2%+%psn%
set p6ss=%ps3%%ps4%%ps5%%ps6%%ps7%%ps8%%ps9%%ps0%%psj%%psq%%psk%%psa%-%ps2%%psn%$
title sybn 斗地主牌型检测模块V0.1 中间代码: %p6ss% . %p6zs%张
::单牌
if %p6zs% == 1 set px=单牌

::3张和飞机
::解释:  %p6ss:3=.% == %p6ss%  表示%p6ss%中没有3则if生效,加上not表示有3则if生效
if %p6zs% == 3 if not %p6ss:3=.% == %p6ss% set px=3张
if %p6zs% == 4 if not %p6ss:3=.% == %p6ss% set px=3带1
if %p6zs% == 5 if not %p6ss:3=.% == %p6ss% if not %p6ss:2=.% == %p6ss% set px=3带对
if %p6zs% == 6 if not %p6ss:33=.% == %p6ss% set px=飞机
if %p6zs% == 8 if not %p6ss:33=.% == %p6ss% set px=飞机带单
if %p6zs% == 10 if not %p6ss:33=.% == %p6ss% if %p6ss:1=.% == %p6ss% set px=飞机带对
if %p6zs% == 9 if not %p6ss:333=.% == %p6ss% set px=三顺
if %p6zs% == 12 if not %p6ss:333=.% == %p6ss% set px=三顺带单
if %p6zs% == 15 if not %p6ss:333=.% == %p6ss% if %p6ss:1=.% == %p6ss% set px=三顺带对
if %p6zs% == 12 if not %p6ss:3333=.% == %p6ss% set px=三大顺
if %p6zs% == 16 if not %p6ss:3333=.% == %p6ss% set px=三大顺带单
set p6ss3=%p6ss:3333=.%
if %p6zs% == 20 if not %p6ss:3333=.% == %p6ss% if %p6ss:1=.% == %p6ss% if %p6ss3:3=.% == %p6ss3% set px=三大顺带对
if %p6zs% == 15 if not %p6ss:33333=.% == %p6ss% set px=三巨顺
if %p6zs% == 20 if not %p6ss:33333=.% == %p6ss% set px=三巨顺带单
if %p6zs% == 18 if not %p6ss:333333=.% == %p6ss% set px=三神顺

::对子和兄弟
if %p6zs% == 2 if %p6ss:1=.% == %p6ss% set px=对子
if %p6zs% == 6 if not %p6ss:222=.% == %p6ss% set px=3兄弟
if %p6zs% == 8 if not %p6ss:2222=.% == %p6ss% set px=4兄弟
if %p6zs% == 10 if not %p6ss:22222=.% == %p6ss% set px=5兄弟
if %p6zs% == 12 if not %p6ss:222222=.% == %p6ss% set px=6兄弟
if %p6zs% == 14 if not %p6ss:2222222=.% == %p6ss% set px=7兄弟
if %p6zs% == 16 if not %p6ss:22222222=.% == %p6ss% set px=8兄弟
if %p6zs% == 18 if not %p6ss:222222222=.% == %p6ss% set px=9兄弟
if %p6zs% == 20 if not %p6ss:2222222222=.% == %p6ss% set px=10兄弟

::顺子
if %p6zs% == 5 if not %p6ss:11111=.% == %p6ss% set px=5张顺子
if %p6zs% == 6 if not %p6ss:111111=.% == %p6ss% set px=6张顺子
if %p6zs% == 7 if not %p6ss:1111111=.% == %p6ss% set px=7张顺子
if %p6zs% == 8 if not %p6ss:11111111=.% == %p6ss% set px=8张顺子
if %p6zs% == 9 if not %p6ss:111111111=.% == %p6ss% set px=9张顺子
if %p6zs% == 10 if not %p6ss:1111111111=.% == %p6ss% set px=10张顺子
if %p6zs% == 11 if not %p6ss:11111111111=.% == %p6ss% set px=11张顺子
if %p6zs% == 12 if not %p6ss:111111111111=.% == %p6ss% set px=12张顺子

::炸弹
if %p6zs% == 4 if not %p6ss:4=.% == %p6ss% set px=4炸
if %p6zs% == 2 if not %p6ss:2$=.% == %p6ss% set px=王炸
echo.
echo.              %px%:%p6s:~1,99%
echo.
goto :2
[ Last edited by sl543001 on 2010-3-12 at 11:39 ]

附件 1: px.GIF (2010-3-10 18:18, 10.81 K)




SYBNQQ:354324773
2010-3-10 18:03
查看资料  发送邮件  发短消息 网志  OICQ (354324773)  编辑帖子  回复  引用回复
sl543001
中级用户




积分 499
发帖 225
注册 2008-12-30
状态 离线
『第 2 楼』:  添加了"有效牌"用于对比大小

有效牌用于对比各种相同类型的牌的大小(顺子和兄弟里的最大一张,3张里的不含带牌的最大一张)
例如 333A的有效牌为3  5556的有效牌为5,所以333A<5556
@echo off&SETLOCAL ENABLEDELAYEDEXPANSION&(CHCP 437 &GRAFTABL 936)>NUL
title sybn 斗地主牌型检测模块V0.2
:2
set /p p6s=请输入牌型如7890JQKA,N代表王,0代表10[可以乱序输入]:
set p6s=0%p6s:1=A%
set px=违规
set p6yx=0
::标记字符串对应的牌
set ps=---34567890JQKA02N$
::初始化
for /l %%a in (0,1,4) do set pss%%a=0
for %%a in (3 4 5 6 7 8 9 0 J Q K A 2 N) do set ps%%a=0&set p6zs%%a=0
::计算各中点数的牌的数量
for /l %%a in (1,1,20) do for /f %%b in ("!p6s:~%%a,1!") do set /a ps%%b+=1
::计算牌的数量
set /a p6zs=%ps3%+%ps4%+%ps5%+%ps6%+%ps7%+%ps8%+%ps9%+%ps0%+%psj%+%psq%+%psk%+%psa%+%ps2%+%psn%
::获取标记字符串%p6ss%
set p6ss=---%ps3%%ps4%%ps5%%ps6%%ps7%%ps8%%ps9%%ps0%%psj%%psq%%psk%%psa%0%ps2%%psn%$
::提取最大的单张,2张,3张,4张
for /l %%a in (3,1,17) do set pss!p6ss:~%%a,1!=%%a
title sybn 斗地主牌型检测模块V0.1 中间代码: %p6ss% . %p6zs%张
::单牌
if %p6zs% == 1 set px=单牌&set p6yx=%pss1%
::3张和飞机
::解释:  %p6ss:3=.% == %p6ss%  表示%p6ss%中没有3则if生效,加上not表示有3则if生效
if %p6zs% == 3 if not %p6ss:3=.% == %p6ss% set px=三张
if %p6zs% == 4 if not %p6ss:3=.% == %p6ss% set px=三带一
if %p6zs% == 5 if not %p6ss:3=.% == %p6ss% if not %p6ss:2=.% == %p6ss% set px=三带对
if %p6zs% == 6 if not %p6ss:33=.% == %p6ss% set px=飞机
if %p6zs% == 8 if not %p6ss:33=.% == %p6ss% set px=飞机带单
if %p6zs% == 10 if not %p6ss:33=.% == %p6ss% if %p6ss:1=.% == %p6ss% set px=飞机带对
if %p6zs% == 9 if not %p6ss:333=.% == %p6ss% set px=三顺
if %p6zs% == 12 if not %p6ss:333=.% == %p6ss% set px=三顺带单
if %p6zs% == 15 if not %p6ss:333=.% == %p6ss% if %p6ss:1=.% == %p6ss% set px=三顺带对
if %p6zs% == 12 if not %p6ss:3333=.% == %p6ss% set px=三大顺
if %p6zs% == 16 if not %p6ss:3333=.% == %p6ss% set px=三大顺带单
::为防止出现类似333444555666777qqqkkkaa被误认为三大顺带对加入下面一行
set p6ss3=%p6ss:3333=.%
if %p6zs% == 20 if not %p6ss:3333=.% == %p6ss% if %p6ss:1=.% == %p6ss% if %p6ss3:3=.% == %p6ss3% set px=三大顺带对
if %p6zs% == 15 if not %p6ss:33333=.% == %p6ss% set px=三巨顺
if %p6zs% == 20 if not %p6ss:33333=.% == %p6ss% set px=三巨顺带单
if %p6zs% == 18 if not %p6ss:333333=.% == %p6ss% set px=三神顺
::对子和兄弟
if %p6zs% == 2 if %p6ss:1=.% == %p6ss% set px=对子&set p6yx=%pss2%
if %p6zs% == 6 if not %p6ss:222=.% == %p6ss% set px=3兄弟
if %p6zs% == 8 if not %p6ss:2222=.% == %p6ss% set px=4兄弟
if %p6zs% == 10 if not %p6ss:22222=.% == %p6ss% set px=5兄弟
if %p6zs% == 12 if not %p6ss:222222=.% == %p6ss% set px=6兄弟
if %p6zs% == 14 if not %p6ss:2222222=.% == %p6ss% set px=7兄弟
if %p6zs% == 16 if not %p6ss:22222222=.% == %p6ss% set px=8兄弟
if %p6zs% == 18 if not %p6ss:222222222=.% == %p6ss% set px=9兄弟
if %p6zs% == 20 if not %p6ss:2222222222=.% == %p6ss% set px=10兄弟
::顺子
if %p6zs% == 5 if not %p6ss:11111=.% == %p6ss% set px=5张顺子
if %p6zs% == 6 if not %p6ss:111111=.% == %p6ss% set px=6张顺子
if %p6zs% == 7 if not %p6ss:1111111=.% == %p6ss% set px=7张顺子
if %p6zs% == 8 if not %p6ss:11111111=.% == %p6ss% set px=8张顺子
if %p6zs% == 9 if not %p6ss:111111111=.% == %p6ss% set px=9张顺子
if %p6zs% == 10 if not %p6ss:1111111111=.% == %p6ss% set px=10张顺子
if %p6zs% == 11 if not %p6ss:11111111111=.% == %p6ss% set px=11张顺子
if %p6zs% == 12 if not %p6ss:111111111111=.% == %p6ss% set px=12张顺子
::炸弹
if %p6zs% == 4 if not %p6ss:4=.% == %p6ss% set px=4炸&set p6yx=%pss4%
if %p6zs% == 2 if not %p6ss:2$=.% == %p6ss% set px=王炸&set p6yx=%pss2%
::提取有效牌(顺子和兄弟里的最大一张,3张里的不含带牌的最大一张)
if not %px:顺子=.% == %px% set p6yx=%pss1%
if not %px:兄弟=.% == %px% set p6yx=%pss2%
if not %px:三=.% == %px% set p6yx=%pss3%
echo.
echo.              %px%:(%p6yx%)%p6s:~1,99%
echo.
goto :2




SYBNQQ:354324773
2010-3-12 11:29
查看资料  发送邮件  发短消息 网志  OICQ (354324773)  编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: