RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1541000
Accepted
Анзор Халимов
Анзор Халимов
Asked:2023-09-16 22:21:31 +0000 UTC2023-09-16 22:21:31 +0000 UTC 2023-09-16 22:21:31 +0000 UTC

检查多个条件

  • 772

有一段代码,其中有很多条件,每个条件都可能导致错误(超出数组范围)。如果发生错误时(例如,在其中第二个),如何检查所有条件,检查其余的停止?

def LoseCheck(x,y,_matrix,k): #проверка, является ли ход проигрышным
    try:  
        if (
            _matrix[x-2][y] == _matrix[x-1][y] == _matrix[x][y] == 1 
            or _matrix[x][y] == _matrix[x+1][y] == _matrix[x+2][y] == 1 
            or _matrix[x-1][y] == _matrix[x][y] == _matrix[x+1][y] == 1 
            or _matrix[x][y-2] == _matrix[x][y-1] == _matrix[x][y] == 1 
            or _matrix[x][y] == _matrix[x][y+1] == _matrix[x][y+2] == 1
            or _matrix[x][y-1] == _matrix[x][y] == _matrix[x][y+1] == 1 
            or _matrix[x-2][y+2] == _matrix[x-1][y+1] == _matrix[x][y] == 1 
            or _matrix[x][y] == _matrix[x+1][y-1] == _matrix[x+2][y-2] == 1 
            or _matrix[x-1][y+1] == _matrix[x][y] == _matrix[x+1][y-1] == 1 
            or _matrix[x-2][y-2] == _matrix[x-1][y-1] == _matrix[x][y] == 1 
            or _matrix[x][y] == _matrix[x+1][y+1] == _matrix[x+2][y+2] == 1 
            or _matrix[x-1][y-1] == _matrix[x][y] == _matrix[x+1][y+1] == 1
        ):
            if k%2 == 0:
                print("Второй игрок проиграл!")
                return 1
            else:
                print("Первый игрок проиграл!")
                return 1
        return 0  
    except:
        pass      
python
  • 2 2 个回答
  • 58 Views

2 个回答

  • Voted
  1. FruitGames537
    2023-09-16T23:43:59Z2023-09-16T23:43:59Z

    避免索引超出数组限制的错误。您可以对值进行标准化,然后使用该条件。

    这是一个例子:

    from math import ceil
    
    def normalize(x, y):
      normalized_x = max(min((ceil((x + 1) / 3) * 3) - 1, 7), 2)
      normalized_y = max(min((ceil((y + 1) / 3) * 3) - 1, 7), 2)
    
      return normalized_x, normalized_y
    

    使用示例:

    def check_lose(x, y, matrix, k):
      x, y = normalize(x, y)
      # ваши поверки
    

    此代码无需使用try-except(但如果您这样做,try-except请不要留下空块except)

    所以数字的范围是从2到7。如果您进行加/减,这些数字不会超出数组的边界2。

    好吧,如果您不想让函数变得混乱,您可以将条件放入单独的函数中。

    例如这样:

    def condition(x, y, matrix):
      if ...:
        return True
      elif ...:
        return True
      ...
      return False
    

    这是最终的函数:

    def check_gameover(x, y, matrix, k):
      x, y = normalize(x, y)
      if condition(x, y, matrix):
        if k % 2 == 0:
          return True, 1
        else:
          return True, 2
      return False, None
    

    这个函数稍微修改一下,返回一个带有值的元组завершена ли игра,игрока который победил如果完成

    好吧,您可以修改条件代码,例如,还传输非标准化坐标,并且由于它们,要做更少的检查(好吧,您自己决定什么更方便)

    • 1
  2. Best Answer
    Vitalizzare
    2023-09-17T18:31:49Z2023-09-17T18:31:49Z

    游戏字段作为列表的列表

    在解决这个问题之前,你需要确定对象是什么_matrix。如果这是列表的列表,那么除了明显的错误之外,IndexError: list index out of range在寻址具有负索引的单元格时还会出现隐藏的算法错误。对于列表,允许负索引,但对于任务则不允许。

    在这种情况下,我们需要重新定义该类,list以便它可以在无效索引的情况下正常工作。例如:

    from collections import UserList
    
    class Line(UserList):
        def __getitem__(self, i):
            if isinstance(i, int) and (i < 0 or i >= len(self)):
                return Line()
            return super().__getitem__(i)
    

    为了能够使用嵌套列表,此处返回一个空列表Line()。因此,当任何索引超出该字段时,我们将得到一个Line() == 1可以正常工作的比较,并返回预期的结果False。

    _matrix我们像这样启动游戏环境:

    n = 10                      # размер квадратного игрового поля
    _matrix = Line()            # игровое поле
    
    for _ in range(n):
        _matrix.append(Line([0]*n))   # заполняем поле нулями
    

    现在LoseCheck我们可以按原样使用该函数,尽管try ... except应该删除框架(这没有意义)。

    比赛场地就像一本字典中的字典

    或者,我们可以使用字典。例如:

    from collections import defaultdict
    
    default_value = 0       # содержимое ячейки игрового поля по умолчанию
    _matrix = defaultdict(lambda: defaultdict(lambda: default_value))
    

    在这种情况下,不需要启动该字段;该字段在访问单元时被填充。当索引超出字段时,自动返回零。通过这个对象,我们可以使用没有维度的函数LoseCheck。

    LoseCheck 的替代方案

    为了避免覆盖对象_matrix,我们可以LoseCheck通过限制对字段的查询到有效索引来重写它:

    def LoseCheck(x, y, _matrix, k):
        n = len(_matrix)     # размер игрового поля
        s = 3                # количество последовательных ячеек для проверки
        xx = range(x-s+1, x+s)
        yy = range(y-s+1, y+s)
        is_index = lambda x, y: 0<=x<n and 0<=y<n
        lines = [
            [(x, y) for x in xx if is_index(x, y)],                        # ячейки по оси x
            [(x, y) for y in yy if is_index(x, y)],                        # ячейки по оси y 
            [(x, y) for x, y in zip(xx, yy) if is_index(x, y)],            # ячейки по диагонали
            [(x, y) for x, y in zip(xx, reversed(yy)) if is_index(x, y)],  # ячейки по обратной диагонали
        ]
        # проверяем s последовательных ячеек вдоль каждой линии
        # пока все они не будут равны 1
        if any( 
            all(_matrix[i][j] == 1 for i, j in s_tuple)
            for line in lines
            for s_tuple in (line[i:i+s] for i in range(len(line)-s+1))
        ):
            if k%2 == 0:
                print("Второй игрок проиграл!")
                return 1
            else:
                print("Первый игрок проиграл!")
                return 1
        return 0
    
    • 1

相关问题

  • 是否可以以某种方式自定义 QTabWidget?

  • telebot.anihelper.ApiException 错误

  • Python。检查一个数字是否是 3 的幂。输出 无

  • 解析多个响应

  • 交换两个数组的元素,以便它们的新内容也反转

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5