【编程游戏】编写一个会划拳的机器人参加擂台赛,规则内详。路过有分。(之js盗版) 本帖最后由 jinjazz 于 2008-04-30 18:31:57 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 <HTML> <BODY> <script language="javascript"> //计时器 function getTickCount() { var now = new Date(); var ticks = now.getTime(); return ticks; } //出拳参数 var UserInfo=function() { this.finger=-1; this.sum=-1; } //酒鬼类 var Drunkard=function() { this.Come=function(userInfo) { } this.OutCome=function(otherFinger,otherSum,otherResult,selfFinger,selfSum,selfResult) { } } //酒馆类 var Drunkery=function(eastDrunkard,westDrunkard) { //参数继承酒鬼类 eval(eastDrunkard+".prototype=new Drunkard()"); eval(westDrunkard+".prototype=new Drunkard()"); //中断标志 var bExit=false; //超时控制 var eastTime=0;var westTime=0; var eastTimeoutCount=0;var westTimeoutCount=0; var eastPlayer;var westPlayer; //初始化东家 try { eastTime=getTickCount(); eastPlayer=eval("new "+eastDrunkard+"();"); eastTime=getTickCount()-eastTime; } catch(e) { document.writeln(eastDrunkard+"初始化失败"); bExit=true; } //初始化西家 try { westTime=getTickCount(); westPlayer=eval("new "+westDrunkard+"();"); westTime=getTickCount()-westTime; } catch(e) { document.writeln(eastDrunkard+"初始化失败"); bExit=true; } if(bExit) { return; } //超时判断 if(eastTime>1000) { document.writeln(eastDrunkard+"初始化严重超时"); bExit=true; } if(westTime>1000) { document.writeln(westDrunkard+"初始化严重超时"); bExit=true; } if(bExit) { return; } //比赛参数 var eastInfo=new UserInfo(); var westInfo=new UserInfo(); //分数 var eastScore=0; var westScore=0; //开始1000局 for(var i=0;i<1000;i++) { //每局最多100次,直到分出胜负或有人严重超时 for(var j=0;j<100;j++) { var eastResult="Unknow";var westResult="Unknow"; //出拳,抛出异常算一次犯规 try { eastTime=getTickCount(); eastPlayer.Come(eastInfo); eastTime=getTickCount()-eastTime; } catch(e) { eastResult="Foul"; } try { westTime=getTickCount(); westPlayer.Come(westInfo); westTime=getTickCount()-westTime; } catch(e) { westResult="Foul"; } if(eastTime>1000) { document.writeln(eastDrunkard+"出拳严重超时"); bExit=true; } if(westTime>1000) { document.writeln(westDrunkard+"出拳严重超时"); bExit=true; } if(bExit) { return; } //超时判断 if(eastTime>100) { eastResult="Timeout"; eastTimeoutCount++; } if(westTime>100) { westResult="Timeout"; westTimeoutCount++; } //犯规判断 if(eastInfo.finger<0 || eastInfo.finger>5 || eastInfo.sum<eastInfo.finger || eastInfo.sum>eastInfo.finger+5) eastResult="Foul"; if(westInfo.finger<0 || westInfo.finger>5 || westInfo.sum<westInfo.finger || westInfo.sum>westInfo.finger+5) westResult="Foul"; //如果都没有犯规或超时则计算胜负 if(eastResult=="Unknow" && westResult=="Unknow") { if(eastInfo.finger+westInfo.finger==eastInfo.sum) eastResult="Win"; if(eastInfo.finger+westInfo.finger==westInfo.sum) westResult="Win"; } //结果相同算打平 if(eastResult==westResult) { eastResult="Dogfall"; westResult="Dogfall"; } else { if(eastResult=="Win") westResult="Lost"; if(westResult=="Win") eastResult="Lost"; if(eastResult=="Foul") westResult="Win"; if(westResult=="Foul") eastResult="Win"; if(eastResult=="Timeout") westResult="Win"; if(westResult=="Timeout") eastResult="Win"; } //犯规扣100分,对方加1分 if(eastResult=="Win")eastScore++; if(eastResult=="Foul")eastScore-=100; if(westResult=="Win")westScore++; if(westResult=="Foul")westScore-=100; //输出结果 try { eastTime=getTickCount(); eastPlayer.OutCome(westInfo.finger,westInfo.sum,westResult, eastInfo.finger,eastInfo.sum,eastResult); eastTime=getTickCount()-eastTime; } catch(e) { //抛出异常直接扣总分 eastScore-=100; } try { westTime=getTickCount(); westPlayer.OutCome(eastInfo.finger,eastInfo.sum,eastResult, westInfo.finger,westInfo.sum,westResult); westTime=getTickCount()-westTime; } catch(e) { //抛出异常直接扣总分 westScore-=100; } //超时判断 if(eastTime>1000) { document.writeln(eastDrunkard+"接收结果严重超时"); bExit=true; } if(westTime>1000) { document.writeln(westDrunkard+"接收结果严重超时"); bExit=true; } if(bExit) { return; } if(eastTime>100) { eastResult="Timeout"; eastTimeoutCount++; } if(westTime>100) { westResult="Timeout"; westTimeoutCount++; } if(eastTimeoutCount>=10) { document.writeln(eastDrunkard+"超时10次以上"); bExit=true; } if(westTimeoutCount>=10) { document.writeln(westDrunkard+"超时10次以上"); bExit=true; } if(bExit) { return; } //分出胜负 if(eastResult!=westResult) { break; } } } //输出结果 document.writeln(eastDrunkard+" 分数:"+eastScore.toString()+" , "+westDrunkard+" 分数:"+westScore.toString()); } //酒鬼1号 var jinjazz一号=function() { //出拳 this.Come=function(userInfo) { userInfo.finger=5; userInfo.sum=10; } } //酒鬼2号 var jinjazz二号=function() { //出拳 this.Come=function(userInfo) { userInfo.sum=Math.round(Math.random()*10); if(userInfo.sum<=5)//别犯规 { userInfo.finger=Math.round(Math.random()*(userInfo.sum)); } else { userInfo.finger=userInfo.sum-5+Math.round(Math.random()*(10-userInfo.sum)); } } //输出结果 this.OutCome=function(otherFinger,otherSum,otherResult,selfFinger,selfSum,selfResult) { //这机器人不关心比赛结果 } } new Drunkery("jinjazz一号","jinjazz二号"); </script> </BODY></HTML> 代码有点长..把1楼和2楼的拼起来就可以了刷新后输出类似结果jinjazz一号 分数:485 , jinjazz二号 分数:515 现在擂主是jinjazz二号,欢迎大家51休息时前来挑战 看来我要赶紧来个BCB版和Delphi版。 jinjazz二号的随机比较聪明,试图掩盖他出几的概率,只给出他喊几的概率,但是我们可以倒推其出几的概率:出几 喊0-5时出的概率 喊6-10时出的概率 总概率0 1.645 + 0 = 1.6451 1.78 + 0.125 = 1.9052 1.03 + 0.42 = 1.453 0.62 + 0.83 = 1.454 0.325 + 1.58 = 1.9055 0.1 + 1.67 = 1.77这里的概率不是百分比,只是一个相对的权值我一直相信真正的平均随机是最难以战胜的,尽管它不一定能大比分战胜任何人!只要概率不均匀,就有软肋,就可攻之!大家继续,我先试着构造一个... zswang 来反盗版了,:-)估计这贴火不了了.... 俺在sql版把原始擂主的随即算法写错了,结果惨败...伴水快把borland的板块都搞一下^&^ //无聊一号 var kivetja一号=function() { //出拳 this.Come=function(userInfo) { userInfo.finger=Math.round(Math.random()*5); userInfo.sum=Math.round(Math.random()*5)+userInfo.finger; } //这机器人不关心比赛结果 } //无聊二号 var kivetja一号=function() { //出拳 this.Come=function(userInfo) { userInfo.finger=Math.floor(Math.random()*6); userInfo.sum=Math.floor(Math.random()*6)+userInfo.finger; } //这机器人不关心比赛结果 } jquery 中如何用css设置background-image javascript控制background属性来改变LI背景图的问题 body.offsetHeight在IE中和FF得到的结果不同.怎么办? JS兼容性问题 日期格式的显示样式??? 如何让页面跳转后,再执行下面程序 extjs,大家帮我看一下,谢谢 问一个在JS中的字符处理问题(简单+送分) table中的数据能不能动态的修改? 聊天室问题之一 怎么改变滚动速度 小弟遇到了一个关于变换光标的难题,请大家帮忙看一下如下:
<BODY>
<script language="javascript">
//计时器
function getTickCount()
{
var now = new Date();
var ticks = now.getTime();
return ticks;
}
//出拳参数
var UserInfo=function()
{
this.finger=-1;
this.sum=-1;
}
//酒鬼类
var Drunkard=function()
{
this.Come=function(userInfo)
{
}
this.OutCome=function(otherFinger,otherSum,otherResult,selfFinger,selfSum,selfResult)
{
}
}
//酒馆类
var Drunkery=function(eastDrunkard,westDrunkard)
{
//参数继承酒鬼类
eval(eastDrunkard+".prototype=new Drunkard()");
eval(westDrunkard+".prototype=new Drunkard()");
//中断标志
var bExit=false;
//超时控制
var eastTime=0;var westTime=0;
var eastTimeoutCount=0;var westTimeoutCount=0;
var eastPlayer;var westPlayer;
//初始化东家
try
{
eastTime=getTickCount();
eastPlayer=eval("new "+eastDrunkard+"();");
eastTime=getTickCount()-eastTime;
}
catch(e)
{
document.writeln(eastDrunkard+"初始化失败");
bExit=true;
}
//初始化西家
try
{
westTime=getTickCount();
westPlayer=eval("new "+westDrunkard+"();");
westTime=getTickCount()-westTime;
}
catch(e)
{
document.writeln(eastDrunkard+"初始化失败");
bExit=true;
}
if(bExit)
{
return;
}
//超时判断
if(eastTime>1000)
{
document.writeln(eastDrunkard+"初始化严重超时");
bExit=true;
}
if(westTime>1000)
{
document.writeln(westDrunkard+"初始化严重超时");
bExit=true;
}
if(bExit)
{
return;
}
//比赛参数
var eastInfo=new UserInfo();
var westInfo=new UserInfo();
//分数
var eastScore=0;
var westScore=0;
//开始1000局
for(var i=0;i<1000;i++)
{
//每局最多100次,直到分出胜负或有人严重超时
for(var j=0;j<100;j++)
{
var eastResult="Unknow";var westResult="Unknow";
//出拳,抛出异常算一次犯规
try
{
eastTime=getTickCount();
eastPlayer.Come(eastInfo);
eastTime=getTickCount()-eastTime;
}
catch(e)
{
eastResult="Foul";
}
try
{
westTime=getTickCount();
westPlayer.Come(westInfo);
westTime=getTickCount()-westTime;
}
catch(e)
{
westResult="Foul";
}
if(eastTime>1000)
{
document.writeln(eastDrunkard+"出拳严重超时");
bExit=true;
}
if(westTime>1000)
{
document.writeln(westDrunkard+"出拳严重超时");
bExit=true;
}
if(bExit)
{
return;
}
//超时判断
if(eastTime>100)
{
eastResult="Timeout";
eastTimeoutCount++;
}
if(westTime>100)
{
westResult="Timeout";
westTimeoutCount++;
}
//犯规判断
if(eastInfo.finger<0 || eastInfo.finger>5 || eastInfo.sum<eastInfo.finger || eastInfo.sum>eastInfo.finger+5)
eastResult="Foul";
if(westInfo.finger<0 || westInfo.finger>5 || westInfo.sum<westInfo.finger || westInfo.sum>westInfo.finger+5)
westResult="Foul";
//如果都没有犯规或超时则计算胜负
if(eastResult=="Unknow" && westResult=="Unknow")
{
if(eastInfo.finger+westInfo.finger==eastInfo.sum)
eastResult="Win";
if(eastInfo.finger+westInfo.finger==westInfo.sum)
westResult="Win";
}
//结果相同算打平
if(eastResult==westResult)
{
eastResult="Dogfall";
westResult="Dogfall";
}
else
{
if(eastResult=="Win")
westResult="Lost";
if(westResult=="Win")
eastResult="Lost";
if(eastResult=="Foul")
westResult="Win";
if(westResult=="Foul")
eastResult="Win";
if(eastResult=="Timeout")
westResult="Win";
if(westResult=="Timeout")
eastResult="Win";
}
//犯规扣100分,对方加1分
if(eastResult=="Win")eastScore++;
if(eastResult=="Foul")eastScore-=100;
if(westResult=="Win")westScore++;
if(westResult=="Foul")westScore-=100;
try
{
eastTime=getTickCount();
eastPlayer.OutCome(westInfo.finger,westInfo.sum,westResult,
eastInfo.finger,eastInfo.sum,eastResult);
eastTime=getTickCount()-eastTime;
}
catch(e)
{
//抛出异常直接扣总分
eastScore-=100;
}
try
{
westTime=getTickCount();
westPlayer.OutCome(eastInfo.finger,eastInfo.sum,eastResult,
westInfo.finger,westInfo.sum,westResult);
westTime=getTickCount()-westTime;
}
catch(e)
{
//抛出异常直接扣总分
westScore-=100;
}
//超时判断
if(eastTime>1000)
{
document.writeln(eastDrunkard+"接收结果严重超时");
bExit=true;
}
if(westTime>1000)
{
document.writeln(westDrunkard+"接收结果严重超时");
bExit=true;
}
if(bExit)
{
return;
}
if(eastTime>100)
{
eastResult="Timeout";
eastTimeoutCount++;
}
if(westTime>100)
{
westResult="Timeout";
westTimeoutCount++;
}
if(eastTimeoutCount>=10)
{
document.writeln(eastDrunkard+"超时10次以上");
bExit=true;
}
if(westTimeoutCount>=10)
{
document.writeln(westDrunkard+"超时10次以上");
bExit=true;
}
if(bExit)
{
return;
}
//分出胜负
if(eastResult!=westResult)
{
break;
}
}
}
//输出结果
document.writeln(eastDrunkard+" 分数:"+eastScore.toString()+" , "+westDrunkard+" 分数:"+westScore.toString());
}
//酒鬼1号
var jinjazz一号=function()
{
//出拳
this.Come=function(userInfo)
{
userInfo.finger=5;
userInfo.sum=10;
}
}
//酒鬼2号
var jinjazz二号=function()
{
//出拳
this.Come=function(userInfo)
{
userInfo.sum=Math.round(Math.random()*10);
if(userInfo.sum<=5)//别犯规
{
userInfo.finger=Math.round(Math.random()*(userInfo.sum));
}
else
{
userInfo.finger=userInfo.sum-5+Math.round(Math.random()*(10-userInfo.sum));
}
}
//输出结果
this.OutCome=function(otherFinger,otherSum,otherResult,selfFinger,selfSum,selfResult)
{
//这机器人不关心比赛结果
}
}
new Drunkery("jinjazz一号","jinjazz二号");
</script>
</BODY>
</HTML>
刷新后输出类似结果jinjazz一号 分数:485 , jinjazz二号 分数:515
现在擂主是jinjazz二号,欢迎大家51休息时前来挑战
试图掩盖他出几的概率,
只给出他喊几的概率,
但是我们可以倒推其出几的概率:
出几 喊0-5时出的概率 喊6-10时出的概率 总概率
0 1.645 + 0 = 1.645
1 1.78 + 0.125 = 1.905
2 1.03 + 0.42 = 1.45
3 0.62 + 0.83 = 1.45
4 0.325 + 1.58 = 1.905
5 0.1 + 1.67 = 1.77
这里的概率不是百分比,只是一个相对的权值
我一直相信真正的平均随机是最难以战胜的,尽管它不一定能大比分战胜任何人!
只要概率不均匀,就有软肋,就可攻之!大家继续,我先试着构造一个...
估计这贴火不了了....
伴水快把borland的板块都搞一下^&^
var kivetja一号=function()
{
//出拳
this.Come=function(userInfo)
{
userInfo.finger=Math.round(Math.random()*5);
userInfo.sum=Math.round(Math.random()*5)+userInfo.finger;
}
//这机器人不关心比赛结果
}
var kivetja一号=function()
{
//出拳
this.Come=function(userInfo)
{
userInfo.finger=Math.floor(Math.random()*6);
userInfo.sum=Math.floor(Math.random()*6)+userInfo.finger;
}
//这机器人不关心比赛结果
}