Внезапный сбой в операторах if, использующих Pygame и Python в ti c -ta c -toe? - PullRequest
0 голосов
/ 25 марта 2020

Мы делали ti c ta c toe, и мы использовали pygame. Мы случайно просто меняли координаты, но по какой-то причине после кодирования 5-го квадрата оно перестало работать? Кто-нибудь знает, что случилось? Пожалуйста, смотрите ниже для кода. Мы добавляли строки кода для определения того, где текст 'X' или 'O' должен go в зависимости от того, в каком регионе щелкнули мышкой. Но по какой-то причине (что это?) Последний оператор elif никогда работает, и, следовательно, х или о никогда не появляется. Спасибо, что нашли время, чтобы помочь.

import pygame


pygame.init()
width = 600
height = 600

Board = pygame.display.set_mode((width, height))
pygame.display.update()
running = True
pygame.draw.lines(Board, (255, 255, 153), False, [(0,200), (300,200), (600,200)], 1)
pygame.draw.lines(Board, (255, 255, 153), False, [(0,400), (300,400), (600,400)], 1)
pygame.draw.lines(Board,(255,255,153), False, [(200, 0), (200,300), (200,600)],1)
pygame.draw.lines(Board,(255,255,153), False, [(400, 0), (400,300), (400,600)],1)
pygame.display.update()

def text_objects(text, font):
    textSurface = font.render(text, True, (255,255,153))
    return textSurface, textSurface.get_rect()

def message_display(text, position):
    largeText = pygame.font.Font('freesansbold.ttf',115)
    TextSurf, TextRect = text_objects(text, largeText)
    TextRect.center = position
    Board.blit(TextSurf, TextRect)
    pygame.display.update()
def toX(tuple):
    x = tuple[0]
    return x
def toY(tuple):
    y = tuple[1]
    return y
def makeX(pos):
    if toX(pos)<=200 and toY(pos)<=200:
        position = (100, 100)
        message_display(letter, position)
    elif toX(pos)<=400 and toX(pos)>200:
        if toY(pos) <= 200:
            position = (300,100)
            message_display(letter, position)
    elif toX(pos)<=600 and toX(pos)>400:
        if toY(pos) <= 200:
            position = (500,100)
            message_display(letter, position)
    elif toX(pos)<=200:
        if toY(pos) <= 400 and toY(pos) > 200:
            position = (100,300)
            message_display(letter, position)




x = 0
while (running):
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.MOUSEBUTTONDOWN:
            pos = pygame.mouse.get_pos()
            if x == 0:
                letter = "X"
                x = 1
            else:
                letter = "O"
                x = 0
            makeX(pos)

Ответы [ 2 ]

1 голос
/ 25 марта 2020

Акисаат, как вы, вероятно, догадываетесь, этот форум не создан для вашего запроса на помощь в программировании. Переполнение стека больше для технических вопросов опытными программистами. Существуют веб-сайты, ориентированные на ваш уровень обучения. Этого сайта нет.

С учетом сказанного, только один раз, давайте посмотрим на ваш код и посмотрим, где вы ошиблись.

Для большинства ваших квадратов тест верхнего элифа ловит X, но внутренний тест Y работает только для одного квадрата, в то время как все другие значения Y игнорируются. В результате, как только тест elif поймает значение X и не сможет найти значение Y, которое он может использовать, элемент управления выпадет из цепочки if-elif, и эти квадраты никогда не будут обработаны.

Например, это строка ловит ВСЕ щелчки в среднем столбце ...

elif toX (pos) <= 400 и toX (pos)> 200:

.. но вложенные Тест «if» ловит ТОЛЬКО верхнюю строку. ВСЕ ДРУГИЕ квадраты теряются , когда контроль выпадает из цепочки if-elif. Вам необходимо проверить ПЕРВЫЙ для строки, а затем проверить для всех трех столбцов, содержащихся в этой строке. Вы проверяете только ОДИН квадрат в любой строке.

Но я бы предложил другой подход, чтобы вы помещали ВСЕ тесты строк и столбцов в одну строку. Таким образом, вы можете иметь отдельные блоки кода, по одному для каждого уникального квадрата, без слишком большого вложения в какой-либо отдельный блок кода.

Например:

elif toX (pos) <= 400 и toX (pos)> 200 и toY (pos) <200: # Если в столбце 1 строка 0 нажата .. </p>

Затем сделайте что-нибудь в этом поле.

Следовать логике c вашей программы будет проще для вас, если вы будете использовать комментарии для именования квадратов и использовать команды print () для создания отчетов, чтобы вы могли убедиться, что ваш код работает в соответствии с планом. Вы всегда можете go вернуться назад и удалить эти строки, как только ваш код будет проверен. Попробуйте что-то вроде этого в своем коде ..

  # As an aid, let's identify the squares  for our logic block below

  #               |              | 
  #  Square [0,0] | Square [1,0] | Square [2,0]
  #               |              | 
  # --------------------------------------
  #               |              | 
  #  Square [0,1] | Square [1,1] | Square [2,1]
  #               |              | 
  # --------------------------------------
  #               |              | 
  #  Square [0,2] | Square [1,2] | Square [2,2]
  #               |              | 

def makeX(pos):    

    # Square [0,0]
    if toX(pos)<=200 and toY(pos)<=200: # If the far left column and the top row is Clicked
        print(" Square [0,0] Clicked")
        position = (100, 100)
        message_display(letter, position)

    # Square [1,0]    
    elif toX(pos)<=400 and toX(pos)>200: # If the middle column is clicked
        print(" Column 1 Clicked")
        if toY(pos) <= 200:              # And then if the top Row is clicked
            print(" Row 0 Clicked")
            position = (300,100)
            message_display(letter, position)

    # Square [2,0]         
    elif toX(pos)<=600 and toX(pos)>400 and toY9pos) <= 200: # If the far right Column
        print(" Column 2 Clicked")
        if toY(pos) <= 200:              # And then if the top row is clicked
            print(" Row 0 Clicked")
            position = (500,100)
            message_display(letter, position)

    # Square [0,1]
    elif toX(pos)<=200: # If the far left column is clicked
        print(" Column 0 Clicked")
        if toY(pos) <= 400 and toY(pos) > 200: # And then if the middle Row is Clicked
            print(" Row 1 Clicked")
            position = (100,300)
            message_display(letter, position)

Выполните это, чтобы проверить логи c вашего кода, и исправьте ошибку, которую я идентифицировал ранее, чтобы вы хорошо написали свой тик- Та c -тое проект. Удачи и веселья!

1 голос
/ 25 марта 2020

Ваш Я обновил вашу функцию makeX, разделив определение координат x и y :

def makeX(pos):
    if toX(pos)<=200:
        pos_x = 100
    elif toX(pos) <= 400:
        pos_x = 300
    else:
        pos_x = 500
    if toY(pos)<=200:
        pos_y = 100
    elif toY(pos) <= 400:
        pos_y = 300
    else:
        pos_y = 500
    message_display(letter, (pos_x, pos_y))

Я свернул изменения, чтобы их было легче понять.

Имея логи c, вы обнаруживали только щелчки в первых четырех ячейках. Вы могли бы явно расширить логику c для оставшихся ячеек, но это слишком многократно и хрупко.

Как только вы довольны этим решением, вам нужно рассмотреть возможность отделения состояния платы от ваших функций рисования , так что вы можете проверить на победу и предотвратить перерисовку в той же позиции.

...