回复 第18楼 的 pklin:精华了...棋盘很精致。
找人下五子棋
回复 第18楼 的 pklin:狠
Nice.
联机应该可以通过make.socket/read.socket/write.socket/close.socket实现。
另外,我建议考虑更加公平的6子棋,而不是五子棋,因为后者对于先行者拥有很大优势,即便加上禁手也是如此。
六子棋为台湾某教授发明,规则是先行者先下一子,然后双方交替掷子,但每次下两子,先连六者为胜。这样行棋的公平性在于,任何一方走棋后,棋盘上都会比对方多一个棋子,从而避免了五子棋中先行者的棋子永远不少于后行者的不公平情形。
人类已经无法阻止 R 来下五子棋了~~可以联机了。
目前还可能有bug ,期待高手来修正。
<br />
par(bg=rgb(.88,.75,.60))<br />
plot(1:19,type="n",xlim=c(0,19),axes=F,xlab='',ylab='',bty="o",lab=c(19,19,1))</p>
<p>rect(1,1,2:19,2:19)<br />
rect(1:18,1:18,19,19)<br />
points(rep(c(4,10,16),3),rep(c(4,10,16),each=3),pch=19,cex=1)<br />
points(0,10,pch=19,cex=1.6) ##点击这个点,对弈结束<br />
text(0.1,11,"END") </p>
<p>vs=function(Host="localhost",Port=79,Server=T)<br />
{<br />
socket=make.socket(host=Host,port=Port,server=Server)<br />
on.exit(close.socket(socket))<br />
me=ifelse(Server,"white","black")<br />
you=ifelse(Server,"black","white")</p>
<p>playedlist <- NULL<br />
if(Server==F)<br />
{<br />
ss <- read.socket(socket)<br />
if(!length(ss))<br />
{<br />
close.socket(socket)<br />
print("Program has been ended by your partner")<br />
return("END")<br />
}<br />
output <- as.numeric(strsplit(ss,',')[[1]])<br />
points(output[1],output[2],cex=3,pch=21,bg=you)<br />
playedlist <- c(playedlist,paste(output,collapse=','))<br />
}</p>
<p>for(i in 1:190)<br />
{<br />
repeat{<br />
input=locator(1)<br />
input$x=round(input$x)<br />
input$y=round(input$y)<br />
if(input$x==0&input$y==10)<br />
{<br />
close.socket(socket)<br />
print("Program has been ended by you")<br />
return("END")<br />
}<br />
xy <- paste(input,collapse=",")<br />
if (!is.element(xy,playedlist)&input$x<19.5&input$x>.5&input$y<19.5&input$y>.5)<br />
break<br />
else<br />
print("Please point at the right place!")<br />
}<br />
playedlist <- c(playedlist,xy)</p>
<p>points(input$x,input$y,cex=3,pch=21,bg=me)</p>
<p>Sys.sleep(.5) #没有弄清原因,如果不暂停一会,上面一句就会等到下一句执行完才执行</p>
<p>write.socket(socket,xy)</p>
<p>ss <- read.socket(socket)<br />
if(ss=="")<br />
{<br />
close.socket(socket)<br />
print("Program has been ended by your partner")<br />
return("END")<br />
}</p>
<p>output <- as.numeric(strsplit(ss,',')[[1]])</p>
<p>points(output[1],output[2],cex=3,pch=21,bg=you)</p>
<p>playedlist <- c(playedlist,paste(output,collapse=','))<br />
}<br />
close.socket(socket)<br />
return("END")<br />
}</p>
<p>vs() #主机使用这个函数,建立一个服务器<br />
#vs(Host="111.11.11.11",Server=F)# 客户端使用这个函数,填上对方主机的Ip。</p>
<p>
</p>回复 第22楼 的 lanfeng:牛!报错:
<br />
>vs()<br />
Error in make.socket(host = Host, port = Port, server = Server) :<br />
socket not established<br />
怎么会事儿?Host要用自己的ip代替么?
</p>
回复 第23楼 的 ming_uld:如果要是在自己电脑上开两个 R 玩的话,就在两个R内分别运行前面的基本程序,然后在主机端运行
<br />
vs()<br />
客户端运行
<br />
vs(Server=F)<br />
</p>回复 第24楼 的 lanfeng:赶快加个规则上去吧。现在都不自动判断结束和规范禁手。之后就完美了啊
回复 第22楼 的 lanfeng:
所以说Geek都是因为太寂寞……
1 个月 后
太强大了。。。。。。。。。
已经加在fun包中了,不过用了个学名Gomoku:
http://cran.r-project.org/package=fun
2 年 后
膜拜前辈,才发现R有这么强大的功能!!!