2017-09-07 1 views
0

Ich wurde gebeten, ein Matching-Spiel für ein Schulprojekt zu erstellen, bei dem Zufallszahlen in einem Gitter generiert werden. Ich habe es geschafft, das Gitter voller Zufallszahlen zu erzeugen, aber ich brauche sie paarweise, damit sie zusammenpassen. Jede Hilfe würde sehr geschätzt werden. Hier ist mein Code so weit:Paare zufälliger Ganzzahlen in einem Gitter erzeugen (2D-Array) python

def spielen(): Import Zufall

sizeofgrid() 

board = [] 

showboard = [] 

for row in range(gridsize): 
    board.append([]) 
    for column in range(gridsize): 
     board[row].append(random.randint(0, 9)) 

def print_board(board): 
    for row in board: 
     print(' '.join([str(i) for i in row])) 

showboard = [['O' for _ in range(gridsize)] for _ in range(gridsize)] 

print_board(showboard) 
print_board(board) 
+0

Möchten Sie nur zwei von jeder Nummer sein? Oder die Zahlen 0-9 werden so oft wie nötig wiederholt, enden aber in einer geraden Anzahl von jedem? –

+0

Ja, ich brauche zwei von jeder Nummer, die in zufälligen Positionen um das Raster angeordnet sind. Wenn man darüber nachdenkt, kann es von 0 bis zu vielen sein, um das Gitter zu füllen (die Größe des Gitters wird vom Benutzer gewählt). Ich habe natürlich darauf geachtet, dass es nur eine gerade Anzahl von Feldern im Raster geben kann. –

Antwort

1

Ein Ansatz könnte die Hälfte der Zahlen zu erzeugen, die Sie benötigen und dann diese Liste verdoppeln. Mische dann die gewünschten Werte und verändere sie in einem Raster.

from random import randint, shuffle 

size = 4 # must be even 
pairs = size**2/2 

pool = range(pairs) * 2 
# [0, 1, 2, 3, 4, 5, 6, 7, 
# 0, 1, 2, 3, 4, 5, 6, 7] 

shuffle(pool) 

grid = [pool[i:i+size] for i in range(0, size**2, size)] 
# [[4, 5, 0, 7], [1, 7, 3, 5], [2, 1, 2, 6], [4, 0, 3, 6]] 
+0

Danke für die Hilfe, ich werde es versuchen. –

0

Sie müssen Ihren Ansatz ändern. Sie können versuchen, eines von zwei Dingen:

  1. Beginnen Sie mit einer leeren Platine. Generieren Sie eine Zufallszahl und generieren Sie dann zwei zufällige Positionen auf der Karte. Wiederholen Sie den Vorgang so lange, bis Sie zweimal einen leeren Steckplatz mit der Nummer finden. Legen Sie die Zufallszahl in beide Orte.

    for _ in range(width * height // 2): 
        number = pick_random_number() 
        loc1 = find_random_empty_spot() 
        board[loc1.row][loc1.col] = number 
        loc2 = find_random_empty_spot() 
        board[loc2.row][loc2.col] = number 
    
  2. Berechnen Sie, wie viele Standorte gefüllt werden müssen. Generieren Sie eine N/2 Zufallszahlen, geben Sie jede Zufallszahl zweimal in eine Liste ein. Jetzt, mischen Sie die Liste, und dann Schleife über die Platine, Einfügen von Elementen aus die Liste in die Platine.

    num_picks = width * height // 2 
    picks = [] 
    
    for _ in range(num_picks): 
        number = pick_random_number() 
        picks.extend([number, number]) 
    
    random.shuffle(picks) 
    
    for row in range(height): 
        for col in range(width): 
         board[row][col] = picks.pop() 
    

Jeder dieser Ansätze werden Sie das Verhalten gepaart Sie wollen. Welches Sie wählen, ist eine Frage des Komforts.

+0

Danke für die Hilfe, wie würde ich eine zufällige Position generieren? Würde ich Koordinaten verwenden? –

+0

Das ist ein Weg. Generiere ein zufälliges int im 'range (width)' und ein anderes in 'range (height)'. –

+0

Danke für Ihre Hilfe. –