精华内容
下载资源
问答
  • 井字游戏

    千次阅读 2017-12-27 17:02:52
    井字游戏结果判断 Xs and Os Referee这个题目难度不难,解题逻辑也很清晰,主要是其他人的解题时用到的知识点要么我不熟悉要么不知道,所以记下这篇笔记。题目描述井字游戏,是一个两人玩家(X和O)轮流标志着3×3的...

    井字游戏结果判断 Xs and Os Referee


    这个题目难度不难,解题逻辑也很清晰,主要是其他人的解题时用到的知识点要么我不熟悉要么不知道,所以记下这篇笔记。

    题目描述

    井字游戏,是一个两人玩家(X和O)轮流标志着3×3的网格的空间的连珠游戏。最先在任意一条直线(水平线,垂直线或对角线)上成功连接三个标记的一方获胜。

    但我们不去玩这个游戏。你将是这个游戏的裁判。你被赋予游戏的结果,以及你必须判断游戏是平局还是有人胜出,以及谁将会成为最后的赢家。如果X玩家获胜,返回“X”。如果O玩家获胜,返回“O”。如果比赛是平局,返回“D”。

    如下图所示,游戏的结果是作为字符串形式的列表,其中“X”和“O”是玩家的标志,“.”是空格。
    这里写图片描述

    解题思路以及我的解题

    解题思路:对三行三列两个对角线8种可能进行判断是否等于”XXX”或者”OOO”,我的解题是将八种可能的单个字符进行比较,代码贴出

    def checkio(game_result):
        #行判断
        for row in game_result:
            if row[0] == row[1] == row[2] != ".":
                return row[0]
        #列判断
        for col in range(3):
            if game_result[0][col] == game_result[1][col] == game_result[2][col] != ".":
                return game_result[0][col]            
        #对角线判断
        if game_result[0][0] == game_result[1][1] == game_result[2][2] != ".":
            return game_result[1][1]
        if game_result[2][0] == game_result[1][1] == game_result[0][2] != ".":
            return game_result[1][1]
        return "D"

    其他人解题方法

    这些解题思路也是针对行列对角线,但实现方法不一样,有些函数在网络教程中没看到过,贴出代码

    • 有趣的想法
    def checkio(board):
        # First we put everything together into a single string
        x = "".join(board)   
        # Next we outline the 8 possible winning combinations. 
        combos = ["012", "345", "678", "036", "147", "258", "048", "246"]   
        # We go through all the winning combos 1 by 1 to see if there are any all Xs or all Os in the combos
        for i in combos:
            if x[int(i[0])] == x[int(i[1])] == x[int(i[2])] and x[int(i[0])] in "XO":
                return x[int(i[0])]
        return "D" 
    • 用zip()和map()函数拼接列和对角线字符串
    def checkio(result):
        rows = result
        cols = map(''.join, zip(*rows))
        diags = map(''.join, zip(*[(r[i], r[2 - i]) for i, r in enumerate(rows)]))
        lines = rows + list(cols) + list(diags)
        return 'X' if ('XXX' in lines) else 'O' if ('OOO' in lines) else 'D'
    • 用切片的方式得到列和对角线的字符串
    def checkio(game_result):
        sample = "".join(game_result)
        data=game_result + [sample[i:9:3] for i in range(3)] + [sample[0:9:4], sample[2:8:2]]
        if "OOO" in data:
            return "O"
        elif "XXX" in data:
            return "X"
        else:
            return "D"
    • 用正则表达式,还处在学习基础知识阶段,所以关于正则表达式不想深入,只是贴出代码
    import re
    def checkio(game_result):
        # join the array to one long string
        # row - search for 3 equal game characters next to each other: r"([OX])\1{2}"
        # column - search for 3 equal game characters separated by any 3 characters: r"([OX]).{3}\1.{3}\1"
        # diagonals - like a column, different offsets: r"([OX]).{4}\1.{4}\1" and r"([OX]).{2}\1.{2}\1" 
        res=re.search(r"([OX])(\1{2}|.{3}\1.{3}\1|.{4}\1.{4}\1|.{2}\1.{2}\1)","-".join(game_result))
        if res!=None: return res.group(0)[0]
        return "D"

    总结

    上面这些方法看下来,除了正则表达式,切片的方式让我又去重新学习了一遍切片和列表生成式,希望下次遇到问题能想起切片方法去解决问题,重新学习了map(),还学到了两个新函数zip()和enumerate().

    反思和深入

    我现在还不知道几个方法哪种方法实现效率最高,但如果是多行多列的话,我的实现方法很不合理,要写很多等于判断。如果再深入点,五子棋游戏,不仅仅是两个对角线,大于等于5个的斜线都得判断。

    试着去写个最简单的五子棋游戏,暂时的思路是:棋盘类,类比成如此题的List,判断结果用这题学到的结果判断。棋子类,分白棋黑棋,放置棋子改变棋盘类List里值。用教程中只提了一下的Tkinter包做GUI,边做边学,虽然不知道多长时间能完成,且不知道效率高低,但应该还蛮有趣的,值得尝试。

    如果完成在此贴出源码的GitHub地址:简单五子棋源码
    完成过程中如果有值得总结的事情再做一个总结:简单五子棋实现

    展开全文
  • 井字游戏 井字游戏
  • 井字游戏 井字游戏项目
  • Java井字游戏:Java井字游戏
  • 井字游戏CLI:井字游戏CLI
  • 井字游戏:使用minimax实现井字游戏
  • 井字游戏-易语言

    2021-06-13 16:08:13
    井字游戏
  • 井字游戏 简单的tictactoe游戏
  • 井字游戏颜色拼图 “井字游戏颜色拼图”游戏
  • 井字游戏 一个简单的井字游戏
  • 井字游戏 井字游戏:用钩子做出React的游戏。 现场演示
  • 井字游戏:一个简单的Java井字游戏
  • 井字游戏-源码

    2021-03-04 01:25:02
    井字游戏

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,855
精华内容 3,542
关键字:

井字游戏