2016-11-04 3 views
0

nimmt So habe ich ein sehr einfaches Spielbrett:(Python) 2D-Array Checkers - Wie zu springen und gegnerische Figur

B W B W   with assigned coordinates of  1 2 3 4 
    W B W B            5 6 7 8 
    B W B W            9 10 11 12 

Dieses Spiel ist nicht wirklich Kontrolleure, aber ähnlich. Die Benutzer wählen jeweils ein Stück (B oder W) aus, das vor Spielbeginn entfernt werden soll. So würden wir mit so etwas wie dies beginnen werden:

- W B W 
    W B W B 
    B - B W 

Als nächstes werden die Nutzer in der Lage zu ‚springen‘ über des anderen Benutzers Stück. Der Sprung kann nur horizontal oder vertikal sein, kein diagonales Springen. Also ich bin weg beginnend von dem, was der Benutzer des Stückes koordiniert Erfassung ist die Auswahl, sowie die Zielkoordinaten, wo sie nach ihrem Sprung landen:

Bjump = input(BLACK, first select the coordinate of the piece you want to move as well as the coordinate where you would like to land. Please Separate Coordinates with a SINGLE space: ") 

Der Benutzer der B @ können wählen muss koordinieren '3', überspringe das W @ 2 und lande @ Koordinate 1. Bei diesen Vorgängen sollte nicht nur das B-Stück über das W-Stück springen, sondern das W-Stück, das es gesprungen ist, @koordinieren 2. Ersetzen durch ein '-'

geben die Ausgabe:

B - - W 
    W B W B 
    B - B W 

Meine ersten Gedanken waren t o etwas tun, wie folgt aus:

if(Bjump == "3 1"): 
    if(grid[0][1] == 'W'): 
     if(grid[0][2] == 'B'): 
      grid[0][2] = '-' 
      grid[0][1] = '-' 
      grid[0][1] = 'B' 
     else: 
      print("oops! try again!") 
    else: 
     print("oops! You can only jump over W's!") 

mit dieser Mein Problem ist, dass nicht nur werde ich eine if (Erklärung) für jedes mögliche Szenario zu schaffen, aber wer weiß, was das Spielbrett sein wird bei jede Bewegung jedes Spiels?

Kann mir jemand bitte helfen, mich nicht nur daran zu gewöhnen, wie ich es machen soll, sondern wie ich es "Universal" machen kann, egal wie viele verschiedene Spielarten gespielt werden können? Danke im Voraus!!

Antwort

1

Das Stück, über das gesprungen wird, ist immer der Durchschnitt der Quell- und Zielkoordinaten x, y. In diesem Sinne könnte man so etwas schreiben:

board = [ 
    ['-', 'W', 'B', 'W'], 
    ['W', 'B', 'W', 'B'], 
    ['B', '-', 'B', 'W'] 
] 

def print_board(board): 
    for row in board: 
     print(row) 

def coords(board, num): 
    num = int(num) - 1 
    return num % len(board), num // len(board) 

def jump(board, move): 
    (src_x, src_y), (dst_x, dst_y) = (coords(board, x) for x in move.split()) 
    x_diff = abs(src_x - dst_x) 
    y_diff = abs(src_y - dst_y) 

    if sorted([x_diff, y_diff]) != [0, 2]: 
     print('Oops, invalid coordinates') 
     return 

    mid_x = (src_x + dst_x) // 2 
    mid_y = (src_y + dst_y) // 2 

    if board[src_y][src_x] == '-': 
     print('Oops, source cell empty') 

    if board[dst_y][dst_x] != '-': 
     print('Oops, target cell occupied') 

    if board[mid_y][mid_x] == '-': 
     print('Oops, no piece to jump over') 

    if board[src_y][src_x] == board[mid_y][mid_x]: 
     print('Oops, can\'t jump over piece with same color') 

    board[dst_y][dst_x] = board[src_y][src_x] 
    board[mid_y][mid_x] = '-' 
    board[src_y][src_x] = '-' 

move = '3 1' 
print_board(board) 
print('Execute move {}'.format(move)) 
jump(board, move) 
print_board(board) 

Ausgang:

['-', 'W', 'B', 'W'] 
['W', 'B', 'W', 'B'] 
['B', '-', 'B', 'W'] 
Execute move 3 1 
['B', '-', '-', 'W'] 
['W', 'B', 'W', 'B'] 
['B', '-', 'B', 'W'] 

Beachten Sie, dass oben nur auf Python funktioniert 3.

+0

Was bedeutet das 'j' Argument in der Sprungfunktion? – Ted

+0

@Ted: Es ist eigentlich die ganze Bewegung, umbenannt, um es klarer zu machen. – niemmi

+0

Vielen Dank für die Antwort, die Sie mir gegeben haben. Es war eine große Hilfe. Ich nehme ein wenig zur Antwort, da ich Ihre Antwort mit meinem Code analysiert und verglichen habe. Ich habe viel damit als Referenz gelernt. Danke noch einmal! – Ted

0

Wenn Sie das Board wie drucken:

for row in board: 
print(" ".join(row)) 

... es druckt das Board in einem schöneren Raster, das eher wie ein richtiges GUI-Spiel aussieht. Probieren Sie es einfach aus, Sie werden sehen.