首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >最短Gomoku (连续5次)实现

最短Gomoku (连续5次)实现
EN

Code Golf用户
提问于 2019-06-08 05:17:55
回答 1查看 605关注 0票数 3

我怀疑Gomoku可能是用代码实现的最简单的游戏之一。https://en.wikipedia.org/wiki/Gomoku游戏是这样的:玩家黑色和白色轮流放下黑白石头。黑人传统上是第一位的。如果,当一个玩家放下他们的石头,他们现在有5排他们的颜色,他们赢了。就这样。

实现这一点的一个简单方法是只保留两个(x,y)整数坐标列表,一个用于黑石,另一个用于白石。玩家只需指定一个整数x,y坐标,任何x,y坐标!游戏检查是否已经有任何颜色的石头,如果没有x,y被添加到列表中,然后游戏检查石头是否使他们连续5。

注意,我没有提到董事会的大小,也没有检查移动是否在董事会上。我的想法是,指定板的大小和决定在边缘做什么实际上使事情更复杂!Gomoku可以在无限大的棋盘上玩,而游戏实际上仍然有效!

不管怎么说,我认为规范是,在一个大小介于15x15和无穷大的板上实现Gomoku (我实际上怀疑inifinite可能更简单)。通过交替打印"b>“、"w>”,让用户知道该播放的是谁。如果输入了无效的条目,比如在已经有一块石头的地方播放,请继续询问播放无效移动的用户,直到他们进行有效的移动。为了保持额外的短,其实不需要打印董事会的状态!但是,如果在用户的回合,他们已经完成了5行正交或对角线,打印,或抛出一个错误,这可以简单地说"w“或"b",说谁赢了。执行指定代码的最短代码将获胜。

如果你想打印董事会的状态,或者让事情看起来更好,或者做一个人工智能什么的,你没有必要这样做,但是如果你喜欢的话,你可以添加或者单独添加到你的投稿中。

我用Python写了一个非金色但仍然很短的实现,以前我用的是简单的纸板打印和其他东西。这里是:https://github.com/jeffkaufman/game-complexity/blob/master/gomoku.py

这是我整个尝试的黄金版本与基本的IO和移动检查,但没有板打印。我很确定这根本不是最理想的,我不经常打高尔夫球。我主要做的就是让变量--一个字符/删除空格--等等,你们可以*轻松*做得更好,我知道。

代码语言:javascript
复制
w,b=[],[]
def o((x,y),s,(v,u)):
 if (x,y) in s:return o((x+v,y+u),s,(v,u))
 if v:return x
 return y
d=((0,1),(1,0),(1,1),(-1,1))
def W(m,s):
 for (x,y) in d:
  if o(m,s,(x,y))-o(m,s,(-x,-y))>5:return 1
 return 0
def t(c,p):
 while 1:
  C=raw_input(c+'>')
  try:
   x,y=C.split()
   m=(int(x),int(y))
  except ValueError:continue
  if m in b+w:continue
  p.append(m)
  if W(m,p):raise Exception(c)
  break
while 1:t("b",b),t("w",w)

然后运行一个示例,在最后抛出一个Python错误,说明谁赢了:

代码语言:javascript
复制
b>0 0
w>-4 5
b>0 1
w>0 1
w>7 12
b>0 2
w>7 12
w>4 5
b>0 -1
w>4 4
b>0 3

Traceback (most recent call last):
  File "C:/Users/udqbp/OneDrive/Desktop/test.py", line 22, in 
    while 1:t("b",b),t("w",w)
  File "C:/Users/udqbp/OneDrive/Desktop/test.py", line 20, in t
    if W(m,p):raise Exception(c)
Exception: b
EN

回答 1

Code Golf用户

发布于 2019-06-08 11:30:46

果冻,54字节

代码语言:javascript
复制
Ḋ,Z,ŒD$ŒrFs2ḢƇ<5Ȧ
0x⁹s⁴-;N1¦Ṅ©+Ɠœị®Ḋ¤$¿ṪṬṭ0x$Ʋ¹NƭƊƊ$Ç¿

在网上试试!

在stdin上读取输入的完整程序。对于每个循环,它打印当前播放器(1或-1)和16x16网格。在stdin上,移动是作为Python数组(例如[3,2])输入的,有或没有周围的方括号。唯一的验证是确保相关单元格为空。当连续有5个(或更多)时,程序结束并打印出赢家和最终网格。

如果可以省略有效移动的检查,则可以保存10个字节:

果冻,44字节

代码语言:javascript
复制
Ḋ,Z,ŒD$ŒrFs2ḢƇ<5Ȧ
0x⁹s⁴-;N1¦Ṅ+ƓṪṬṭ0x$¹Nƭ¤ƲÇ¿

在网上试试!

相反,如果规范中的w/b指定是严格的,则花费15字节:

果冻,69字节

代码语言:javascript
复制
ị“wb ”Ḣ
Ḋ,Z,ŒD$ŒrFs2ḢƇ<5Ȧ
0x⁹s⁴-;N1¦Ñ;”>ṄṛƲ©+Ɠœị®Ḋ¤$¿ṪṬṭ0x$Ʋ¹NƭƊƊ$Ç¿Ñ

在网上试试!

票数 0
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/186527

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档