参加请到: /u/0421/17/6a4d1c20-e1d1-4e9d-99ae-d648cb422ca6.html
我们来玩一个类似“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、其余分数酌情散掉。
标准代码和比赛规则有什么不妥或者建议欢迎讨论,谢谢关注
(调试代码参考后面两帖,-_-!!!代码有点多,先别抢沙发。。。。)
using System;
using System.Collections.Generic;
using System.Text;
namespace Huaquan
... {
/**////<summary>
///划拳结果
///</summary>
publicenumResult
...{
/**////<summary>
///未知,还没开始判断
///</summary>
Unknown,
/**////<summary>
///平局,结果一致
///</summary>
Dogfall,
/**////<summary>
///胜,猜中结果
///</summary>
Win,
/**////<summary>
///负,对方猜中结果,自己没有猜中
///</summary>
Lost,
/**////<summary>
///犯规,
///</summary>
Foul,
/**////<summary>
///超时,反应时间超出100毫秒
///</summary>
Overtime
}
/**////<summary>
///酒鬼类
///</summary>
publicabstractclassDrunkard
...{
/**////<summary>
///出拳
///</summary>
///<paramname="ANumber">出的手指数</param>
///<paramname="ASum">猜的合计</param>
abstractpublicvoidCome(outintAFinger,outintASum);
/**////<summary>
///接收结果
///</summary>
///<paramname="AOtherFinger">对方出的手指数</param>
///<paramname="AOtherSum">对方猜的合计</param>
///<paramname="AOtherResult">对方划拳的结果</param>
///<paramname="ASelfFinger">自己出的手指数</param>
///<paramname="ASelfSum">自己猜的合计</param>
///<paramname="ASelfResult">自己划拳的结果</param>
abstractpublicvoidOutcome(intAOtherFinger,intAOtherSum,ResultAOtherResult,
intASelfFinger,intASelfSum,ResultASelfResult);
}
publicclassZswang一号:Drunkard
...{
publicoverridevoidCome(outintAFinger,outintASum)
...{
AFinger=5;//每次都出5
ASum=10;//每次都猜10
}
publicoverridevoidOutcome(intAOtherFinger,intAOtherSum,ResultAOtherResult,
intASelfFinger,intASelfSum,ResultASelfResult)
...{
/**//*这机器人不关心比赛结果*/
}
}
publicclassZswang二号:Drunkard
...{
privateRandomrandom;
publicZswang二号()
...{
random=newRandom();
}
publicoverridevoidCome(outintAFinger,outintASum)
...{
ASum=random.Next(10+1);//0-10
if(ASum<5)//别犯规
AFinger=random.Next(ASum+1);
elseAFinger=random.Next(ASum-5,5+1);
}
publicoverridevoidOutcome(intAOtherFinger,intAOtherSum,ResultAOtherResult,
intASelfFinger,intASelfSum,ResultASelfResult)
...{
/**//*这机器人也不关心比赛结果*/
}
}
/**////<summary>
///酒馆类
///</summary>
///<typeparamname="T1">划拳机器人1</typeparam>
///<typeparamname="T2">划拳机器人2</typeparam>
publicclassDrunkery<T1,T2>
whereT1:Drunkard,new()
whereT2:Drunkard,new()
...{
/**////<summary>
///东家
///</summary>
privateDrunkardeastPlayer;
/**////<summary>
///西家
///</summary>
privateDrunkardwestPlayer;
/**////<summary>
///东家积分
///</summary>
privateinteastTotal;
/**////<summary>
///西家积分
///</summary>
privateintwestTotal;
/**////<summary>
///东家超时次数
///</summary>
privateinteastOvertime;
/**////<summary>
///西家超时次数
///</summary>
privateintwestOvertime;
/**////<summary>
///划拳次数
///</summary>
publicconstintcomeCount=1000;
/**////<summary>
///超时罚分
///</summary>
publicconstintovertimePenalty=1;
/**////<summary>
///异常罚分
///</summary>
publicconstintcatchPenalty=100;
/**////<summary>
///开始比赛
///</summary>
publicvoidPlay()
...{
初始化#region初始化
longvEastTick=Environment.TickCount;//东家初始化的时间
eastPlayer=newT1();
vEastTick=Environment.TickCount-vEastTick;
longvWestTick=Environment.TickCount;//西家初始化的时间
westPlayer=newT2();
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(inti=0;i<comeCount;i++)
...{
for(intj=0;j<100;j++)
...{
intvEastFinger=0,vWestFinger=0;
intvEastSum=0,vWestSum=0;
ResultvEastResult=Result.Unknown;
ResultvWestResult=Result.Unknown;
出拳#region出拳
boolvEastCatch=false;
vEastTick=Environment.TickCount;//东家出拳的时间
try
...{
e(outvEastFinger,outvEastSum);
}
catch//出现异常
...{
vEastCatch=true;
}
vEastTick=Environment.TickCount-vEastTick;
boolvWestCatch=false;
vWestTick=Environment.TickCount;//西家出拳的时间
try
...{
e(outvWestFinger,outvWestSum);
}
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)
...{
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;
elseif(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;
}
elseif(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输出结果
}
}
publicclasszhangenter:Drunkard
...{
privateRandomrandom;
int[]betterFinger=newint[]...{0,0,5,5};
int[]betterSum=newint[]...{0,5,5,10};
intlastIndex=0;
publiczhangenter()
...{
random=newRandom();
}
publicoverridevoidCome(outintAFinger,outintASum)
...{
AFinger=betterFinger[lastIndex];
ASum=betterSum[lastIndex];
}
publicoverridevoidOutcome(intAOtherFinger,intAOtherSum,ResultAOtherResult,
intASelfFinger,intASelfSum,ResultASelfResult)
...{
if(ASelfResult!=Result.Win)
...{
intnewIndex;
while((newIndex=random.Next(4))!=lastIndex)
lastIndex=newIndex;
}
}
}
classProgram
...{
staticvoidMain(string[]args)
...{
newDrunkery<Zswang二号,zhangenter>().Play();
}
}
}