2017-10-06 7 views
1

En Python (V2.7), j'essaye de faire un jeu ConnectFour contre un lecteur d'ordinateur. J'ai développé une fonction simple pour trouver 4 d'affilée (pour déterminer la fin du jeu) et retourner TRUE si c'est le cas, et maintenant j'essaie d'utiliser la même fonction pour localiser 3 dans une rangée et retourner l'emplacement .Python: Fonction return bool et tuple entier

def finder(matrix, player,number): 
    for row in matrix: 
      count = 0 
      for item in row: 
       if item == player: 
        count +=1 
        if count == number: 
         return True 
       else: 
        count = 0 

où je peux entrer: finder (conseil, « X », 4) pour savoir si quatre dans une rangée est VRAI ou encore à FALSE par défaut (ce qui fonctionne le). Maintenant, je veux essayer quelque chose comme ceci:

def finder(matrix, player,number): 
    for row in matrix: 
      count = 0 
      for item in row: 
       if item == player: 
        count +=1 
        if count == number: 
         return True 
         location = row, item 
         return location 
       else: 
        count = 0 

Cependant, cela appelle une erreur que je ne l'ai pas initialisé l'emplacement, donc je puis définir ma position = 0, 0. Maintenant, il retourne juste TRUE et le tuple (0, 0). Comment puis-je l'obtenir pour donner l'emplacement du dernier élément du 3 dans une rangée? Editer: J'ai essayé de retourner le triplet: VRAI, ligne, élément. Cependant, la deuxième partie du problème est comment puis-je obtenir les numéros de ligne et de col lorsque la fonction est TRUE? Le code suivant fonctionne pour réaliser qu'il y a une menace, mais je ne peux pas trouver un moyen d'obtenir l'emplacement d'une menace étant donné qu'il existe une menace.

if finder(board, "X", 3) is True: 
    horizontal_threat = True 
    print row, item 
+4

_ "Maintenant, il retourne juste TRUE et le tuple (0,0) "_. Cela ne me semble pas possible. Une fonction ne peut pas retourner deux fois. Lorsque votre fonction atteint 'return True', elle se termine immédiatement et transmet' True' au contexte appelant, sans jamais arriver '' return location''. Pouvez-vous fournir un [mcve] qui démontre votre comportement revendiqué? – Kevin

+1

_ "Je peux entrer: finder (tableau," X ", 4) pour savoir si quatre d'affilée est VRAI ou toujours par défaut FALSE" _. Êtes-vous en train de dire que votre fonction renvoie False par défaut si vous ne rencontrez aucune déclaration de retour? Si une fonction se termine sans appuyer sur une instruction return, elle renvoie None, pas False. En toute justice, None is [falsey] (https://stackoverflow.com/questions/39983695/what-is-truthy-and-falsy-in-python-how-is-it-different-from-true-and-false), donc dans certains contextes, ils se comportent de la même manière mais classiquement, il est préférable de renvoyer explicitement False plutôt que None si tous les chemins de code doivent renvoyer un booléen. – Kevin

+0

Je n'étais pas au courant qu'une fonction ne pouvait renvoyer qu'une seule valeur, j'ai défini location = 0,0 au début du programme. Maintenant, je me rends compte que j'appelais simplement une variable que j'ai définie il y a quelques temps. – Ra31513

Répondre

0

Vous pouvez le faire par

for (i, row) in enumerate(matrix): 
    ... 
    for (j, item) in row: 
     ... 
     if (count==number): 
      return (i, j) 

Cependant, il y a quelques mauvaises choses dans le code actuel.

  • vous avez deux instructions de retour. Je ne pense pas que ce soit possible de retourner (0, 0) comme c'est
  • vous comptez le nombre total de X dans la matrice. vous ne vérifiez pas s'ils sont dans une ligne
0

Votre deuxième déclaration de retour n'est pas exécutée pour la raison spécifiée par @Kevin dans son commentaire ci-dessus.

Vous devez écrire votre déclaration comme

return True, location

et wherver vous appelez finder vous devez faire comme

found, values = finder(board, "X", 3)

0
# Complete, working, Python 3 solution 


def finder(matrix, player, number): 
    location = None 
    for row in matrix: 
     count = 0 
     for item in row: 
      if item == player: 
       count +=1 
       if count == number: 
        location = row, item 
        break 
      else: 
       count = 0 

    return location 


matrixMain = [ [1, 0, 0, 0], [2, 2, 2, 2], [1, 0, 0, 0], [1, 0, 0, 0] ] 

for itemToFind in range(1, 3): 
    locationFound = finder(matrixMain, itemToFind, 3) 
    if locationFound is None: 
     print("item {} not found".format(itemToFind)) 
    else: 
     rowFound = locationFound[0] 
     itemFound = locationFound[1] 
     print("found item {}".format(itemFound)) 


# Is forcing users to indent code by four spaces really the best Stackoverflow can do ?