首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

【编程游戏】编纂一个会划拳的机器人参加擂台赛,规则内详。路过有分

2011-12-26 
【编程游戏】编写一个会划拳的机器人参加擂台赛,规则内详。路过有分。我们来玩一个类似“Robocode”的游戏。划拳

【编程游戏】编写一个会划拳的机器人参加擂台赛,规则内详。路过有分。
我们来玩一个类似“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、其余分数酌情散掉。

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

(调试代码参考后面两帖,-_-!!!代码有点多,先别抢沙发。。。。)

[解决办法]
沙发。学习跟伴水学习
[解决办法]
LZ很厉害!!!
[解决办法]
立志向楼主学习
[解决办法]
真是开眼了!!!
[解决办法]
在这先标记一下
[解决办法]
路过拿分来了。。的确很有意思。。留个标记
[解决办法]
有意思~ 路过 没时间搞
[解决办法]
路过 mark
[解决办法]
LZ,很厉害,崇拜一个先
[解决办法]
强帖留名而已。
[解决办法]
如何使自己出码毫无规律,如何判断对方出码的概率
[解决办法]
学习了,先抢位再研究
[解决办法]
汗~
LZ可真闲,我整天工作写的代码就把我折腾得够呛的了!
不过帮顶了
[解决办法]
机器人长什么样,有图吗?
[解决办法]
你不是已经写好了,为何还要贴出来,再让我们去写?
不过看看也好~
[解决办法]
支持楼主
[解决办法]
顶,代码写得很清晰.
[解决办法]
楼主想研究人工智能么?
[解决办法]
哈哈,牛!
[解决办法]
来接分了
------解决方案--------------------


up,飘过...
[解决办法]
很有意思, 呵呵

建议将完整的工程放到 csdn 下载区,这样才好编写新的机器人
[解决办法]
有意思,来接分
[解决办法]
接分~~
[解决办法]
呵呵,还真有意思~
帮顶~
[解决办法]
收藏~学习~
LZ好强
向LZ学习
[解决办法]
嗯嗯,有点意思
[解决办法]
如何参加比赛?
[解决办法]
建议楼主做一个框架
比赛弄成Web Services
让我们做的机器人在本地通过Web Services就可以跟其他机器人比赛
[解决办法]
太厉害了 尿个尿 做个记号
[解决办法]
顶一个
[解决办法]
找个地,坐下来看你们划拳。
[解决办法]

[解决办法]

探讨
找个地,坐下来看你们划拳。

[解决办法]
随机性太高了,感觉根本没办法守擂,打擂也要靠一点随机,抛砖引玉了
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;
}
}
}
[解决办法]
留名 自勉
[解决办法]
是个策略模式
[解决办法]
mark
[解决办法]
呵呵,支持个,收藏了
[解决办法]
up
有空了研究研究……找个人学划拳去
[解决办法]
恩恩~~~收藏先!
[解决办法]
没时间,mark一下
[解决办法]
看完了代码,一个字,爽,
能问下LZ,

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

这个是做什么吗?在自己的编码过程中怎么使用?
[解决办法]
很有意思勒~下班了再来看。


[解决办法]
如果庄家纯随机,闲家怎么赢?
[解决办法]
还不到这个层次只能支持了
[解决办法]

PatrickPan
收藏,下班后研究一下。

[解决办法]
标记学习中
[解决办法]
mark
[解决办法]
看完代码,很爽

LZ能讲解一下

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

怎么理解吗?
[解决办法]
谢谢LZ 我这里网络慢 谢谢你的回复

[解决办法]
不错,学习了
[解决办法]
如果引入遗传算法,更有意思哈。这样每代机器人,都会学到对手上次的出拳规律,形成一个专家知识库。出拳时和猜拳时都在这个知识库中搜索 对手的一个命中率高的出拳和一个低命中率的猜拳
[解决办法]
强帐留名帮顶接分收藏
[解决办法]
建议加个要求,不准用随机,这样比赛才有点意思
[解决办法]
那每次出拳都应该是随机性的,不可能控制。

但是两个的出拳机制不一样,但是都是随机的,结果也很随机吧?
[解决办法]
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++;                           }        }    }
[解决办法]
有意思啊,中午的时候研究一下
[解决办法]
jf
[解决办法]
路过有分,接分
[解决办法]
mark
[解决办法]
路过,接分
[解决办法]
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)    {        /* 这机器人不关心比赛结果 */    }} 


[解决办法]
路过,学习
[解决办法]
有时间把此代码应用在winform中!!

先搜藏下!
[解决办法]
LZ,很厉害,崇拜一个先
[解决办法]
不错,收藏。
[解决办法]
学习
[解决办法]
强人
[解决办法]

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;        }
[解决办法]
记号一下
[解决办法]
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)        {            /* 这机器人也不关心比赛结果 */        }    }
[解决办法]
探讨
学习了,先抢位再研究

[解决办法]
不知道为什么
但是结果:
Linxu一号得分:621, Zswang二号得分:379
Linxu一号得分:618, Zswang二号得分:382
Linxu一号得分:625, Zswang二号得分:375
Linxu一号得分:631, Zswang二号得分:369
[解决办法]
我好想晕
[解决办法]
路过
[解决办法]
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;}            }        }    } 

热点排行