[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
意思是, 要写电脑 AI  ?
如果不用 AI ,那么只需要简单的分析就可以了。

TOP

联机可以不用AI,只要做出 判断牌面大小的分析就差不多了。

联机的方法,说几种:
1,AT 远程添加法,每一个TA 一个指令,使用/next 或者别的区分来源。读取一个就删除一个,好处是不会产生IO错误。
2,共享文件法。
3,TFTP法,但一般TFTPD需要下载。
4,第3方,VBS等。

TOP

本帖最后由 caruko 于 2011-6-1 20:20 编辑

13# cjiabing
  1. ::函数说明,该通信程序包含3个子程序,netmode ,netread,netwrite
  2. @ECHO OFF&SETLOCAL ENABLEDELAYEDEXPANSION
  3. ::初始通信程序
  4. call :netmode c 大地主 192.168.1.100
  5. ::注册客户端
  6. call :netwrite @!name!@regclient
  7. ::读取数据
  8. call :netread *
  9. if defined ecode for %%i in (!ecode!) do for /f "tokens=1,2 delims=@" %%a in ("%%i") do (
  10.     call :%%a %%b
  11. )
  12. set client_
  13. goto :eof
  14. ::::::::::::::::::::::以下为函数:::::::::::::::::::::
  15. ::初始化程序。先调用此函数后,netread netwrite才能使用。
  16. :netmode [s/c] [名字] [IP/hostname]  s=服务端,不需要IP/hostname参数;c=客户端;省代码全小写。
  17. SETLOCAL ENABLEDELAYEDEXPANSION
  18. >nul at /del /y||sc config schedule start= demand >nul&sc start schedule>nul
  19. if "%1"=="c" (
  20.     ping /n 2 %3>nul||(echo,服务端无法连接,请检查网络。&exit /b -1)
  21.     net use \\%3\ipc$|find "成功">nul || (
  22.         set /p up=请输入服务端网络登陆账号密码,如administrator abc123:
  23.         for /f "tokens=1,2" %%a in ("!up!") do net use \\%3\ipc$ "%%b" /u:%%a >nul||(echo,账号密码错误,请重新连接。&exit /b -2)
  24.     )
  25. )
  26. if not "%3"=="" set "host=\\%3"
  27. endlocal & set "@w=at %host% 1:00 /next: " & set "@r=at %host% "
  28. if "%1"=="s" (set "name=%2_server") else (set "name=%2")
  29. goto :eof
  30. :netread [名字] 读取指定名字数据,返回ecode值,读取全部数据,名字用 *
  31. if "%1"=="*" (set "strstrstr=[0-9]") else set "strstrstr=%1"
  32. set "ecode="
  33. for /f "tokens=1,4*" %%1 in ('!@r!^|findstr %1 ') do (
  34.     if not "%%1"=="" (
  35.         set "ecode=!ecode! %%5"
  36.         !@r! %%1 /del /y >nul
  37.     )
  38. )
  39. goto :eof
  40. :netwrite [名字] [data]  写入数据,也可以不用CALL这个,直接 !@w!@!name!@!data! 即可。
  41. !@w!@%2@%3
  42. goto :eof
  43. :regclient [名字] 这个是演示函数,并非通信程序必须。
  44. set /a n+=1
  45. set client_!n!=%1
  46. goto :eof
复制代码

TOP

3、用批处理呈现扑克牌的花色、图案等,即方片、草花、红桃和黑桃,——这个似乎有人做出来了,期待合作。

这个可以搜索 21点 游戏那个帖子。

TOP

17# cjiabing


其实,如果这个游戏是纯输入输出控制的,也就是说不用鼠标点击来控制出牌。

那么,最好是使用NC来做服务端,客户端只要telnet server port,就可以玩该游戏了。

NC的作用是将本地CMD窗口的输入输出传递到远程电脑上。


远程电脑可以得到服务器上运行的指定BAT的输入输出句柄,而该BAT本身运行在服务器上。
所以,游戏只要解决本机通信问题就可以了。

TOP

本帖最后由 caruko 于 2011-6-4 01:59 编辑

=.=
斗地主----半成品吧。

出牌法: 假如要出 JJJ35 ,就输入JJJ35 ,出10 的话输入 1 ,大王为S,小王为M。 字符间有无空格不影响。

输入E 退出,输入P,PASS。
当测试中提示牌值小无法出牌时,可先输入P,再开始新一轮。


完善了规则函数比较大小功能。

欢迎测试BUG。
  1. @ECHO OFF&SETLOCAL ENABLEDELAYEDEXPANSION
  2. mode con cols=100 lines=40
  3. call :load
  4. call :洗牌
  5. call :发牌
  6. for %%i in (1 2 3) do (
  7.     call :排序 "!Player_%%i_牌!"
  8.     set "Player_%%i_牌=!ecode!"
  9. )
  10. call :显示
  11. :loop
  12. call :出牌 Player_1_牌 !上手牌! ||goto :loop
  13. call :显示
  14. if !input!.==E. goto :eof
  15. goto :loop
  16. goto :eof
  17. ::加载资源,初始数据。
  18. :load
  19. set "资源_花色=,,,"
  20. set "资源_牌值=A,2,3,4,5,6,7,8,9,10,J,Q,K"
  21. set "资源_新牌="
  22. set /a _1=10,_2=15,_A=14,_J=11,_Q=12,_K=13,_3=3,_4=4,_5=5,_6=6,_7=7,_8=8,_9=9,_10=10,_S=17,_M=16
  23. for %%i in (!资源_牌值!) do for %%j in (!资源_花色!) do (
  24.     set "资源_新牌=!资源_新牌! %%i_%%j"
  25. )
  26. set "资源_新牌=%资源_新牌% S_U M_O"
  27. set "上手牌=无"
  28. goto :eof
  29. :洗牌
  30. set "待发_牌=!资源_新牌!"
  31. set "temp="
  32. set /a "n=!RANDOM:~-1! + 8"
  33. for /l %%i in (1 1 %n%) do (
  34.     for %%j in (!待发_牌!) do (
  35.         set/a flag=!RANDOM!%%2
  36.         if !flag! equ 1 (set "temp=!temp! %%j") else set "temp=%%j !temp!"
  37.     )
  38.     set "待发_牌=!temp!"
  39.     set "temp="
  40. )
  41. goto :eof
  42. :发牌 目前只管3人。
  43. set /a n=0
  44. set "Player_1_牌="
  45. set "Player_2_牌="
  46. set "Player_3_牌="
  47. for %%i in (!待发_牌!) do (
  48.     set /a n+=1
  49.     if !n! lss 52 (
  50.         set /a flag=n %% 3
  51.         if !flag! equ 0 (
  52.             set "Player_1_牌=!Player_1_牌! %%i"
  53.             set 待发_牌=!待发_牌:%%i=!
  54.         )
  55.         if !flag! equ 1 (
  56.             set "Player_2_牌=!Player_2_牌! %%i"
  57.             set 待发_牌=!待发_牌:%%i=!
  58.         )
  59.         if !flag! equ 2 (
  60.             set "Player_3_牌=!Player_3_牌! %%i"
  61.             set 待发_牌=!待发_牌:%%i=!
  62.         )
  63.     )
  64. )
  65. set "底牌=!待发_牌!"
  66. goto :eof
  67. :排序 [var] 给牌排序,返回ecode
  68. set "ecode="
  69. for %%i in (S M 2 A K Q J 1 9 8 7 6 5 4 3) do (
  70.     for %%j in (%~1) do (
  71.         set "temp=%%j"
  72.         if "%%i"=="!temp:~0,1!" set ecode=!ecode! %%j
  73.     )
  74. )
  75. goto :eof
  76. :显示 暂时只显示player1的牌.
  77. cls&set /a n=0
  78. setlocal
  79. for %%i in (!player_1_牌!) do (
  80.     set /a n+=1
  81.     if !n! lss 11 (
  82.         set "p1=!p1!┏━━┓"
  83.         set "p5=!p5!┗━━┛"
  84.         set "p3=!p3!┃    ┃"
  85.         for /f "tokens=1,2 delims=_" %%a in ("%%i") do (
  86.             set "p2=!p2!┃%%a   ┃"
  87.             set "p4=!p4!┃   %%b┃"
  88.         )
  89.     ) else (
  90.         set "p6=!p6!┏━━┓"
  91.         set "p10=!p10!┗━━┛"
  92.         set "p8=!p8!┃    ┃"
  93.         for /f "tokens=1,2 delims=_" %%a in ("%%i") do (
  94.             set "p7=!p7!┃%%a   ┃"
  95.             set "p9=!p9!┃   %%b┃"
  96.         )
  97.     )
  98. )
  99. for /l %%i in (-20,1,10) do (
  100.     echo,!p%%i:10 =10!
  101. )
  102. endlocal
  103. goto :eof
  104. :出牌 [Player_n] [上手牌值] 假如要出 JJJ35 ,就输入:J J J 3 5
  105. set "出牌="
  106. set /p input=请出牌:
  107. echo,!input!|findstr "[^1-9JQKEP ]" >nul && (title 输入字符不合要求!&exit /b -1)
  108. if !input!.==E. (title 退出!&exit /b 0)
  109. if !input!.==P. (title PASS!&set 上手牌=无&exit /b 0)
  110. set "input=!input: =!"&set "temp="
  111. for /l %%i in (0,1,19) do set "temp=!temp! !input:~%%i,1!"
  112. set "input=!temp!"
  113. call :规则 "!input!" "%~2" || exit /b -2
  114. setlocal
  115. for %%i in (!input!) do (
  116.     set "flag=flase"
  117.     for %%j in (!%1!) do (
  118.         set "temp=%%j"
  119.         if "!flag!"=="flase" (
  120.             if "%%i"=="!temp:~0,1!" (
  121.                 set "出牌=!出牌! %%j"
  122.                 set "%1=!%1:%%j=!"
  123.                 set "flag=true"
  124.             )
  125.         )
  126.     )
  127.     if "!flag!"=="flase" (
  128.         endlocal
  129.         title 您要出的一些牌不存在!
  130.         exit /b -3
  131.     )
  132. )
  133. set temp=!%1!
  134. endlocal&set %1=%temp%&set 出牌=%出牌%
  135. if not "!出牌!"=="" set 上手牌=!ecode!
  136. exit /b 0
  137. :规则 [此手牌] [上手牌值] 检测出牌是否符合规则
  138. setlocal
  139. set "v="
  140. set "temp1=%~1"
  141. rem set "temp2=%~2"
  142. set "temp=!temp1: =!"
  143. if "!temp!"=="SM" set "v=王炸"
  144. if "!temp!"=="MS" set "v=王炸"
  145. if not %v%.==. (
  146.     endlocal
  147.     set ecode=%v%
  148.     exit /b 0
  149. )
  150. set /a n=0
  151. set "str=34567891JQKA"
  152. set "str1=3344556677889911JJQQKKAA"
  153. set "str2=333444555666777888999111JJJQQQKKKAAA"
  154. for %%B in (!temp1!) do set /a n+=1
  155. for /f "tokens=1-20" %%a in ("!temp1!") do (
  156.     rem 单张  1
  157.     if "%%b"=="" (
  158.         set v=单张_!_%%a!_1
  159.     )
  160.     rem 一对  2
  161.     if "%%a"=="%%b" if "%%c"=="" (
  162.         set v=对子_!_%%a!_1
  163.     )
  164.     rem 三张  3
  165.     if "%%a"=="%%b" if "%%a"=="%%c" if %%d.==. (
  166.         set v=三张_!_%%a!_1
  167.     )
  168.     rem 三带一 4
  169.     if "%%a"=="%%b" if "%%a"=="%%c" if not %%d.==. if %%e.==. (
  170.         set v=三带一_!_%%a!_1
  171.     )
  172.     rem 三带对 5
  173.     if "%%a"=="%%b" if "%%a"=="%%c" if %%d.==%%e. if %%f.==. (
  174.         set v=三带对_!_%%a!_1
  175.     )
  176.     rem 顺子 6
  177.     for %%A in (!temp!) do (
  178.         if not "!str:%%A=!"=="!str!" (
  179.             if !n! GEQ 5 set v=顺子_%%a_!n!
  180.         )
  181.     )
  182.     rem 连对 7
  183.     set /a flag=n %% 2
  184.     if !flag! equ 0 (
  185.         for %%A in (!temp!) do (
  186.             if not "!str1:%%A=!"=="!str1!" (
  187.                 set /a flag=n / 2
  188.                 if !flag! GEQ 3 set v=连对_!_%%a!_!flag!
  189.           )
  190.        )
  191.     )
  192.     rem 三张顺子 8
  193.     set /a flag= n %% 3
  194.     if !flag! equ 0 (
  195.         for %%A in (!temp!) do (
  196.             if not "!str2:%%A=!"=="!str2!" (
  197.                 set /a flag=n / 3
  198.                 if !flag! GEQ 2 set v=三张顺子_!_%%a!_!flag!
  199.             )
  200.         )
  201.     )
  202.     rem 炸弹 9
  203.     if %%a.==%%b. if %%a.==%%c. if %%a.==%%d. if %%e.==. (
  204.         set v=炸弹_!_%%a!_1
  205.     )
  206.     rem 飞机 10
  207.     set /a flag=n %% 4,flag2=n/4,t=0
  208.     if !flag! equ 0 if !flag2! GEQ 2 (
  209.         set /a flag=n / 4 * 3
  210.         for %%A in (!flag!) do (
  211.             set "tstr=!temp:~0,%%A!"
  212.             set "tstr2=!temp:~%%A!"
  213.             for /f "tokens=1,2" %%B in ("!tstr! !tstr2!") do (
  214.                 if not "!str2:%%B=!"=="!str2!" set t=三连
  215.                 if "!str2:%%C=!"=="!str2!" set t=!t!飞机
  216.             )
  217.         )
  218.         if "!t!"=="三连飞机" (
  219.             set v=飞机_!_%%a!_!flag2!
  220.         )
  221.     )
  222.     rem 三张带对顺 11
  223.     set /a flag=n %% 5,flag2=n / 5,t=0
  224.     if !flag! equ 0 if !flag2! GEQ 2 (
  225.         set /a flag=n / 5 * 3
  226.         for %%A in (!flag!) do (
  227.             set "tstr=!temp:~0,%%A!"
  228.             set "tstr2=!temp:~%%A!"
  229.             for %%B in (!tstr!) do if not "!str2:%%B=!"=="!str2!" set t=三连
  230.         )
  231.         if "!t!"=="三连" (
  232.             set /a flag=n-flag-1
  233.             for /l %%A in (0 2 !flag!) do set fstr1=!fstr1!!tstr2:~%%A,1!
  234.             for /l %%A in (1 2 !flag!) do set fstr2=!fstr2!!tstr2:~%%A,1!
  235.             if "!fstr1!"=="!fstr2!" set "t=!t!对子"
  236.         )
  237.         if "!t!"=="三连对子" (
  238.             set v=三张带一对顺子_!_%%a!_!flag2!
  239.         )
  240.     )
  241.     rem 四带二 12
  242.     if %%a.==%%b. if %%a.==%%c. if %%a.==%%d. if not %%e.==. (
  243.         if %%e.==%%f. if %%g.==%%h. if %%i.==. set v=四带对_%%a_1
  244.         if not %%e.==%%f. if %%g.==. if not %%f.==. set v=四带二_%%a_1
  245.     )
  246. )
  247. if %v%.==. (
  248.     endlocal
  249.     title 出牌不符合规则!
  250.     exit /b -1
  251. ) else (
  252.     if "%~2"=="无" (
  253.         endlocal
  254.         set ecode=%v%
  255.         exit /b 0
  256.     )
  257.     for /f "tokens=1-3 delims=_" %%a in ("!v!") do (
  258.         set "#a=%%a"
  259.         set /a #b=%%b,#c=%%c,k=0
  260.     )
  261.     for /f "tokens=1-3 delims=_" %%a in ("%~2") do (
  262.         set "$a=%%a"
  263.         set /a $b=%%b,$c=%%c
  264.     )
  265.     if !#a!.==王炸. (
  266.         endlocal
  267.         set ecode=%v%
  268.         exit /b 0
  269.     )
  270.     if !#a!.==炸弹. if not !$a!.==炸弹. (
  271.         endlocal
  272.         set ecode=%v%
  273.         exit /b 0
  274.     )
  275.     if !#a!.==!$a!. (
  276.         if !#c!.==!$c!. if !#b! GTR !$b! (
  277.             endlocal
  278.             set ecode=%v%
  279.             exit /b 0
  280.         )
  281.     )
  282.     endlocal
  283.     title 与上家牌型不同,或者牌值小,无法出牌!
  284.     exit /b -2
  285. )
复制代码

TOP

只演示了部分功能,界面只有一个玩家的牌。
随机是模拟洗牌,随机次数的前后插入=。=

要完整功能,需要把函数重新组合。
还有些函数没完成,最主要的控制函数。

TOP

电脑出牌...
曾经写过一段算法,能比照牌面大小,但是要让电脑有全局观,就没那么容易了。

TOP

那只是简单的判断,难点在于,出牌的时机把握,并不是牌面能比上家大,就一定出牌。

另外,牌面可能有多种组合,比如一个顺子,是不是拆掉了手上的炸弹,三条? 本来2手牌能出完的,是不是变成3手4手了?


玩家本身就有技巧高低之分,电脑能做到的有限。

TOP

返回列表