Strona główna Polish Python Coders Group
   Strona główna   Pomoc Zaloguj się Rejestracja  
Witamy, Gość. Zaloguj się lub zarejestruj.
Czy dotarł do Ciebie email aktywacyjny?

Zaloguj się podając nazwę użytkownika, hasło i długość sesji

Aktualności: PyStok #42 - wystąpią Łukasz Langa i Dominik Kozaczko
Szukaj Szukaj
Strony: [1]   Do dołu
Drukuj
Wątek: Pytanie - gra kółko i krzyżyk  (Przeczytany 3754 razy)
« : 17:57 23/06/18 »
zen404 Offline
Hello World!

Zobacz profil
*

Reputacja: 0
Wiadomości: 4


Witam wszystkich forumowiczów, jestem początkujący Python-niarzem więc proszę o wyrozumiałość ;d. 

Przerabiam właśnie zadania z książki Python dla początkujących i napotkałem pewien problem w tworzeniu gry kółko i krzyżyk. Mianowicie.

Kod działa prawidłowo w takiej wersji (testowej).
a=-1
while a<0:
    user_move()
    if nastede[1] == X:
        print("Game over mean Mrugnięcie")
        break

Kod nie działa praiwdłowo
a=-1
while a<0:
    user_move()
    if winner() == True:
        print("Game over mean Mrugnięcie")
        break

*kończy działanie pętli jeżeli w danym polu na planszy kółko krzyżyk wystąpi X
*nie kończy działania pętli przy próbie zastosowania paru warunków

winner to wszystkie ruchy wygranej
def winner()Smutny(nastede[0] == nastede[1] == nastede[2] == User) or
              (nastede[3] == nastede[4] == nastede[5] == User) or
              (nastede[6] == nastede[7] == nastede[8] == User) or
              (nastede[0] == nastede[3] == nastede[6] == User) or
              (nastede[1] == nastede[4] == nastede[7] == User) or
              (nastede[2] == nastede[5] == nastede[8] == User) or
              (nastede[0] == nastede[4] == nastede[8] == User) or
              (nastede[6] == nastede[4] == nastede[2] == User))
Próbowałem zamienić funkcje na listę, krotkę, lecz bez skutku.

Będę wdzięczny za pomoc, lub krytyczne komentarze, które pokierują mnie co jeszcze muszę nadrobić w materiale (do stworzenia takiej gierki). Pozdradzam.
Zapisane
« Odpowiedz #1 : 18:51 23/06/18 »
Guaz Offline
Expert Python User

Zobacz profil
****

Reputacja: 72
Płeć: Mężczyzna
Wiadomości: 542


Ostatnio był poruszony problem gry w kółko i krzyżyk, mój kod w pełni działający masz w ostatnim poście:
https://pl.python.org/forum/index.php?topic=8468.0


Spróbuj go sobie przeanalizować Uśmiech
Zapisane

Python 3.5+ / Mint

Daje wędkę zamiast ryby. Chyba że ktoś się chce czegoś nauczyć, wtedy chętnie pomogę każdemu.
Za rybę niestety trzeba zapłacić Z politowaniem.
« Odpowiedz #2 : 19:34 23/06/18 »
zen404 Offline
Hello World!

Zobacz profil
*

Reputacja: 0
Wiadomości: 4


Dzięki za odpowiedź, lecz niestety nie widzę w Twojej odpowiedzi w podanym wątku jak rozwiązać mój problem. Gotowy kod również posiadam, który prezentuje się w taki sposób jak poniżej(może komuś też się jeszcze przyda Mrugnięcie). Nie przybliża mnie to jednak do odpowiedzi na nurtujące mnie pytanie. Celem nie jest samo stworzenie gry a dowiedzenie się czegoś, co widocznie teraz nie rozumie ( i od paru godzin główkuję jak to zrobić ;d).


>>>while winer_global() != True:
    >>>user_move()
>>>print("pętla się konczy :-))
  X |  X  |  X  
---------------
    |     |    
---------------
    |     |    
True


Dlaczego zatem pętla w Pythonie nie widzi że warunek jest spełniony i nie
kończy działania? powinna zakończyć zgodnie z True != True:


def winer_global():
    global naste
    print((nastede[0] == nastede[1] == nastede[2] == X))



Ps. w takiej wersji działa wszystko praiwdłowo
>>>while (nastede[0] == nastede[1] == nastede[2] == X) != True:
    >>>user_move()


Kod
[quote]# Tic Tac Toe
 
import random
 
def drawBoard(board):
   # This function prints out the board that it was passed.
 
   # "board" is a list of 10 strings representing the board (ignore index 0)
   print('   |   |')
   print(' ' + board[7] + ' | ' + board[8] + ' | ' + board[9])
   print('   |   |')
   print('-----------')
   print('   |   |')
   print(' ' + board[4] + ' | ' + board[5] + ' | ' + board[6])
   print('   |   |')
   print('-----------')
   print('   |   |')
   print(' ' + board[1] + ' | ' + board[2] + ' | ' + board[3])
   print('   |   |')
 
def inputPlayerLetter():
   # Lets the player type which letter they want to be.
   # Returns a list with the player's letter as the first item, and the computer's letter as the second.
   letter = ''
   while not (letter == 'X' or letter == 'O'):
       print('Do you want to be X or O?')
       letter = input().upper()
 
   # the first element in the tuple is the player's letter, the second is the computer's letter.
   if letter == 'X':
       return ['X', 'O']
   else:
       return ['O', 'X']
 
def whoGoesFirst():
   # Randomly choose the player who goes first.
   if random.randint(0, 1) == 0:
       return 'computer'
   else:
       return 'player'
 
def playAgain():
   # This function returns True if the player wants to play again, otherwise it returns False.
   print('Do you want to play again? (yes or no)')
   return input().lower().startswith('y')
 
def makeMove(board, letter, move):
   board[move] = letter
 
def isWinner(bo, le):
   # Given a board and a player's letter, this function returns True if that player has won.
   # We use bo instead of board and le instead of letter so we don't have to type as much.
   return ((bo[7] == le and bo[8] == le and bo[9] == le) or # across the top
   (bo[4] == le and bo[5] == le and bo[6] == le) or # across the middle
   (bo[1] == le and bo[2] == le and bo[3] == le) or # across the bottom
   (bo[7] == le and bo[4] == le and bo[1] == le) or # down the left side
   (bo[8] == le and bo[5] == le and bo[2] == le) or # down the middle
   (bo[9] == le and bo[6] == le and bo[3] == le) or # down the right side
   (bo[7] == le and bo[5] == le and bo[3] == le) or # diagonal
   (bo[9] == le and bo[5] == le and bo[1] == le)) # diagonal
 
def getBoardCopy(board):
   # Make a duplicate of the board list and return it the duplicate.
   dupeBoard = []
 
   for i in board:
       dupeBoard.append(i)
 
   return dupeBoard
 
def isSpaceFree(board, move):
   # Return true if the passed move is free on the passed board.
   return board[move] == ' '
 
def getPlayerMove(board):
   # Let the player type in his move.
   move = ' '
   while move not in '1 2 3 4 5 6 7 8 9'.split() or not isSpaceFree(board, int(move)):
       print('What is your next move? (1-9)')
       move = input()
   return int(move)
 
def chooseRandomMoveFromList(board, movesList):
   # Returns a valid move from the passed list on the passed board.
   # Returns None if there is no valid move.
   possibleMoves = []
   for i in movesList:
       if isSpaceFree(board, i):
           possibleMoves.append(i)
 
   if len(possibleMoves) != 0:
       return random.choice(possibleMoves)
   else:
       return None
 
def getComputerMove(board, computerLetter):
   # Given a board and the computer's letter, determine where to move and return that move.
   if computerLetter == 'X':
       playerLetter = 'O'
   else:
       playerLetter = 'X'
 
   # Here is our algorithm for our Tic Tac Toe AI:
   # First, check if we can win in the next move
   for i in range(1, 10):
       copy = getBoardCopy(board)
       if isSpaceFree(copy, i):
           makeMove(copy, computerLetter, i)
           if isWinner(copy, computerLetter):
               return i
 
   # Check if the player could win on his next move, and block them.
   for i in range(1, 10):
       copy = getBoardCopy(board)
       if isSpaceFree(copy, i):
           makeMove(copy, playerLetter, i)
           if isWinner(copy, playerLetter):
               return i
 
   # Try to take one of the corners, if they are free.
   move = chooseRandomMoveFromList(board, [1, 3, 7, 9])
   if move != None:
       return move
 
   # Try to take the center, if it is free.
   if isSpaceFree(board, 5):
       return 5
 
   # Move on one of the sides.
   return chooseRandomMoveFromList(board, [2, 4, 6, 8])
 
def isBoardFull(board):
   # Return True if every space on the board has been taken. Otherwise return False.
   for i in range(1, 10):
       if isSpaceFree(board, i):
           return False
   return True
 
 
print('Welcome to Tic Tac Toe!')
 
while True:
   # Reset the board
   theBoard = [' '] * 10
   playerLetter, computerLetter = inputPlayerLetter()
   turn = whoGoesFirst()
   print('The ' + turn + ' will go first.')
   gameIsPlaying = True
 
   while gameIsPlaying:
       if turn == 'player':
           # Player's turn.
           drawBoard(theBoard)
           move = getPlayerMove(theBoard)
           makeMove(theBoard, playerLetter, move)
 
           if isWinner(theBoard, playerLetter):
               drawBoard(theBoard)
               print('Hooray! You have won the game!')
               gameIsPlaying = False
           else:
               if isBoardFull(theBoard):
                   drawBoard(theBoard)
                   print('The game is a tie!')
                   break
               else:
                   turn = 'computer'
 
       else:
           # Computer's turn.
           move = getComputerMove(theBoard, computerLetter)
           makeMove(theBoard, computerLetter, move)
 
           if isWinner(theBoard, computerLetter):
               drawBoard(theBoard)
               print('The computer has beaten you! You lose.')
               gameIsPlaying = False
           else:
               if isBoardFull(theBoard):
                   drawBoard(theBoard)
                   print('The game is a tie!')
                   break
               else:
                   turn = 'player'
 
   if not playAgain():
       break[/quote]
Zapisane
« Odpowiedz #3 : 15:22 26/06/18 »
davidd26 Offline
Hello World!

Zobacz profil
*

Reputacja: 0
Wiadomości: 1


Wiecie, że na takiej stronie internetowej jak https://plexiwarszawa.pl są bardzo ciekawe produkty wykonane z plexi? Koniecznie zapoznajcie się z tymi ofertami i zakupcie dowolny produkt.
Zapisane
« Odpowiedz #4 : 01:46 27/06/18 »
Guaz Offline
Expert Python User

Zobacz profil
****

Reputacja: 72
Płeć: Mężczyzna
Wiadomości: 542


Najpierw by się przydało żeby to było czytelne i pythonowe ;P.

Bo to nie jest:
Kod
def isWinner(bo, le):
   # Given a board and a player's letter, this function returns True if that player has won.
   # We use bo instead of board and le instead of letter so we don't have to type as much.
   return ((bo[7] == le and bo[8] == le and bo[9] == le) or # across the top
   (bo[4] == le and bo[5] == le and bo[6] == le) or # across the middle
   (bo[1] == le and bo[2] == le and bo[3] == le) or # across the bottom
   (bo[7] == le and bo[4] == le and bo[1] == le) or # down the left side
   (bo[8] == le and bo[5] == le and bo[2] == le) or # down the middle
   (bo[9] == le and bo[6] == le and bo[3] == le) or # down the right side
   (bo[7] == le and bo[5] == le and bo[3] == le) or # diagonal
   (bo[9] == le and bo[5] == le and bo[1] == le)) # diagonal
 
Ale to już bardziej:
Kod
    win_str =  le*3
   return ("".join(bo[7:10:1]) == win_str) or #top side. Skoro le to znak - przemn&#243;&#380; go i przypisz do lokalnej zmiennej by nie wywo&#322;ywa&#263; go tysi&#261;ckro&#263;. A fragmenty list s&#261; po to aby je u&#380;ywa&#263; ;p.
 #...
I wtedy łatwiej będzie debugować print("".join(bo[7:10:1]) == win_str) - co da jasność czy daje true, lub false. Warunkom dłuższym niż porównanie dwóch wartości a później operator and/or nie ufam, pomimo że tutaj są poprawnie skonstruowane w przeciwieństwie do przykładu który podałeś Uśmiech
Zapisane

Python 3.5+ / Mint

Daje wędkę zamiast ryby. Chyba że ktoś się chce czegoś nauczyć, wtedy chętnie pomogę każdemu.
Za rybę niestety trzeba zapłacić Z politowaniem.
Strony: [1]   Do góry
Drukuj
Skocz do:  

© 2007 - 2019 Polish Python Coders Group
Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines | Theme by PixelSlot