Project1

标题: 一个小游戏的构思,有人想做来骗分吗 [打印本页]

作者: zh99998    时间: 2009-8-17 18:29
标题: 一个小游戏的构思,有人想做来骗分吗
把以下代码保存为一个bat文件,然后就可以拿RM来仿制一个骗分了……
  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. color a
  4. title 拿星星的小游戏
  5. set num=31
  6. :begin
  7. echo   拿星星的小游戏   规则说明:
  8. echo.
  9. echo 玩家和电脑轮流拿星星,每次可以从一边拿任意数量,

  10. 或者从两边拿相等的数量的星星
  11. echo 拿到最后一个的赢
  12. echo.
  13. echo 拿上行输入“+数字”,拿下行输入“-数字”,拿两边

  14. 输入“=数字”
  15. echo.
  16. echo by zh99998 08-02-02
  17. echo.
  18. :0
  19. set /p num=请输入开始时的星星数量^(1~32^),然后按回车

  20. 键开始游戏:
  21. if %num% LSS 1 goto 0
  22. if %num% GTR 32 goto 0
  23. :start
  24. set x=%num%
  25. set y=%num%
  26. :1
  27. call :echo
  28. set b=
  29. set /p b=嗨,轮到你了:
  30. if "b" EQU "" goto 1
  31. if /i "%b:~0,2%" EQU "vb" start

  32. http://bbs.verybat.org/?fromuid=7220
  33. if "%b:~0,1%" EQU "+" set /a x=%x%-%b:~1,2%
  34. if "%b:~0,1%" EQU "-" set /a y=%y%-%b:~1,2%
  35. if "%b:~0,1%" EQU "=" set /a x=%x%-%b:~1,2%&set /a y=

  36. %y%-%b:~1,2%
  37. if not "%b:~0,1%" EQU "+" (if not "%b:~0,1%" EQU "-"

  38. (if not "%b:~0,1%" EQU "=" goto 2))
  39. if "%b:~0,3%" EQU "=%num%" goto 2
  40. if "%b:~1,2%" EQU "0" goto 2
  41. if %x% LSS 0 goto 2
  42. if %y% LSS 0 goto 2
  43. call :echo
  44. if %x% EQU 0 ( if %y% EQU 0 goto win )
  45. set /p=电脑思考中<nul
  46. for /l %%a in (1,1,8) do (set /p=.<nul&ping 127.1 -n 1

  47. >nul )
  48. if %x% EQU %y% goto lost
  49. if %x% EQU 0 goto lost
  50. if %y% EQU 0 goto lost
  51. call :calc
  52. goto 1
  53. :calc
  54. set /a a=%x%-%y%
  55. for %%a in (1#2 3#5 4#7 6#10 8#13 9#15 11#18 12#20

  56. 14#23 16#26 17#28 19#31 2#1 5#3 7#4 10#6 13#8 15#9

  57. 18#11 20#12 23#14 26#16 28#17 31#19) do (
  58. for /f "tokens=1-2 delims=#" %%b in ("%%a") do (
  59. if %x% EQU %%b (if %y% EQU %%c set /a x=%x%-1 &goto

  60. :eof )
  61. if %x% EQU %%b (if %y% GTR %%c set /a y=%%c & goto

  62. :eof )
  63. if %y% EQU %%b (if %x% GTR %%c set /a x=%%c & goto

  64. :eof )
  65. )
  66. )
  67. set /a b=%x%-%y%
  68. if not "%a%" EQU "%b%" pause & goto :eof
  69. for %%a in (1#2 3#5 4#7 6#10 8#13 9#15 11#18 12#20

  70. 14#23 16#26 17#28 19#31 2#1 5#3 7#4 10#6 13#8 15#9

  71. 18#11 20#12 23#14 26#16 28#17 31#19) do (
  72. for /f "tokens=1,2 delims=#" %%b in ("%%a") do (
  73. set /a b=%%b-%%c
  74. if !b! EQU %a% set x=%%b&set y=%%c
  75. )
  76. )
  77. goto :eof
  78. :win
  79. echo 哇!!你居然赢了,真是太厉害了!!
  80. goto 3
  81. :lost
  82. set x=0
  83. set y=0
  84. call :echo
  85. echo 哈哈,你输了。。
  86. :3
  87. echo.
  88. echo 按任意键再来一局,按Ctrl+C退出
  89. pause>nul
  90. goto start
  91. :2
  92. echo 不要耍赖哦。。。。。
  93. ping 127.1 >nul
  94. cls
  95. goto begin
  96. :echo
  97. cls
  98. set /p=┏━━┯<nul
  99. for /l %%a in (1,1,%num%) do set /p=━<nul
  100. echo ┯━━┓
  101. set /p=┃上:│<nul
  102. for /l %%a in (1,1,%x%) do set /p=★<nul
  103. set /a a=%num%-%x%
  104. for /l %%a in (1,1,%a%) do set /p= <nul
  105. set /p=│%x%<nul
  106. if %x% GEQ 10 (echo 个┃ ) else (echo  个┃ )
  107. set /p=┠──┼<nul
  108. for /l %%a in (1,1,%num%) do set /p=─<nul
  109. echo ┼──┨
  110. set /p=┃下:│<nul
  111. for /l %%a in (1,1,%y%) do set /p=☆<nul
  112. set /a a=%num%-%y%
  113. for /l %%a in (1,1,%a%) do set /p= <nul
  114. set /p=│%y%<nul
  115. if %y% GEQ 10 (echo 个┃ ) else (echo  个┃ )
  116. set /p=┗━━┷<nul
  117. for /l %%a in (1,1,%num%) do set /p=━<nul
  118. echo ┷━━┛
复制代码
注:这个程序和算法是我自己写的,但是这种游戏模式并非我的首创
作者: ★PIG★    时间: 2009-8-17 18:31
很好.....绝对支持这种系统的小游戏
作者: 越前リョーマ    时间: 2009-8-17 18:31
拿星星……不会是……拿硬币那样的游戏吧?
作者: 枫起    时间: 2009-8-17 18:36
zh~你要是能解释下具体的原理的话。。。就可以成功从我这里骗到分了
作者: zh99998    时间: 2009-8-17 18:38
原理,是指算法吗?
  1. :calc
  2. set /a a=%x%-%y%
  3. for %%a in (1#2 3#5 4#7 6#10 8#13 9#15 11#18 12#20

  4. 14#23 16#26 17#28 19#31 2#1 5#3 7#4 10#6 13#8 15#9

  5. 18#11 20#12 23#14 26#16 28#17 31#19) do (
  6. for /f "tokens=1-2 delims=#" %%b in ("%%a") do (
  7. if %x% EQU %%b (if %y% EQU %%c set /a x=%x%-1 &goto

  8. :eof )
  9. if %x% EQU %%b (if %y% GTR %%c set /a y=%%c & goto

  10. :eof )
  11. if %y% EQU %%b (if %x% GTR %%c set /a x=%%c & goto

  12. :eof )
  13. )
  14. )
  15. set /a b=%x%-%y%
  16. if not "%a%" EQU "%b%" pause & goto :eof
  17. for %%a in (1#2 3#5 4#7 6#10 8#13 9#15 11#18 12#20

  18. 14#23 16#26 17#28 19#31 2#1 5#3 7#4 10#6 13#8 15#9

  19. 18#11 20#12 23#14 26#16 28#17 31#19) do (
  20. for /f "tokens=1,2 delims=#" %%b in ("%%a") do (
  21. set /a b=%%b-%%c
  22. if !b! EQU %a% set x=%%b&set y=%%c
  23. )
  24. )
复制代码
就是这段了,注意那串带#的数字
作者: 枫起    时间: 2009-8-17 18:44
...是代码的意义
作者: zh99998    时间: 2009-8-17 19:14
1#2 3#5 4#7 6#10 8#13 9#15 11#18 12#20 14#23 16#26 17#28 19#31 2#1 5#3 7#4 10#6 13#8 15#9 18#11 20#12 23#14 26#16 28#17 31#19

看这个数列,请自觉用大脑把#替换成=>  空格替换成逗号,然后前后加一个大括号

电脑和玩家所需要做的就是保持两列星星的数量是在这个Hash里的对应关系,比如上行的个数是23,那么你就要把下行拿到14,这样子对方必然不能在下一回合保持这个状态,而轮到自己的回合后又能继续保持这个状态(为啥?看看数列规律就知道了)
拿到最后就是2=>1,于是这时对方无论怎么拿都不可能一次拿全,而下一次轮到自己时一定是能一次拿全的

现在我写的AI是,如果当前不处于这个数列中,那么电脑拿成那个数列并一直保持下去(也就是只要失误一次就输定了),如果当前处在这个数列中,那么电脑从上面那行拿一个

也就是说,仅有玩家明白这个算法,玩家先走且初始星星数在这个数列里,或者玩家后走且初始星星数不在这个数列里时,玩家才有可能赢
[line]1[/line]附一个生成数列的函数
  1. def create_list(limit)
  2.   result = {}
  3.   step = 0
  4.   opposite = 0
  5.   num = 0
  6.   while opposite <= limit
  7.     num += 1
  8.     next if result.include? num
  9.     step += 1
  10.     opposite = num + step
  11.     result[num] = opposite
  12.     result[opposite] = num
  13.   end
  14.   result
  15. end
复制代码
范例:p create_list 31
作者: 枫起    时间: 2009-8-17 19:36
本帖最后由 枫起 于 2009-8-17 19:38 编辑

。。。好吧,我坦白,我看不懂
作者: 亿万星辰    时间: 2009-8-17 19:51
印象里似乎在某处玩过这样的游戏……
作者: zh99998    时间: 2009-8-17 20:06
有人接的话请PM我一下
作者: 风雪优游    时间: 2009-8-17 20:08
怎么使用?
作者: zh99998    时间: 2009-8-17 20:13
这只是提供一个构思和核心算法,界面啥的您自己设计吧
作者: 风雪优游    时间: 2009-8-17 20:53
哦,这样的啊。我试试BAT文件……怎么使用
作者: 风雪优游    时间: 2009-8-17 20:55
嗨轮到你了,出现这个后一案回车就自动关闭。
作者: 沉影不器    时间: 2009-8-17 21:09
提示: 作者被禁止或删除 内容自动屏蔽
作者: zh99998    时间: 2009-8-18 07:08
嗨轮到你了,出现这个后一案回车就自动关闭。
风雪优游 发表于 2009-8-17 20:55

一打开游戏就有说明啊,输入+数字拿上行的,-数字拿下行的,=数字拿两行的,然后再回车
作者: 亿万星辰    时间: 2009-8-18 17:29
这累的游戏可以给电脑设定为最高智商,然后再将其挫败才有成就感……比如大航海4中的拿金币问题。。。

不过对于楼主的这个游戏,怎么我突然脑子别不过这个弯儿来了……能详细说下游戏规则么……  = =||||||||
作者: zh99998    时间: 2009-8-18 19:22
游戏规则:
初始两边有相等的数量的星星,这个数量可以由玩家指定

轮到某一方行动时,可以从任意的一侧拿任意的数量的星星,或者从两侧同时拿相等的数量的星星
(这个做在RM里可以使用鼠标,让玩家拖个框,里面的都拿掉,因为拖矩形框拖出来的肯定会满足上面的规则)
刚开始游戏的第一轮行动不能把星星全部拿走

拿到最后一个星星的一方,获得胜利
作者: sayx    时间: 2009-8-18 19:29
看不懂的菜菜路过- -
作者: 亿万星辰    时间: 2009-8-19 07:05
本帖最后由 亿万星辰 于 2009-8-19 07:43 编辑

写RM版的倒是也容易…昨天晚上写了一个出来,但我觉得先拿的人是必败的,所以……只能让电脑先手……
作者: zh99998    时间: 2009-8-19 07:21
0 0啥叫游戏的潜规则
作者: 亿万星辰    时间: 2009-8-19 07:46
先手必输的吧……
莫非是给电脑提供的规则太多了?
不管怎么拿后手总能凑出那种下一手必输的棋局~
作者: zh99998    时间: 2009-8-19 08:06
不是,我在第一次解释算法的时候已经讲清楚了
也就是说,仅有玩家明白这个算法,玩家先走且初始星星数在这个数列里,或者玩家后走且初始星星数不在这个数列里时,玩家才有可能赢

作者: 亿万星辰    时间: 2009-8-19 08:39
玩家知道不知道是次要的……主要是电脑都清楚……  T_T
所以电脑的后手完全不会输……
作者: zh99998    时间: 2009-8-19 08:46
不一定哦,初始星星数量是玩家指定的,比如我指定10个,然后我先走,上行拿4个,这时候就是6=>10,处于那个数列中了

玩家先走且初始星星数在这个数列里,或者玩家后走且初始星星数不在这个数列里时,玩家才有可能赢

作者: 霜冻之狼    时间: 2009-8-19 10:26
只希望电脑的AI不要太强大

不然玩家会很痛苦的
作者: zh99998    时间: 2009-8-19 11:43
这种游戏就是要AI最大才好玩
作者: 亿万星辰    时间: 2009-8-19 12:04
一步错,错全盘是此类游戏的精髓所在……
作者: 亿万星辰    时间: 2009-8-19 20:16
本帖最后由 亿万星辰 于 2009-8-21 07:41 编辑

我发个随手制作版的吧……在单位忙里偷闲做的,很乱……

事件第一页里的采集数字,多几位也没关系……
作者: zh99998    时间: 2009-8-19 20:21
界面要用RTP哦
作者: 亿万星辰    时间: 2009-8-19 20:38
本帖最后由 亿万星辰 于 2009-8-21 07:40 编辑

是的……要不自己挂个容错也行……重新传了一个~之前的还是有不少bug的

拿星星.rar

735.45 KB, 下载次数: 37


作者: 缥缈风    时间: 2009-8-21 10:22
提示: 作者被禁止或删除 内容自动屏蔽
作者: 卡比王道    时间: 2009-8-23 08:18
好深奥啊……完全不懂你们在说什么




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1