【编程游戏】编写一个会划拳的机器人参加擂台赛,规则内详。路过有分。
我们来玩一个类似“Robocode”的游戏。
划拳规则看完了,那我们就开始写一个会划拳的机器人吧!
那么一个会划拳的机器会做什么事情呢?其实就是两件:
第一件、出拳,即:自己出几个手指?自己猜合计是多少。
第二件、知道划拳的结果,即:对方出几个手指,对方猜合计是多少,是否获胜还是平局还是其他。
只要继承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()
这个是做什么吗?在自己的编码过程中怎么使用?
[解决办法]
很有意思勒~下班了再来看。
[解决办法]
如果庄家纯随机,闲家怎么赢?
[解决办法]
还不到这个层次只能支持了
[解决办法]
[解决办法]
标记学习中
[解决办法]
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;} } } }