【问题标题】:Tic-Tac-Toe problems?井字游戏问题?
【发布时间】:2017-04-28 03:50:03
【问题描述】:

因此,对于我上学的编程课程基础的最后一项作业,您应该使用我们在课堂上学到的工具来创建您选择的程序。其中一个想法是剪刀石头布,但我认为这太基础了,所以我尝试制作一个井字游戏。

我终于完成了,我知道我可以通过许多更好的方法对其进行编程,使其更简单、更少重复、更高效等。但​​我想看看它有两个主要问题是否可以解决。

我有一个问题,即玩家可以在棋盘上的相同空间上前进,即使该空间已被占用。我在想,如果我制作一个董事会列表,记录人们在董事会上的位置,然后检查他们试图反对的地方,我可以做第一部分,但我不知道我会如何检查它在哪里他们正试图离开。

我还有一个问题,一旦 win 为真,它仍然会运行程序的其余部分,直到它再次回到 while 命令的开头。我理解它为什么会这样做,但是有没有办法绕过它或让它在 while 为“真”时自动停止。

我尝试查看两个不同的 while 命令是否可行,但我认为它只会带来更多问题。谢谢您的帮助!

#Jacob Gilger
#4/20/17
#Drawing a house with elif

import turtle

def X1(t):
    t.penup()
    t.setposition(-95,10)
    t.pendown()
    t.left(45)
    t.forward(50)
    t.penup()
    t.setposition(-60,10)
    t.pendown()
    t.left(90)
    t.forward(50)
    t.right(135)    
def X2(t):
    t.penup()
    t.setposition(-45,10)
    t.pendown()
    t.left(45)
    t.forward(50)
    t.penup()
    t.setposition(-10,10)
    t.pendown()
    t.left(90)
    t.forward(50)
    t.right(135)
def X3(t):
    t.penup()
    t.setposition(5,10)
    t.pendown()
    t.left(45)
    t.forward(50)
    t.penup()
    t.setposition(40,10)
    t.pendown()
    t.left(90)
    t.forward(50)
    t.right(135)
def X4(t):
    t.penup()
    t.setposition(-95,60)
    t.pendown()
    t.left(45)
    t.forward(50)
    t.penup()
    t.setposition(-60,60)
    t.pendown()
    t.left(90)
    t.forward(50)
    t.right(135)    
def X5(t):
    t.penup()
    t.setposition(-45,60)
    t.pendown()
    t.left(45)
    t.forward(50)
    t.penup()
    t.setposition(-10,60)
    t.pendown()
    t.left(90)
    t.forward(50)
    t.right(135)
def X6(t):
    t.penup()
    t.setposition(5,60)
    t.pendown()
    t.left(45)
    t.forward(50)
    t.penup()
    t.setposition(40,60)
    t.pendown()
    t.left(90)
    t.forward(50)
    t.right(135)    
def X7(t):
    t.penup()
    t.setposition(-95,110)
    t.pendown()
    t.left(45)
    t.forward(50)
    t.penup()
    t.setposition(-60,110)
    t.pendown()
    t.left(90)
    t.forward(50)
    t.right(135)
def X8(t):
    t.penup()
    t.setposition(-45,110)
    t.pendown()
    t.left(45)
    t.forward(50)
    t.penup()
    t.setposition(-10,110)
    t.pendown()
    t.left(90)
    t.forward(50)
    t.right(135)    
def X9(t):
    t.penup()
    t.setposition(5,110)
    t.pendown()
    t.left(45)
    t.forward(50)
    t.penup()
    t.setposition(40,110)
    t.pendown()
    t.left(90)
    t.forward(50)
    t.right(135)

def O1(t):
    t.penup()
    t.setposition(-77.5,10)
    t.pendown()
    t.circle(17.5)
def O2(t):
    t.penup()
    t.setposition(-27.5,10)
    t.pendown()
    t.circle(17.5)
def O3(t):
    t.penup()
    t.setposition(22.5,10)
    t.pendown()
    t.circle(17.5)
def O4(t):
    t.penup()
    t.setposition(-77.5,60)
    t.pendown()
    t.circle(17.5)
def O5(t):
    t.penup()
    t.setposition(-27.5,60)
    t.pendown()
    t.circle(17.5)
def O6(t):
    t.penup()
    t.setposition(22.5,60)
    t.pendown()
    t.circle(17.5)
def O7(t):
    t.penup()
    t.setposition(-77.5,110)
    t.pendown()
    t.circle(17.5)
def O8(t):
    t.penup()
    t.setposition(-27.5,110)
    t.pendown()
    t.circle(17.5)
def O9(t):
    t.penup()
    t.setposition(22.5,110)
    t.pendown()
    t.circle(17.5)

def menu():
    print("-----------------------------")
    print("|       ~Tic-Tac-Toe~       |")
    print("|      1 ~ Bottom Left      |")
    print("|     2 ~ Bottom Center     |")
    print("|     3 ~ Bottom Right      |")
    print("|      4 ~ Middle Left      |")
    print("|     5 ~ Middle Center     |")
    print("|     6 ~ Middle Right      |")
    print("|       7 ~ Top Left        |")
    print("|      8 ~ Top Center       |")
    print("|       9 ~ Top Right       |")
    print("-----------------------------")

def main():

    t=turtle.Turtle()
    t.speed(0)
    t.hideturtle()

    x=-50
    y=100

    for loop in range(2):
        t.penup()
        t.setposition(-100,y)
        t.pendown()
        t.forward(150)
        y=y-50
    t.right(90)
    for loop in range(2):
        t.penup()
        t.setposition(x, 150)
        t.pendown()
        t.forward(150)
        x=x+50
    t.left(90)

    playerOne=[]
    playerTwo=[]
    winPossible=[1,2,3]
    winPossible2=[4,5,6]
    winPossible3=[7,8,9]
    winPossible4=[1,4,7]
    winPossible5=[2,5,8]
    winPossible6=[3,6,9]
    winPossible7=[1,5,9]
    winPossible8=[3,5,7]

    menu()

    win="false"
    while(win != "true"):

        option=input("Choose where to draw an X.")
        if(option=="1"):
            X1(t)
            playerOne.append(1)
        elif(option=="2"):
            X2(t)
            playerOne.append(2)
        elif(option=="3"):
            X3(t)
            playerOne.append(3)
        elif(option=="4"):
            X4(t)
            playerOne.append(4)
        elif(option=="5"):
            X5(t)
            playerOne.append(5)
        elif(option=="6"):
            X6(t)
            playerOne.append(6)
        elif(option=="7"):
            X7(t)
            playerOne.append(7)
        elif(option=="8"):
            X8(t)
            playerOne.append(8)
        elif(option=="9"):
            X9(t)
            playerOne.append(9)
        elif(option=="end"):
            win="true"

        option=input("Choose where to draw an O.")
        if(option=="1"):
            O1(t)
            playerTwo.append(1)
        elif(option=="2"):
            O2(t)
            playerTwo.append(2)
        elif(option=="3"):
            O3(t)
            playerTwo.append(3)
        elif(option=="4"):
            O4(t)
            playerTwo.append(4)
        elif(option=="5"):
            O5(t)
            playerTwo.append(5)
        elif(option=="6"):
            O6(t)
            playerTwo.append(6)
        elif(option=="7"):
            O7(t)
            playerTwo.append(7)
        elif(option=="8"):
            O8(t)
            playerTwo.append(8)
        elif(option=="9"):
            O9(t)
            playerTwo.append(9)
        elif(option=="end"):
            win="true"

        t.penup()
        t.forward(10)
        #pointless forward so O will be drawn now instead of later

        if(set(playerOne)>=set(winPossible)):
            win="true"
        elif(set(playerOne)>=set(winPossible2)):
            win="true"
        elif(set(playerOne)>=set(winPossible3)):
            win="true"
        elif(set(playerOne)>=set(winPossible4)):
            win="true"
        elif(set(playerOne)>=set(winPossible5)):
            win="true"
        elif(set(playerOne)>=set(winPossible6)):
            win="true"
        elif(set(playerOne)>=set(winPossible7)):
            win="true"
        elif(set(playerOne)>=set(winPossible8)):
            win="true"

        if(set(playerTwo)>=set(winPossible)):
            win="true"
        elif(set(playerTwo)>=set(winPossible2)):
            win="true"
        elif(set(playerTwo)>=set(winPossible3)):
            win="true"
        elif(set(playerTwo)>=set(winPossible4)):
            win="true"
        elif(set(playerTwo)>=set(winPossible5)):
            win="true"
        elif(set(playerTwo)>=set(winPossible6)):
            win="true"
        elif(set(playerTwo)>=set(winPossible7)):
            win="true"
        elif(set(playerTwo)>=set(winPossible8)):
            win="true"

main()

【问题讨论】:

  • 很明显,您已经在代码中投入了很多精力,但由于存在大量复制,因此很难用当前代码解决您的具体问题。在尝试添加更多功能之前,您应该在代码库变得更大之前查看DRY principle
  • 是的,我知道有很多重复问题,修复一件事会让你必须修复很多,但由于这是为了学校,我只是使用了我所知道的,因为我还没有学到任何其他方法正在做。如果您有任何减少它的好主意,那就太好了。
  • 程序按预期正常运行后,您应该考虑将其发布到codereview.stackexchange.com
  • 这是一个灰色区域,因为发布一个向您展示如何减少重复的答案并不能严格回答您的任何问题。首先,查看passing arguments to functions,然后考虑使用dictionary 来存储您要传递的值。这些链接不是很好,所以利用它作为一个获得一点理解的机会,然后用谷歌搜索来研究任何误解。这基本上就是我的生活:)
  • 试着想想如果你在很多地方做几乎相同的事情,然后试着想办法也许只在一个地方做。一件事是绘制你的 X:s 和 O:s。你的绘图可以使用相同的函数(以位置作为输入参数)吗?

标签: python turtle-graphics tic-tac-toe


【解决方案1】:

我有一个问题,玩家可以在棋盘上的相同空间上前进 即使那个空间被占用了。

这是一个你可以使用的创可贴。这段代码在哪里:

option=input("Choose where to draw an X.")

改为:

option = None
while not option or int(option) in playerOne or int(option) in playerTwo:
    option = input("Choose where to draw an X.")

执行等效但稍作修改的操作,修复您找到的位置:

option=input("Choose where to draw an O.")

这不是最佳的,但可以帮助您克服这个特殊的障碍。

我也有一个问题,一旦胜利是真的,它仍然会运行其余的 程序直到它回到 while 命令的开头 再次。

这需要您将测试逻辑封装到一个函数中,正如其他人在他们的 cmets 中所指出的那样,并在每个玩家移动后应用它,而不是在两个玩家都走后应用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    相关资源
    最近更新 更多