参加请到: http://topic.csdn.net/u/20080421/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
...{
eastPlayer.Come(outvEastFinger,outvEastSum);
}
catch//出现异常
...{
vEastCatch=true;
}
vEastTick=Environment.TickCount-vEastTick;

boolvWestCatch=false;
vWestTick=Environment.TickCount;//西家出拳的时间
try
...{
westPlayer.Come(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();
}
}
}

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

  1. 整数分节输出 【问题描述】编写一个程序,将某个位数不确定的正整数进行三位分节后输出。

    整数分节输出 [问题描述]编写一个程序,将某个位数不确定的正整数进行三位分节后输出. [输入形式]用户在第一行输入一个正整数. [输出形式]程序将这个正整数三位分节,并在下一行输出 [样例输入]123 ...

  2. 编写一个程序,将某个位数不确定的正整数进行三位分节后输出(Python)

    编写一个程序,将某个位数不确定的正整数进行三位分节后输出(Python) 输入形式:用户在第一行输入一个正整数 输出形式:程序将这个正整数三位分节,并在下一行输出 样例输入:1234567 样例输出: ...

  3. 小飞机游戏C语言程序划拳

    #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <time.h> ...

  4. Java基础编程题目——编写一个三角形的类

    编写一个代表三角形的类.其中3条边为三角形的属性,并封装有求三角形的面积和周长的方法.分别针对3条边为3.4.5和7.8.9的两个三角形进行测试. public class Triangle {pub ...

  5. 【指针编程】 编写一个函数,利用指针在字符串s中的指定位置pos处(这里插入的位置是从1开始,不是下标。)插入字符串。插入的位置和内容是从键盘输入

    [问题描述] 编写一个函数,利用指针在字符串s中的指定位置pos处(这里插入的位置是从1开始,不是下标)插入字符串.插入的位置和内容是从键盘输入 要求:子函数 void InsertStr(char ...

  6. 第7章 事件驱动编程:编写一个视频游戏

    1.操作系统面临的问题 内核将程序载入内存空间并维护每个程序在内存中所处的位置(空间管理).在内核的调度下,程序以时间片间隔的方式运行,同时内核也在特定的时刻运行特定的内部任务(时间管理,计时器).内 ...

  7. Java基础编程题目——编写一个简单的银行账户类

    创建简单的银行账户类,包括开户人.账号和存款余额三个属性,以及查询余额.存款.取款等方法.创建两个账户验证类的设计. public class Banks {public static void ma ...

  8. simbot框架编写一个你自己的QQ机器人【入门教学】

    前言 相信各位都有过没能及时回复女朋友的消息,而导致睡沙发的经历吧? 那么,只要我们有了能够自动回复的QQ机器人就不再怕了! 一.simbot框架 simbot是一个封装了多个聊天软件的API的框架, ...

  9. 查找子串在母串中的位置、编写一个函数实现字符串拼接【数据结构实验报告算法详解】

    文章目录 一.查找子串在母串中的位置 二.一个实现字符串拼接的函数 一.查找子串在母串中的位置 #include<iostream> using namespace std;int Sea ...

最新文章

  1. 无人驾驶汽车开发平台,加速无人驾驶汽车的商业化
  2. 人脸识别技术在支付场景的机遇与挑战
  3. C# 高性能 TCP 服务的多种实现方式
  4. Exchange 2007 内存使用问题
  5. Lua Behavior Tree For Unity3D(Lua描述行为树For Unity3D)
  6. 单片机程序配置成开漏输出_单片机I/O开漏输出详解
  7. Mysql事务隔离级别及MVCC(多版本并发控制)
  8. php jquery ajax裁剪图照片,php+jquery+ajax无刷新图片上传裁切,模拟flash头像上传实例...
  9. cmd 删除文件夹_永远不要碰的5个macOS文件夹及原因
  10. 【转】有的共享软件赚了一百万美元,而为什么你没有?我的软件推广成功之路...
  11. GOF之行为型模式Ⅰ(重点)
  12. 想学PHP来兄弟连是正确的选择 初识兄弟连三周
  13. mysql数据库攻击与防御_专题:SQL注入攻击与防御_51CTO.COM
  14. 斐波那契数列各种方法求解
  15. 雷军:《我十年的程序员生涯》系列之一:我的程序人生路
  16. 2018年中国大数据BI行业分析报告!
  17. 深度学习在图像分类中的发展
  18. 华为OD机试题:英文输入法单词联想
  19. 模拟山羊收获日Android,模拟山羊收获日手机版
  20. c语言 重新输入,C语言函数重新输入

热门文章

  1. ear包目录_EAR包的组成结构
  2. 6.副词性从句的起源与本质
  3. 物联网卡管理平台有几种类型
  4. python中iloc、loc的使用
  5. 思科通配符(Cisco Wildcard Mask)
  6. 年均增长90%的智慧灯杆市场风口正盛,企业该如何迎风而上?
  7. 【计算机网络】课程总结
  8. Access 2003高手攻略(奋斗的小鸟)_PDF 电子书
  9. ACL 概述及工作原理
  10. mac docker oracle11g,MacOS下使用Docker安装Oracle 11g