3

私は戦艦ゲームを作っていますが、すべてうまくいきます。しかし、ターン システムを含めたので、ゲームが正常に動作しません。ゲームには 2 つのボードがあります (1 つは非表示、もう 1 つは「パブリック」で、対戦相手が見ることができます (したがって、船はありません)。非表示は機能しますが、パブリックはターンごとにリセットされるため、前のヒットが何であったかはわかりません。

以下のコードは「攻撃」シーケンス用で、もちろんターンの while ループです。では、ターン制を適切に実装するために何をアドバイスしますか? 関数から「パブリック」ボードに関する情報を取得する必要があるだけです。

    def napad(osebni_board):

    board = [] #this is the public board, the 'private' one is defined in another function (the board is called osebni_board)
    for x in range(0,5):
        board.append([" "] * 5)
    x=0
    while x<1 :
        napad_vrstica=streljaj_vrstica()
        napad_stolpec = streljaj_stolpec()
        osebni_board_priverjanje = list(itertools.chain(*osebni_board))

        if napad_vrstica <= len(board)-1 and napad_stolpec <= len(board[0])-1 and "S"  in osebni_board_priverjanje:
            print osebni_board_priverjanje
            if  osebni_board[napad_vrstica][napad_stolpec]=="S":
                osebni_board[napad_vrstica][napad_stolpec]="" #osebnemu boardu se element S spremeni v element H, zato, da ponovni stren ni razumljen kot zadetek
                board[napad_vrstica][napad_stolpec]="H"
                osebni_board_priverjanje = list(itertools.chain(*osebni_board))

                print True
                print "Kapitan, vase koordinate so se izkazale za tocne. Sovrazna ladja je uspesno potopljena!"
                print_board(board)
                if "S" not in osebni_board_priverjanje:
                    print_board(board)
                    print "game over"
                    break

            elif board[napad_vrstica][napad_stolpec]=="H":
                print "Ladja na koordinatah {},{} je ze bila potopljena, kapitan {}!".format(napad_vrstica, napad_stolpec, ime)



            elif osebni_board[napad_vrstica][napad_stolpec]=="M":
                print "Na koordinate {},{} ste ze streljali, kapitan {}!".format(napad_vrstica, napad_stolpec, ime)



            else:
                board[napad_vrstica][napad_stolpec]="M"
                osebni_board[napad_vrstica][napad_stolpec]="M"
                print "Zadetek neuspesen, kapitan {}!\n".format(ime)
                print_board(board)

        else:
            mrtvi = random.randint(100, 10000)
            print "Kapitan! Zadeli smo obalo! {} mrtvih!\nPoskusite znova!".format(mrtvi)
        x+=1

    return osebni_board_priverjanje

ターンシステム:

igralec = 0
while True:
    if igralec%2==0:
        print "Na vrsti je igralec 1"
        napad_igralec_1=napad(igralec_2)

    else:
        print "Na vrsti je igralec 2"
        napad_gralec_2=napad(igralec_1)
    igralec+=1
    print igralec
4

1 に答える 1

2

変数名を理解できないのでわかりませんが、napad関数の最初に を設定board = []したため、 にあったものはすべて消去されboardます。またboard、ローカル変数のように見えるので、何をしても関数が終了するたびに消えます。あなたのコードを正しく理解していれば、 を呼び出すたびにプライベート ボードをパブリック ボードにロードしているように見えますがnapad、これを行うたびに から開始するとboard = []、パブリック ボードには永続的な状態がなくなります。のようなことをすると、関数が終了すると破棄board[napad_vrstica][napad_stolpec]="M"されるローカル変数に要素を設定するだけです。これをすべて修正するには、公開ボードを一度作成する必要があります。boardnapadnapad関数を作成し、空白で初期化してから、関数内からそのパブリック ボードを (グローバル変数として、または引数として渡すことによって) 参照しますnapad

于 2012-11-22T19:19:56.100 に答える