我怀疑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和移动检查,但没有板打印。我很确定这根本不是最理想的,我不经常打高尔夫球。我主要做的就是让变量--一个字符/删除空格--等等,你们可以*轻松*做得更好,我知道。
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错误,说明谁赢了:
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发布于 2019-06-08 11:30:46
Ḋ,Z,ŒD$ŒrFs2ḢƇ<5Ȧ
0x⁹s⁴-;N1¦Ṅ©+Ɠœị®Ḋ¤$¿ṪṬṭ0x$Ʋ¹NƭƊƊ$Ç¿在stdin上读取输入的完整程序。对于每个循环,它打印当前播放器(1或-1)和16x16网格。在stdin上,移动是作为Python数组(例如[3,2])输入的,有或没有周围的方括号。唯一的验证是确保相关单元格为空。当连续有5个(或更多)时,程序结束并打印出赢家和最终网格。
如果可以省略有效移动的检查,则可以保存10个字节:
Ḋ,Z,ŒD$ŒrFs2ḢƇ<5Ȧ
0x⁹s⁴-;N1¦Ṅ+ƓṪṬṭ0x$¹Nƭ¤ƲÇ¿相反,如果规范中的w/b指定是严格的,则花费15字节:
ị“wb ”Ḣ
Ḋ,Z,ŒD$ŒrFs2ḢƇ<5Ȧ
0x⁹s⁴-;N1¦Ñ;”>ṄṛƲ©+Ɠœị®Ḋ¤$¿ṪṬṭ0x$Ʋ¹NƭƊƊ$Ç¿Ñhttps://codegolf.stackexchange.com/questions/186527
复制相似问题