2017-12-03 102 views
1

我创建一个管理井字棋游戏,我创建列表简单的帮助

[['', '', ''], 
['', '', ''], 
['', '', '']] 

列表创建游戏网的节目,我想程序停止,当它发现像

[['x', 'x', 'x'], 
['', '', ''], 
[ '', '', ''] 

在这种情况下,例如一场比赛,我会因此需要能够说,在其他框中有可能是任何字符,“O”,' x',''

我会那python如果网格是一个获胜的网格程序必须停止

+0

我不知道怎么跟蟒蛇,在另一种情况可能是任何符号,游戏必须停止 – MISTERCEC

回答

1

你会做什么来检查“手动”?

  1. 检查第一行,如果这三个位置的球员

    if b[0][0]==code and b[0][1]==code and b[0][2]==code: return True

  2. 检查第二行

  3. 检查第三排
  4. 检查第一列的代码,如果所有三个是玩家的代码

    if b[0][0]==code and b[1][0]==code and b[2][0]==code: return True

  5. 检查第二和第三列太

  6. 检查第一和第二倾斜太

的行列数很容易写一个循环,而不是复制粘贴代码

还有其他方法可以编写较短的代码(使用诸如all(b[i][j] == code for j in range(3))之类的东西)或更快的代码(使用诸如比特而不是字符和单个整数的所有东西x s或o S)。

另一个“技巧”是将电路板保持在一个单一的阵列而不是一个矩阵,并使用占位符(例如,“ - ”)为空方块

board = ['-', '-', '-', 
     '-', '-', '-', 
     '-', '-', '-'] 

,那么你可以检查使用正则表达式

s = "".join(board) # change to a single string 
if re.match("xxx......", s) return True # first row check 
if re.match("...xxx...", s) return True # second row check 
if re.match("......xxx", s) return True # third row check 
if re.match("x..x..x..", s) return True # first col check 
if re.match(".x..x..x.", s) return True # second col check 
if re.match("..x..x..x", s) return True # third col check 

我会用做位获奖罢工:董事会是由两个数字来表示0 .. 0.511:用于x马克是其中一个号码,另一个用于o马克是其中:

# board bits are 
# 
#  1  2  4 
#  8  16  32 
# 64 128 256 
# 
Xs = Os = 0 # empty board 

win_codes = [1+2+4, 8+16+32, 64+128+256, # rows 
      1+8+64, 2+16+128, 4+32+256, # cols 
      1+16+256, 4+16+64]   # diags 

def wins(pos): 
    return any((pos & c) == c for c in win_codes) 

鉴于位置的总数目也SM所有(512)获胜者还可以预先计算和存储在表

win_pos = [wins(pos) for pos in range(512)] 

然后检查仅仅是

if win_pos[Xs]: ... # player X won the game 
+0

isn'不可能做一个包含所有可能获胜格子的列表,所以一个原始格子中所有位置的格子都是相等的,另一个格子可能是一切,也许用re.match模块我可以这样说? – MISTERCEC

+0

@MISTERCEC:我已经添加了一个基于正则表达式的方法 – 6502

+0

哦完美,所以我可以直接在一个列表中转换列表的列表? – MISTERCEC

0

如果我正确地解释了你想说的话,你不需要。 Python不是静态类型 - 也就是说,任何变量都可以包含任何类型。在静态类型语言中,您需要声明(或者为您推断)您的游戏网格类型为list of list of char或同等类型。因此,您可以将元素设置在任何位置,以满足您的需求 - 包括像'o'和'x'这样的字符。

TL; DR你不需要。

注意:在程序中间无意间更改变量的类型通常被认为是不好的风格,因为这会混淆你和其他人。

+0

不,我必须改变标题你说得对,我希望当程序到达像这样的位置时:[['x','x','x'], [ '','o',''], ['o','',o'']。它停止,因为一个球员赢了,所以当在列表中我有这个。 ['x','x','x'],不管角色在其他列表中出现,游戏必须停止 – MISTERCEC

+0

@MISTERCEC,这似乎与您在问题中写下的内容不同。你的标题'如何判断任何字符是否正确'意味着你想要一种方法向翻译人员显示你的锯齿状列表可以包含任何字符,而这正如我在我的回答中所说的,没有必要 – Restioson