CSDN-CSDN社区-.NET技术-C#

收藏 [推荐] 【编程游戏】编写一个会划拳的机器人参加擂台赛,规则内详。路过有分。[问题点数:400,结帖人:zswang]

  • zswang
  • (伴水 清洁工 看帖要回贴)
  • 等 级:
  • 结帖率:
楼主发表于:2008-04-21 17:55:42
    我们来玩一个类似“Robocode”的游戏。

划拳介绍    划拳又叫豁拳、猜枚、猜拳、拇战,即饮酒时两人同时伸出手指并各说一个数,谁说的数目跟双方所伸手指的总数相符,谁就算赢,输的人喝酒。此乃我国

古传至今仍时尚流行的饮酒游戏,它增添酒兴,烘托喜庆,是一种民间的酒令。 其技巧性颇强,给玩者留有神机斗智的余地,且因玩时须喊叫,易让人兴奋,极富竞争性。

  两人同时伸出一只手,用攥起的拳头和伸出一到五个手指,表示从零到五这几个数字,与此同时,嘴里喊出从零到10的数字,如果两人伸出的手指表示的数字相加与其中一个

人嘴里喊出的数字相同,那么这个人就算赢了这一拳。举例说明:比如一个人伸出了三个手指,另一个人伸出了四个手指,一个人喊了七,另一个喊了六,那么这个人喊七的人就赢

了;如一个人伸出攥紧的拳头(表示零),嘴里喊出了三,而另一个恰好伸出了三个手指可嘴里喊的七,那么喊三的就赢了。就这么简单。当然,如果自己喊的是“八仙过海”,

而自己仅伸出了一个手指,那么对方即使伸出五指也不可能凑成八,这种拳就叫臭拳,如果不是事先约定,是要罚酒的。


    划拳规则看完了,那我们就开始写一个会划拳的机器人吧!

    那么一个会划拳的机器会做什么事情呢?其实就是两件:
第一件、出拳,即:自己出几个手指?自己猜合计是多少。
第二件、知道划拳的结果,即:对方出几个手指,对方猜合计是多少,是否获胜还是平局还是其他。

  只要继承Drunkard这个类,重载Come()和Outcome()方法那么你就拥有了一个会划拳的机器人,参与这个游戏了!

【游戏规则】
1、比赛共1000局,即:出现胜负算一局,如出拳100次没有结果也算一局并双方均不得分;
2、赢一局得1分、输不扣分;
3、机器人执行中每出现一次异常,扣100分、对方加1分、记一局;
4、机器人执行中反应超时1000毫秒直接判负,每超时100毫秒,扣1分,超时10次以上直接判负;
5、自己得分高于对手并大于600分判胜;
6、自己得分为正数对手得分为负数判胜;
7、其他情况则判平。
具体执行的过程,算法的过程请参考Drunkery <T1, T2>类的实现

【入门提示】
1、机器人的命名建议是: <自己的id> + <第几个> + "号",如:Zswang一号、Zswang二号,当然你也可以用“长江七号”
2、不允许修改Drunkard和Drunkery <T1, T2>;
3、机器人必须从Drunkard继承;
4、分析擂主代码是战胜擂主的关键;
5、打擂容易守擂难,大家自由发挥吧!

【擂台赛规则】
1、第一个打败擂主的机器人奖励20分,并成为新的擂主;
2、自己不能挑战自己编写的机器人;
3、最后一个擂主获得200专家分,发帖另付;
4、其余分数酌情散掉。

标准代码和比赛规则有什么不妥或者建议欢迎讨论,谢谢关注

(调试代码参考后面两帖,-_-!!!代码有点多,先别抢沙发。。。。)
回复次数:398
#1楼 得分:0回复于:2008-04-21 17:56:14
C# code
using System; using System.Collections.Generic; using System.Text; namespace Huaquan { /// <summary> /// 划拳结果 /// </summary> public enum Result { /// <summary> /// 未知,还没开始判断 /// </summary> Unknown, /// <summary> /// 平局,结果一致 /// </summary> Dogfall, /// <summary> /// 胜,猜中结果 /// </summary> Win, /// <summary> /// 负,对方猜中结果,自己没有猜中 /// </summary> Lost, /// <summary> /// 犯规, /// </summary> Foul, /// <summary> /// 超时,反应时间超出100毫秒 /// </summary> Overtime } /// <summary> /// 酒鬼类 /// </summary> public abstract class Drunkard { /// <summary> /// 出拳 /// </summary> /// <param name="ANumber">出的手指数</param> /// <param name="ASum">猜的合计</param> abstract public void Come(out int AFinger, out int ASum); /// <summary> /// 接收结果 /// </summary> /// <param name="AOtherFinger">对方出的手指数</param> /// <param name="AOtherSum">对方猜的合计</param> /// <param name="AOtherResult">对方划拳的结果</param> /// <param name="ASelfFinger">自己出的手指数</param> /// <param name="ASelfSum">自己猜的合计</param> /// <param name="ASelfResult">自己划拳的结果</param> abstract public void Outcome(int AOtherFinger, int AOtherSum, Result AOtherResult, int ASelfFinger, int ASelfSum, Result ASelfResult); } public class Zswang一号 : Drunkard { public override void Come(out int AFinger, out int ASum) { AFinger = 5; // 每次都出5 ASum = 10; // 每次都猜10 } public override void Outcome(int AOtherFinger, int AOtherSum, Result AOtherResult, int ASelfFinger, int ASelfSum, Result ASelfResult) { /* 这机器人不关心比赛结果 */ } } public class Zswang二号 : Drunkard { private Random random; public Zswang二号() { random = new Random(); } public override void Come(out int AFinger, out int ASum) { ASum = random.Next(10 + 1); //0-10 if (ASum < 5) // 别犯规 AFinger = random.Next(ASum + 1); else AFinger = random.Next(ASum - 5, 5 + 1); } public override void Outcome(int AOtherFinger, int AOtherSum, Result AOtherResult, int ASelfFinger, int ASelfSum, Result ASelfResult) { /* 这机器人也不关心比赛结果 */ } } /// <summary> /// 酒馆类 /// </summary> /// <typeparam name="T1">划拳机器人1</typeparam> /// <typeparam name="T2">划拳机器人2</typeparam> public class Drunkery<T1, T2> where T1 : Drunkard, new() where T2 : Drunkard, new() { /// <summary> /// 东家 /// </summary> private Drunkard eastPlayer; /// <summary> /// 西家 /// </summary> private Drunkard westPlayer; /// <summary> /// 东家积分 /// </summary> private int eastTotal; /// <summary> /// 西家积分 /// </summary> private int westTotal; /// <summary> /// 东家超时次数 /// </summary> private int eastOvertime; /// <summary> /// 西家超时次数 /// </summary> private int westOvertime; /// <summary> /// 划拳次数 /// </summary> public const int comeCount = 1000; /// <summary> /// 超时罚分 /// </summary> public const int overtimePenalty = 1; /// <summary> /// 异常罚分 /// </summary> public const int catchPenalty = 100; /// <summary> /// 开始比赛 /// </summary> public void Play() { #region 初始化 long vEastTick = Environment.TickCount; // 东家初始化的时间 eastPlayer = new T1(); vEastTick = Environment.TickCount - vEastTick; long vWestTick = Environment.TickCount; // 西家初始化的时间 westPlayer = new T2(); vWestTick = Environment.TickCount - vWestTick; eastTotal = 0; westTotal = 0; eastOvertime = 0; westOvertime = 0; #region 超时处理 if (vEastTick > 1000 || vWestTick > 1000) { if (vEastTick > 1000) Console.WriteLine("{0}初始化严重超时", typeof(T1).Name); if (vWestTick > 1000) Console.WriteLine("{0}初始化严重超时", typeof(T2).Name); return; } if (vEastTick > 100) { eastTotal -= overtimePenalty; eastOvertime++; } if (vWestTick > 100) { westTotal -= overtimePenalty; westOvertime++; } #endregion 超时处理 #endregion 初始化 #region 猜拳过程 for (int i = 0; i < comeCount; i++) { for (int j = 0; j < 100; j++) { int vEastFinger = 0, vWestFinger = 0; int vEastSum = 0, vWestSum = 0; Result vEastResult = Result.Unknown; Result vWestResult = Result.Unknown; #region 出拳 bool vEastCatch = false; vEastTick = Environment.TickCount; // 东家出拳的时间 try { eastPlayer.Come(out vEastFinger, out vEastSum); } catch // 出现异常 { vEastCatch = true; } vEastTick = Environment.TickCount - vEastTick; bool vWestCatch = false; vWestTick = Environment.TickCount; // 西家出拳的时间 try { westPlayer.Come(out vWestFinger, out vWestSum); } catch // 出现异常 { vWestCatch = true; } vWestTick = Environment.TickCount - vWestTick; #endregion 出拳 #region 出现异常 if (vEastCatch || vWestCatch) { if (vEastCatch) { eastTotal -= catchPenalty; westTotal++; } if (vWestCatch) { westTotal -= catchPenalty; eastTotal++; } break; } #endregion 出现异常
#2楼 得分:0回复于:2008-04-21 17:56:26
C# code
#region 超时处理 if (vEastTick > 1000 || vWestTick > 1000) { if (vEastTick > 1000) Console.WriteLine("{0}出拳严重超时", typeof(T1).Name); if (vWestTick > 1000) Console.WriteLine("{0}出拳严重超时", typeof(T2).Name); return; } if (vEastTick > 100) { vEastResult = Result.Overtime; eastOvertime++; } if (vWestTick > 100) { vWestResult = Result.Overtime; westOvertime++; } #endregion 超时处理 #region 判断谁犯规 if (vEastResult == Result.Unknown) if (vEastSum < 0 || vEastSum > 10 || vEastFinger < 0 || vEastFinger > 5 || vEastSum - 5 > vEastFinger || vEastFinger > vEastSum) vEastResult = Result.Foul; if (vWestResult == Result.Unknown) if (vWestSum < 0 || vWestSum > 10 || vWestFinger < 0 || vWestFinger > 5 || vWestSum - 5 > vWestFinger || vWestFinger > vWestSum) vWestResult = Result.Foul; #endregion 判断谁犯规 #region 有一个人犯规 if (vEastResult == Result.Foul ^ vWestResult == Result.Foul) { #region 如犯规判则对方赢 if (vEastResult == Result.Foul) vWestResult = Result.Win; else if (vWestResult == Result.Foul) vEastResult = Result.Win; #endregion 如犯规判则对方赢 } #endregion 有一个人犯规 #region 划拳比较 if (vEastResult == Result.Unknown) if (vEastFinger + vWestFinger == vEastSum) vEastResult = Result.Win; if (vWestResult == Result.Unknown) if (vEastFinger + vWestFinger == vWestSum) vWestResult = Result.Win; #endregion 划拳比较 #region 平局 if (vEastResult == vWestResult) { vEastResult = Result.Dogfall; vWestResult = Result.Dogfall; } #endregion 平局 #region 出现胜负 if (vEastResult == Result.Win || vWestResult == Result.Win) { if (vEastResult == Result.Win) { eastTotal++; vWestResult = Result.Lost; } else if (vWestResult == Result.Win) { westTotal++; vEastResult = Result.Lost; } } #endregion 出现胜负 #region 通知划拳的结果 vEastTick = Environment.TickCount; vEastCatch = false; try { eastPlayer.Outcome(vWestFinger, vWestSum, vWestResult, vEastFinger, vEastSum, vEastResult); } catch { vEastCatch = true; } vEastTick = Environment.TickCount - vEastTick; vWestTick = Environment.TickCount; vWestCatch = false; try { westPlayer.Outcome(vEastFinger, vEastSum, vEastResult, vWestFinger, vWestSum, vWestResult); } catch { vWestCatch = true; } vWestTick = Environment.TickCount - vWestTick; #endregion 通知划拳的结果 #region 出现异常 if (vEastCatch || vWestCatch) { if (vEastCatch) { eastTotal -= catchPenalty; westTotal++; } if (vWestCatch) { westTotal -= catchPenalty; eastTotal++; } break; } #endregion 出现异常 #region 超时处理 if (vEastTick > 1000 || vWestTick > 1000) { if (vEastTick > 1000) Console.WriteLine("{0}接收结果严重超时", typeof(T1).Name); if (vWestTick > 1000) Console.WriteLine("{0}接收结果严重超时", typeof(T2).Name); return; } if (vEastTick > 100) { eastTotal -= overtimePenalty; eastOvertime++; } if (vWestTick > 100) { westTotal -= overtimePenalty; westOvertime++; } if (eastOvertime > 10 || westOvertime > 10) { if (eastOvertime > 10) Console.WriteLine("{0}超时十次以上", typeof(T1).Name); if (westOvertime > 10) Console.WriteLine("{0}超时十次以上", typeof(T2).Name); return; } #endregion 超时处理 #region 出现胜负 if (vEastResult == Result.Win || vWestResult == Result.Win) break; #endregion 出现胜负 } } #endregion 猜拳过程 #region 输出结果 Console.WriteLine("{0}得分:{1}, {2}得分:{3}", typeof(T1).Name, eastTotal, typeof(T2).Name, westTotal); Console.ReadLine(); #endregion 输出结果 } } class Program { static void Main(string[] args) { new Drunkery<Zswang一号, Zswang二号>().Play(); } } }
#3楼 得分:0回复于:2008-04-21 17:57:37
C# code
public class Zswang二号 : Drunkard { private Random random; public Zswang二号() { random = new Random(); } public override void Come(out int AFinger, out int ASum) { ASum = random.Next(10 + 1); //0-10 if (ASum < 5) // 别犯规 AFinger = random.Next(ASum + 1); else AFinger = random.Next(ASum - 5, 5 + 1); } public override void Outcome(int AOtherFinger, int AOtherSum, Result AOtherResult, int ASelfFinger, int ASelfSum, Result ASelfResult) { /* 这机器人也不关心比赛结果 */ } }


目前“Zswang二号”是第一个擂主!现在游戏开始!
#4楼 得分:1回复于:2008-04-21 18:00:27
沙发。学习跟伴水学习
#5楼 得分:1回复于:2008-04-21 18:05:35
LZ很厉害!!!
#6楼 得分:0回复于:2008-04-21 18:05:44
可以这样调试自己的代码,擂主:T1、挑战者:T2
C# code
new Drunkery<Zswang二号, 长江七号>().Play();
  • lawrendc用户头像
  • lawrendc
  • (蜗牛也是牛)
  • 等 级:
#7楼 得分:1回复于:2008-04-21 18:08:58
立志向楼主学习
  • lx1215用户头像
  • lx1215
  • (乡下人)
  • 等 级:
#8楼 得分:1回复于:2008-04-21 18:10:00
真是开眼了!!!
#9楼 得分:1回复于:2008-04-21 18:20:57
在这先标记一下
#10楼 得分:1回复于:2008-04-21 18:27:41
路过拿分来了。。的确很有意思。。留个标记
#11楼 得分:1回复于:2008-04-21 18:36:02
有意思~ 路过 没时间搞
#12楼 得分:1回复于:2008-04-21 18:44:49
路过 mark
#13楼 得分:1回复于:2008-04-21 18:51:29
LZ,很厉害,崇拜一个先
#14楼 得分:1回复于:2008-04-21 18:53:28
强帖留名而已。
  • W_W_Q用户头像
  • W_W_Q
  • (韦一笑)
  • 等 级:
#15楼 得分:1回复于:2008-04-21 18:55:17
如何使自己出码毫无规律,如何判断对方出码的概率
  • lsc460用户头像
  • lsc460
  • ( 橙路)
  • 等 级:
#16楼 得分:1回复于:2008-04-21 18:56:31
学习了,先抢位再研究
  • Magic_YJL用户头像
  • Magic_YJL
  • (.NET 飞一般的菜鸟)
  • 等 级:
#17楼 得分:1回复于:2008-04-21 19:01:08
汗~
LZ可真闲,我整天工作写的代码就把我折腾得够呛的了!
不过帮顶了
#18楼 得分:1回复于:2008-04-21 19:01:47
机器人长什么样,有图吗?
  • Magic_YJL用户头像
  • Magic_YJL
  • (.NET 飞一般的菜鸟)
  • 等 级:
#19楼 得分:1回复于:2008-04-21 19:02:28
你不是已经写好了,为何还要贴出来,再让我们去写?
不过看看也好~
#20楼 得分:1回复于:2008-04-21 19:09:24
支持楼主
#21楼 得分:0回复于:2008-04-21 19:33:31
引用 19 楼 Magic_YJL 的回复:
你不是已经写好了,为何还要贴出来,再让我们去写?
不过看看也好~
那是擂主,是想大家写出另一个机器人打败它,当新擂主
  • sc_gw用户头像
  • sc_gw
  • (Keanu)
  • 等 级:
#22楼 得分:1回复于:2008-04-21 20:03:53
顶,代码写得很清晰.
#23楼 得分:1回复于:2008-04-21 20:09:42
楼主想研究人工智能么?
#24楼 得分:1回复于:2008-04-21 20:13:30
哈哈,牛!
#25楼 得分:1回复于:2008-04-21 20:39:30
来接分了
  • pueler用户头像
  • pueler
  • ( ̄ε ̄)
  • 等 级:
#26楼 得分:1回复于:2008-04-21 20:39:58
up,飘过...
#27楼 得分:1回复于:2008-04-21 21:01:30
很有意思, 呵呵

建议将完整的工程放到 csdn 下载区,这样才好编写新的机器人
#28楼 得分:1回复于:2008-04-21 21:14:32
有意思,来接分
#29楼 得分:1回复于:2008-04-21 21:45:04
接分~~
#30楼 得分:1回复于:2008-04-21 21:46:35
呵呵,还真有意思~
帮顶~
#31楼 得分:1回复于:2008-04-21 21:55:43
收藏~学习~
LZ好强
向LZ学习
  • Xzoth用户头像
  • Xzoth
  • (Good Rat)
  • 等 级:
#32楼 得分:1回复于:2008-04-21 21:58:00
嗯嗯,有点意思
  • Xzoth用户头像
  • Xzoth
  • (Good Rat)
  • 等 级:
#33楼 得分:1回复于:2008-04-21 21:58:50
如何参加比赛?
  • Xzoth用户头像
  • Xzoth
  • (Good Rat)
  • 等 级:
#34楼 得分:1回复于:2008-04-21 22:00:56
建议楼主做一个框架
比赛弄成Web Services
让我们做的机器人在本地通过Web Services就可以跟其他机器人比赛
#35楼 得分:1回复于:2008-04-21 22:23:09
太厉害了 尿个尿 做个记号
#36楼 得分:1回复于:2008-04-21 22:31:10
顶一个
#37楼 得分:1回复于:2008-04-21 22:57:17
找个地,坐下来看你们划拳。 
  • yslan用户头像
  • yslan
  • (yslan)
  • 等 级:
#38楼 得分:1回复于:2008-04-21 23:17:51
  • yslan用户头像
  • yslan
  • (yslan)
  • 等 级:
#39楼 得分:1回复于:2008-04-21 23:19:51
引用 37 楼 wxlxiaosan 的回复:
找个地,坐下来看你们划拳。 
#40楼 得分:5回复于:2008-04-22 00:38:29
随机性太高了,感觉根本没办法守擂,打擂也要靠一点随机,抛砖引玉了
public class zhangenter : Drunkard
    {
        private Random random;
        int[] betterFinger = new int[] { 0, 0, 5, 5 };
        int[] betterSum = new int[] { 0, 5, 5, 10 };
        int lastIndex = 0;

        public zhangenter()
        {
            random = new Random();
        }       

        public override void Come(out int AFinger, out int ASum)
        {
            AFinger = betterFinger[lastIndex];
            ASum = betterSum[lastIndex];
        }

        public override void Outcome(int AOtherFinger, int AOtherSum, Result AOtherResult,
            int ASelfFinger, int ASelfSum, Result ASelfResult)
        {
            if (ASelfResult != Result.Win)
            {
                int newIndex;
                while ((newIndex = random.Next(4)) != lastIndex)
                    lastIndex = newIndex;
            }
        }
    }
#41楼 得分:1回复于:2008-04-22 01:50:35
留名  自勉   
  • possible_Y用户头像
  • possible_Y
  • (████本人签名需要刮开,方可)
  • 等 级:
#42楼 得分:1回复于:2008-04-22 04:25:40
是个策略模式
#43楼 得分:1回复于:2008-04-22 06:42:04
mark
  • duzhonghua用户头像
  • duzhonghua
  • (又失败了........回家下)
  • 等 级:
#44楼 得分:1回复于:2008-04-22 08:55:04
呵呵,支持个,收藏了
#45楼 得分:1回复于:2008-04-22 09:16:21
up
有空了研究研究……找个人学划拳去
  • lfhlyx用户头像
  • lfhlyx
  • (飞~)
  • 等 级:
#46楼 得分:1回复于:2008-04-22 09:35:01
恩恩~~~收藏先!
#47楼 得分:1回复于:2008-04-22 09:37:16
没时间,mark一下
#48楼 得分:1回复于:2008-04-22 09:37:47
看完了代码,一个字,爽,
能问下LZ,

    public class Drunkery <T1, T2>
        where T1 : Drunkard, new()
        where T2 : Drunkard, new()

这个是做什么吗?在自己的编码过程中怎么使用?
#49楼 得分:1回复于:2008-04-22 09:42:06
很有意思勒~下班了再来看。
#50楼 得分:1回复于:2008-04-22 09:46:23
如果庄家纯随机,闲家怎么赢?
#51楼 得分:1回复于:2008-04-22 09:48:14
还不到这个层次只能支持了
#52楼 得分:1回复于:2008-04-22 09:48:55
PatrickPan
收藏,下班后研究一下。
#53楼 得分:0回复于:2008-04-22 09:55:06
感谢40提供的代码,但是没有获得600分以上,不能打败擂主
一些执行结果Zswang二号得分:508, zhangenter得分:492这
Zswang二号得分:503, zhangenter得分:497


引用 48 楼 zhengqian529 的回复:
看完了代码,一个字,爽,
能问下LZ,
public class Drunkery <T1, T2>
where T1 : Drunkard, new()
where T2 : Drunkard, new()
这个是做什么吗?在自己的编码过程中怎么使用?
这是泛型,指定T1、T2必须从Drunkard继承。。。
你可以参考40楼提交的代码,依照这个编写就可以了。。。
#54楼 得分:0回复于:2008-04-22 09:57:14
引用 34 楼 Xzoth 的回复:
建议楼主做一个框架
比赛弄成Web Services
让我们做的机器人在本地通过Web Services就可以跟其他机器人比赛
挺不错的想法,以后可以考虑。。。。
  • lspwl用户头像
  • lspwl
  • (蓝冰)
  • 等 级:
#55楼 得分:1回复于:2008-04-22 10:00:08
标记学习中
#56楼 得分:1回复于:2008-04-22 10:01:39
  mark
#57楼 得分:1回复于:2008-04-22 10:02:39
看完代码,很爽

LZ能讲解一下

    public class Drunkery <T1, T2>
        where T1 : Drunkard, new()
        where T2 : Drunkard, new()

怎么理解吗?
#58楼 得分:1回复于:2008-04-22 10:03:53
谢谢LZ 我这里网络慢  谢谢你的回复
  • leo_818用户头像
  • leo_818
  • (郎心勾妃)
  • 等 级:
#59楼 得分:1回复于:2008-04-22 10:06:23
不错,学习了
  • Erice用户头像
  • Erice
  • (白雪公猪)
  • 等 级:
#60楼 得分:1回复于:2008-04-22 10:08:23
如果引入遗传算法,更有意思哈。这样每代机器人,都会学到对手上次的出拳规律,形成一个专家知识库。出拳时和猜拳时都在这个知识库中搜索 对手的一个命中率高的出拳和一个低命中率的猜拳
  • fuda_1985用户头像
  • fuda_1985
  • (说明文字变短了!倒地!!!)
  • 等 级:
#61楼 得分:1回复于:2008-04-22 10:09:08
强帐留名帮顶接分收藏
#62楼 得分:1回复于:2008-04-22 10:11:21
建议加个要求,不准用随机,这样比赛才有点意思
#63楼 得分:1回复于:2008-04-22 10:15:01
那每次出拳都应该是随机性的,不可能控制。

但是两个的出拳机制不一样,但是都是随机的,结果也很随机吧?
#64楼 得分:0回复于:2008-04-22 10:18:08
引用 62 楼 jdczp 的回复:
建议加个要求,不准用随机,这样比赛才有点意思
提示一下:Random是一个伪随机^o^
擂主的代码是透明的,知己知彼可百战百胜。。。
#65楼 得分:0回复于:2008-04-22 10:27:43
比如攻击40楼的机器人:
分析他的代码,很明显,他只会出手指0和5,只会猜结果是0,5,10
C# code
int[] betterFinger = new int[] { 0, 0, 5, 5 }; int[] betterSum = new int[] { 0, 5, 5, 10 };

那我就出1个手指,他的结果(0,5,10)永远不会出现。
只要不犯规,就能可以完胜(得分1000)。
C# code
public class zhangenter_Killer : Drunkard { public override void Come(out int AFinger, out int ASum) { AFinger = 1; ASum = 6; } public override void Outcome(int AOtherFinger, int AOtherSum, Result AOtherResult, int ASelfFinger, int ASelfSum, Result ASelfResult) { } }
#66楼 得分:5回复于:2008-04-22 10:28:21
C# code
public class Zswang三号 : Drunkard { private Random random; private int lessFour; private int lassFour; public Zswang三号() { random = new Random(); lessFour = 0; lassFour = 0; } private int Finger() { int finger = 0; if(lessFour>=lassFour) finger = random.Next(5 + 1); //0-10 if(lessFour< lassFour) finger = 5; return finger; } public override void Come(out int AFinger, out int ASum) { AFinger = Finger(); //0-10 if(AFinger<=4) ASum = 4; else ASum = 10; } public override void Outcome(int AOtherFinger, int AOtherSum, Result AOtherResult, int ASelfFinger, int ASelfSum, Result ASelfResult) { /* 这机器人关心比赛结果 */ if(ASelfResult == Result.Win) { if(ASelfSum==4) lessFour++; else lassFour++; } } }

俺们那里有个人猜拳很强悍,只猜4和10,大部分都能赢。
俺写的很菜,表骂俺...
D:\>2
Zswang二号得分:473, Zswang三号得分:527


D:\>2
Zswang二号得分:522, Zswang三号得分:478


D:\>2
Zswang二号得分:480, Zswang三号得分:520


D:\>2
Zswang二号得分:498, Zswang三号得分:502


D:\>2
Zswang二号得分:492, Zswang三号得分:508


D:\>2
Zswang二号得分:488, Zswang三号得分:512
#67楼 得分:0回复于:2008-04-22 10:30:21
当然zhangenter_Killer如果当上擂主也将不堪一击。。。

目前擂主还是“Zswang二号”
#68楼 得分:0回复于:2008-04-22 10:36:54
66楼的代码也是随机对随机。。。但得分不能高于600不能算打败擂主。。。
#69楼 得分:1回复于:2008-04-22 10:39:44
有意思啊,中午的时候研究一下
#70楼 得分:1回复于:2008-04-22 10:48:18
jf
  • grearo用户头像
  • grearo
  • (学会珍惜)
  • 等 级:
#71楼 得分:1回复于:2008-04-22 10:54:34
路过有分,接分
#72楼 得分:1回复于:2008-04-22 11:15:47
mark
  • cometing用户头像
  • cometing
  • (【一日一夜】→ 猛男)
  • 等 级:
#73楼 得分:1回复于:2008-04-22 11:21:20
路过,接分
  • yuwenge用户头像
  • yuwenge
  • (活得痛快)
  • 等 级:
#74楼 得分:3回复于:2008-04-22 11:23:55
C# code
public class Yuwenge : Drunkard { private Random random; public Zswang二号() { random = new Random(); } public override void Come(out int AFinger, out int ASum) { AFinger = 2; ASum = 2 + random.Next(99)%5+1; } public override void Outcome(int AOtherFinger, int AOtherSum, Result AOtherResult, int ASelfFinger, int ASelfSum, Result ASelfResult) { /* 这机器人不关心比赛结果 */ } }
#75楼 得分:0回复于:2008-04-22 11:30:23
74楼机器人赢分挺多,遗憾没有超过600分,暂不能打败擂主
抽样结果Zswang二号得分:433, Yuwenge得分:567
Zswang二号得分:446, Yuwenge得分:554
#76楼 得分:1回复于:2008-04-22 11:37:13
路过,学习
  • hackztx用户头像
  • hackztx
  • (神啊,让我来拯救程序员吧!)
  • 等 级:
#77楼 得分:1回复于:2008-04-22 11:38:14
有时间把此代码应用在winform中!!

先搜藏下!
  • leo_qh用户头像
  • leo_qh
  • (东北小胖)
  • 等 级:
#78楼 得分:1回复于:2008-04-22 12:10:18
LZ,很厉害,崇拜一个先
#79楼 得分:1回复于:2008-04-22 12:18:11
不错,收藏。
#80楼 得分:1回复于:2008-04-22 12:23:02
学习
#81楼 得分:1回复于:2008-04-22 12:25:17
强人
#82楼 得分:1回复于:2008-04-22 12:56:43
C# code
public override void Come(out int AFinger, out int ASum) { AFinger=random.Next(6); if (AFinger==5) { ASum = random.Next(10 + 1); } else ASum = 5; }


好吃亏,输大了
#83楼 得分:1回复于:2008-04-22 13:26:26
记号一下
  • firein用户头像
  • firein
  • (小南门)
  • 等 级:
#84楼 得分:10回复于:2008-04-22 13:38:48
C# code
public class Linxu一号 : Drunkard { public override void Come(out int AFinger, out int ASum) { ASum = 1; AFinger = 1; } public override void Outcome(int AOtherFinger, int AOtherSum, Result AOtherResult, int ASelfFinger, int ASelfSum, Result ASelfResult) { /* 这机器人也不关心比赛结果 */ } }
#85楼 得分:1回复于:2008-04-22 13:41:52
引用 16 楼 lsc460 的回复:
学习了,先抢位再研究
#86楼 得分:0回复于:2008-04-22 13:42:24
Linxu一号能打败Zswang二号,现在“Linxu一号”擂主 // 不过守擂不了多久。。。。
详情Zswang二号得分:373, Linxu一号得分:627

  • firein用户头像
  • firein
  • (小南门)
  • 等 级:
#87楼 得分:1回复于:2008-04-22 13:42:33
不知道为什么
但是结果:
Linxu一号得分:621, Zswang二号得分:379
Linxu一号得分:618, Zswang二号得分:382
Linxu一号得分:625, Zswang二号得分:375
Linxu一号得分:631, Zswang二号得分:369
#88楼 得分:1回复于:2008-04-22 13:42:47
我好想晕
#89楼 得分:1回复于:2008-04-22 13:44:15
路过
#90楼 得分:0回复于:2008-04-22 13:44:46
网上没找到random.next的算法,楼主知道吗?
现在这样要想赢还是只能靠运气啊
#91楼 得分:0回复于:2008-04-22 13:45:07
引用 83 楼 HimeTale 的回复:
记号一下
  • firein用户头像
  • firein
  • (小南门)
  • 等 级:
#92楼 得分:0回复于:2008-04-22 13:46:01
引用 90 楼 HimeTale 的回复:
网上没找到random.next的算法,楼主知道吗?
现在这样要想赢还是只能靠运气啊

返回一个小于所指定最大值的非负随机数
#93楼 得分:0回复于:2008-04-22 13:53:58
学习了
#94楼 得分:0回复于:2008-04-22 13:54:55
不错的想法
能加上界面图形我想就更好了,每个人的机器人做成dll的形式由一个Game.exe自己选择调用,加载图形界面,加载两个dll进行PK
最终显示结果

#95楼 得分:0回复于:2008-04-22 13:58:08
这个游戏太简单了
不如做个类似于生命游戏的

给定地图,几个部落发展,抢夺资源,繁衍
#96楼 得分:0回复于:2008-04-22 14:01:10
jf
#97楼 得分:0回复于:2008-04-22 14:01:51
marks,and study
#98楼 得分:0回复于:2008-04-22 14:08:49
初学C#,看不太懂,更不用说打败了。
学习。。。
#99楼 得分:10回复于:2008-04-22 14:13:23
C# code
public class yunfeng007 : Drunkard { private Random random; private int lessFour; private int lassFour; private int otherlessFour; private int otherlassFour; public yunfeng007() { random = new Random(); lessFour=0; lassFour=0; otherlessFour=0; otherlassFour=0; } private int Finger() { int finger = 0; if(lessFour>=lassFour) finger = 1 + random.Next(3 + 1); //0-10 if(lessFour< lassFour) finger = 5; return finger; } public override void Come(out int AFinger, out int ASum) { AFinger = Finger(); //0-10 if(AFinger<=4) ASum = 4; else ASum = 10; } public override void Outcome(int AOtherFinger, int AOtherSum, Result AOtherResult, int ASelfFinger, int ASelfSum, Result ASelfResult) { if(AOtherFinger<=4) ++otherlessFour; else ++otherlassFour; /* 这机器人关心比赛结果 */ if(ASelfResult == Result.Win) { if(ASelfSum==4) ++lessFour; else ++lassFour; } if(ASelfResult == Result.Lost || ASelfResult == Result.Unknown) { if(ASelfSum==4 && otherlessFour<=otherlassFour) {--lessFour;++lassFour;} else {--lassFour;++lessFour;} } } }

我这个虽然不好赢zswang二号,但赢现在的Linxu一号还是绰绰有余的吧??
#100楼 得分:0回复于:2008-04-22 14:18:52
引用 87 楼 firein 的回复:
不知道为什么
但是结果:
Linxu一号得分:621, Zswang二号得分:379
Linxu一号得分:618, Zswang二号得分:382
Linxu一号得分:625, Zswang二号得分:375
Linxu一号得分:631, Zswang二号得分:369


做一下统计,伴水二号出0个手指和5个手指的几率最大。
统计sum[0]=105
sum[1]=89
sum[2]=86
sum[3]=94
sum[4]=93
sum[5]=92
sum[6]=91
sum[7]=90
sum[8]=90
sum[9]=91
sum[10]=79
finger[0]=233
finger[1]=140
finger[2]=124
finger[3]=131
finger[4]=160
finger[5]=212

合计(sum)概率均等
手指(finger)概率是向大小两头增加
因为出手指是有条件的,必须满足finger <= sum && finger >= sum - 5
相关问题
【编程游戏】编写一个会划拳的机器人参加擂台赛,规则内详。路过有分 ...
【编程游戏】划拳机器人,前面一贴的机器人都集中来了,继续PK。谨慎路过。
强烈鄙视“jzcdelphi ”这种人