2017-10-17 12 views
0

私は、甲殻類を甲殻類で使用しています。今は、私が見ているボックスをプログラムが簡単にチェックできるようにする方法を理解しようとすると、ちょっと困っています。私は異なる位置に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)) 

は、私は、彼らが亀のグリッド上の異なるスポットに座っているので、各ボードは異なるPOSXとPOSYを持っている理由がある

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

特にこの行に注意を喚起したいです。上で見たように、名前が "box A _ B"の関数があります。ここで、AとBはボックスの位置番号です。私が書いたことはうまくいかないことを知っています(私もそれを試しました)が、達成しようとしていることを私にさせるPython関数があるかどうか疑問に思っていました。 私のループでは、iとjが何であれ、自分のプログラムがbox [i] _ [j]を使用したいと思います。 これはあまり言い表せない場合はお詫び申し上げます。より明確にする必要がある場合は、私は熱心にあなたに伝えます。私はちょうど誰かが私が探しているものを知っていることを望んでいた。

+1

次のブログ投稿[** _変数名からデータを保持する_ **](https://nedbatchelder.com/blog/201112/keep_data_out_of_your_variable_names.html)のアドバイスは関係します。 – martineau

+1

martineauが言ったこと。もしあなたがboard1..board5のような一連の番号付き変数を作成しているのであれば、あなたが間違っていることを示す記号であり、それらのボードはリスト内の項目、あるいはおそらくdictでなければなりません。 –

+0

同様に、 "boxA_B"という名前の関数はおそらくもっと効率的に実行できます。理想的には、これらすべての機能を1つの機能にまとめることができます。しかし、できないなら、 'boxfunc [a] [b](posx、poy)'のように呼び出すことのできる2Dグリッド関数を作成する方法があります。 –

答えて

1

このようにbox関数を定義してください。

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

それからちょうど代わりbox(i, j, posx, posy)を呼び出します。

+0

ありがとう!これは私が探していた式でした。私は今、私の目の前でそれを見て超愚かに感じる。乾杯! –

+0

アップデートが必要な場合は、それを実装して、完璧に動作します! –

1

ij引数からの比較的単純な式で関数の結果を決定できるので、この特定のケースでは、他の答えに示すように汎用のbox()関数を書くのが最適な方法です。しかしそれが真実ではないより一般的な状況では、辞書のようなものを使用して、さまざまな可能な組み合わせを目的の機能にマッピングしたいと考えています。以下はあなたの問題を解決する方法でした。

まず、対応する機能と異なる引数の値を関連付けるために辞書を追加:

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)) 
関連する問題