如何将变量实现为函数名

2024-10-03 15:24:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用python中的turtle做一个数独板。现在,我有一个小麻烦,试图找出如何让程序轻松地检查哪个框,我在看。我有5个网格在不同的位置。游戏将自动选择一个游戏。由于每个网格的位置不同,所以我必须小心海龟的位置。我有16个函数,计算我想要我的海龟光标在哪里画数字。你知道吗

#Below is a guide to where each box is relative to its position on the grid. 

#To find center of the box, add 75 to x and 20 to y.
#Box(1,1) = x, y        Box(1,2) = x+150, y        Box(1,3) = x+300, y        Box(1,4) = x+450, y
#Box(2,1) = x, y-150    Box(2,2) = x+150, y-150    Box(2,3) = x+300, y-150    Box(2,4) = x+450, y-150
#Box(3,1) = x, y-300    Box(3,2) = x+150, y-300    Box(3,3) = x+300, y-300    Box(3,4) = x+450, y-300
#Box(4,1) = x, y-450    Box(4,2) = x+150, y-450    Box(4,3) = x+300, y-450    Box(4,4) = x+450, y-450

def box1_1(x, y):
    return(x+75, y+20)

def box1_2(x, y):
    return(x+225, y+20)

def box1_3(x, y):
    return(x+375, y+20)

def box1_4(x, y):
    return(x+525, y+20)

def box2_1(x, y):
    return(x+75, y-130)

def box2_2(x, y):
    return(x+225, y-130)

def box2_3(x, y):
    return(x+375, y-130)

def box2_4(x, y):
    return(x+525, y-130)

def box3_1(x, y):
    return(x+75, y-280)

def box3_2(x, y):
    return(x+225, y-280)

def box3_3(x, y):
    return(x+375, y-280)

def box3_4(x, y):
    return(x+525, y-280)

def box4_1(x, y):
    return(x+75, y-430)

def box4_2(x, y):
    return(x+225, y-430)

def box4_3(x, y):
    return(x+375, y-430)

def box4_4(x, y):
    return((x+525, y-430))

我可以得到的董事会,以绘制我想要的和给定的数字也画得正确。我希望用户可以选择玩实时修正或玩传统的地方,他们可以输入所有的值,游戏将检查他们的解决方案是否正确。我遇到的问题是在用户将所需数字输入框的过程中。现在我有:

def playSudoku():
    playboard = []
    board1 = [[0,0,0,3],[0,1,0,4],[4,2,0,1],[0,3,4,0]]
    board2 = [[4,3,0,0],[1,0,3,0],[0,0,2,0],[2,1,0,0]]
    board3 = [[0,4,0,1],[3,0,3,0],[1,0,0,4],[0,2,1,0]]
    board4 = [[1,0,3,0],[0,4,2,1],[0,0,0,2],[0,0,4,0]]
    board5 = [[0,4,3,2],[3,0,0,0],[4,0,0,0],[0,0,4,1]]
    boardchoice = random.randint(1,5)
    if boardchoice == 1:
        drawBoard1()
        playboard = board1
        posx = -900
        posy = 850
    elif boardchoice == 2:
        drawBoard2()
        playboard = board2
        posx = -200
        posy = 850
    elif boardchoice == 3:
        drawBoard3()
        playboard = board3
        posx = 500
        posy = 850
    elif boardchoice == 4:
        drawBoard4()
        playboard = board4
        posx = -500
        posy = 100
    else:
        drawBoard5()
        playboard = board5
        posx = 200
        posy = 100
    rtc = turtle.textinput("Sudoku", "Do you want to play with real time correction?")
    if rtc == 'y':
        for i in range (0,3):
            for j in range (0,3):
                if playboard[i][j] != 0:
                    pass
                num = turtle.numinput('Sudoku', 'Enter a number for box[' + str(i) + ',' + str(j) + ']?: ', minval=1, maxval=4)
                turtle.goto(box[i]_[j](posx,posy))
                turtle.write(str(num), move=True, align="center", font=("Times New Roman", 24))

我想特别提醒大家注意这一行

turtle.goto(box[i]_[j](posx,posy))

为什么每个棋盘都有不同的posx和posy是因为它们位于海龟网格上的不同位置。正如您在上面看到的,我有一个名为“boxA\ustrong>B”的函数,其中A和B是box的位置号。我知道我写的东西不起作用(我也试过,以防万一),但我想知道是否有一个python函数可以让我完成我想要实现的事情。 在我的循环中,无论i和j是什么,我都希望我的程序使用box[i]\uj。 我很抱歉,如果这是拙劣的措辞。如果需要更多的澄清,我将急切地告诉你。我只是希望外面有人知道我在找什么。你知道吗


Tags: tobox网格returndefturtlebox2box1
2条回答

您可能应该这样定义box函数。你知道吗

def box(i, j, x, y):
    return (x + 150*j - 75, y - 150*i + 170)

那就打电话给box(i, j, posx, posy)。你知道吗

尽管在这种特殊情况下,编写另一个答案中所示的泛型box()函数是最好的方法,因为函数的结果可以通过ij参数的相对简单的公式来确定。但是,在更一般的情况下,如果不是这样,您可能需要使用字典之类的工具将不同的可能组合映射到所需的函数。下面是如何解决你的问题。你知道吗

首先添加一个字典,将不同的参数值与相应的函数相关联:

box_map = {
    (1, 1): box1_1,
    (1, 2): box1_2,
    (1, 3): box1_3,
    (1, 4): box1_4,
    (2, 1): box2_1,
    (2, 2): box2_2,
    (2, 3): box2_3,
    (2, 4): box2_4,
    (3, 1): box3_1,
    (3, 2): box3_2,
    (3, 3): box3_3,
    (3, 4): box3_4,
    (4, 1): box4_1,
    (4, 2): box4_2,
    (4, 3): box4_3,
    (4, 4): box4_4,
}

下一步是修改playSudoku()函数以使用它查找要调用的函数:

      ...
    rtc = turtle.textinput("Sudoku", "Do you want to play with real time correction?")
    if rtc == 'y':
        for i in range (0,3):
            for j in range (0,3):
                if playboard[i][j] != 0:
                    pass
                num = turtle.numinput('Sudoku', 'Enter a number for box[' + str(i) + ',' + str(j) + ']?: ', minval=1, maxval=4)
#                turtle.goto(box[i]_[j](posx, posy))
                turtle.goto(box_map[i, j](posx, posy))
                turtle.write(str(num), move=True, align="center", font=("Times New Roman", 24))

相关问题 更多 >