Python 当条件通过时,程序不会停止

Python 当条件通过时,程序不会停止,python,if-statement,while-loop,sum,triplet,Python,If Statement,While Loop,Sum,Triplet,我正在写一个总结游戏,两个玩家轮流选择范围(1,9)内的一个随机数,不允许重复。如果第一个玩家选择[7,2,3,5],他将获胜,因为7+3+5=15 所以我的问题是,为什么当第一个_播放器的输入总和=15时,程序不停止 下面是自述文件您的脚本太冗长了。如果您使用可重用的逻辑使它更具动态性,那么使用起来就会容易得多。我重写了你的游戏作为例子 注意事项: 所有游戏状态都在fstrings中重复使用,作为dict键,甚至代表玩家 游戏循环(update())表示一个回合,该回合对应的玩家将在循环结束

我正在写一个总结游戏,两个玩家轮流选择范围(1,9)内的一个随机数,不允许重复。如果第一个玩家选择[7,2,3,5],他将获胜,因为7+3+5=15

所以我的问题是,为什么当第一个_播放器的输入总和=15时,程序不停止
下面是自述文件

您的脚本太冗长了。如果您使用可重用的逻辑使它更具动态性,那么使用起来就会容易得多。我重写了你的游戏作为例子

注意事项:

  • 所有游戏状态都在
    fstrings
    中重复使用,作为
    dict
    键,甚至代表玩家
  • 游戏循环(
    update()
    )表示一个回合,该回合对应的玩家将在循环结束时切换
  • make_move
    也表示一个回合
  • 整个游戏包含在类中
  • reset()
    用于清除窗口、重置所有游戏属性并启动循环,但在第一次调用时,它充当所有游戏属性的初始值设定项
  • 永远不会出现两名球员都得15分的情况


当第一个玩家的输入等于15时,游戏不会停止,因为无论第一个玩家是否获胜,你都会要求第二个玩家的输入。您可以在测试代码中看到这一点,对于每个玩家的输入,您有两个
while
语句。如果你用第二个玩家的输入完成了这一轮,你的程序就会运行并停止。若要在某个玩家在输入中获胜时停止,只需在请求下一个玩家的输入之前添加条件检查以中断主循环。

听起来您可能需要学习如何使用调试器逐步完成代码。有了一个好的调试器,您可以逐行执行您的程序,并查看它偏离预期的地方。这是一个必要的工具,如果你要做任何编程。进一步阅读:如果您不知道如何使用调试器,请使用
print()
查看变量中的值以及执行代码的哪一部分-这称为“打印调试”
import os

UNFINISHED  = "unfinished"
DRAW        = "draw"
FIRST_WON   = "First"
SECOND_WON  = "Second"

CLEAR       = lambda: os.system('cls') #windows only

class AddThreeGame:
    @property
    def current_state(self):
        return self.__state
        
    @property
    def player(self):
        return self.__rotation[self.__player]

    def __init__(self):
        self.__rotation = [FIRST_WON, SECOND_WON]
        self.__states = {
            UNFINISHED:'We have unfinished business, come back for more\n',
            DRAW:'Draw game\n',
            FIRST_WON:'First player won this game!!!\n',
            SECOND_WON:'Second player won this game!!!\n',
        }
        
        self.reset()
    
    def make_move(self, player, number):
        if number not in range(1, 10) or number in self.__input:
            return False
            
        self.__input.append(number)
        self.__players[self.player].append(number)
        
        if len(self.__players[self.player]) >= 3:
            L = self.__players[self.player]
            for i in range(0, len(L)-2):
                for j in range(i+1, len(L)-1):
                    for k in range(j+1, len(L)):
                        if (L[i] + L[j] + L[k]) == 15:
                            self.__state = player
                            return True
    
        if len(self.__input) == 9:
            self.__state = DRAW
    
        return True
        
    def update(self):
        while True:
            num = int(input(f'{self.player} player please enter a number from 1 to 9: '))
            while True:
                if self.make_move(self.player, num):
                    break
                else:
                    num = int(input("Wrong input, please try a different number: "))
                    
            if self.current_state == UNFINISHED:
                if self.__player == 1: #technically, this is player 2
                    print(self.__states[self.current_state])
                #next player
                self.__player = (self.__player + 1) % 2
            else:
                print(self.__states[self.current_state])
                break

        
        if input('Play Again? (y or n): ') == 'y':        
            self.reset()
        
    def reset(self):
        CLEAR()
        self.__player = 0
        self.__input  = []
        self.__state  = UNFINISHED
        
        self.__players = {
            FIRST_WON:[],
            SECOND_WON:[],
        }
        self.update()

  
if __name__ == '__main__':      
    AddThreeGame()