2016-08-22 2 views
-2

Я работаю над карточной игрой. Дело в том, что когда пользователь нажимает на две карты, они поворачиваются лицом вверх. Если они не совпадают, когда они нажимают на третий, первые два исчезают (это еще не реализовано).Почему эта переменная не обновляется

Я пытаюсь использовать для переменных: first_card и second_card следить за картами, которые были щелкнули. Я также использую список «выставлен», чтобы изменить значения от False до True, когда пользователь нажимает на карту.

Проблема в том, что список обновляется, но переменные не обновляются. Я имею в виду, когда я нажимаю на вторую карту, first_card имеет значение Нет, значение которого я инициализировал переменной. Почему это происходит?

Во всяком случае, вот код (он не будет работать, если вы запустите его в CodeSkulptor): http://www.codeskulptor.org/#user41_RwBwWy2tSI_2.py

# implementation of card game - Memory 

import simplegui 
import random 

deck = range(0, 8)* 2 
exposed = [False] * len(deck) 
print exposed 
w = 50 
h = 100 
WIDTH = w * 16 + 2 
HEIGHT = 102 
first_card = 0 
second_card = 0 

# helper function to initialize globals 
def new_game(): 
    global exposed, state 
    random.shuffle(deck) 
    exposed = [False] * len(deck) 
    state = 0 
    print deck 
    print exposed 


# define event handlers 
def mouseclick(pos): 
    global state, exposed, first_card, second_card 
    first_card = None 
    second_card = None 

    position = pos[0] // 50 
    for index in range(len(deck)): 
     if position == index and exposed[index] != True: 
      if state == 0: 
       #exposed = [False] * len(deck) 
       exposed[position] = True 
       first_card = position 
       state = 1 
      elif state == 1: 
       #exposed = [False] * len(deck) 
       exposed[index] = True 
       second_card = index 
       state = 2 
      elif state == 2: 
       #exposed = [False] * len(deck) 
       exposed[index] = True 
       second_card = first_card 
       first_card = index 
       state = 1 

    print state 
    print "first card", first_card 
    print "second card", second_card 
    print exposed 

# cards are logically 50x100 pixels in size  
def draw(canvas): 
    line = 1 
    x = 1 
    y = 1 
    for i in range(len(deck)): 
     if exposed[i] == True: 
      canvas.draw_text(str(deck[i]), [(0.3* w) + w * i, (y + h) * 0.66], 40, "Black") 
     else: 
      canvas.draw_polygon([[x, y], [x + w, y], [x + w, y + h], [x, y + h]], line, "White", '#55aa55') 
     x += w 



# create frame and add a button and labels 
frame = simplegui.create_frame("Memory", WIDTH, HEIGHT) 
frame.add_button("Reset", new_game) 
label = frame.add_label("Turns = ") 
frame.set_canvas_background("White") 
# register event handlers 
frame.set_mouseclick_handler(mouseclick) 
frame.set_draw_handler(draw) 

# get things rolling 
new_game() 
frame.start() 
+0

Потому что вы всегда устанавливаете их в None в начале функции mouseclick, конечно. –

+0

* «это не сработает, если вы не запустите его в CodeSkulptor» * - почему бы и нет? Можете ли вы сделать [mcve], что делает? – jonrsharpe

+0

Вам не нужен libgui lib, этот код так легко отлаживать его мучительный emabarassing, вы, ребята, его ниспровергаете, просто добавьте некоторое значение случайного кортежа в метод mouseclick и помогите ему – lapinkoira

ответ

0

Вам нужно определить глобальную переменную состояния, что код происходит сбой и, возможно, оно не обновление значение first_card

import random 

state = 0 
deck = range(0, 8)* 2 
exposed = [False] * len(deck) 
print exposed 
w = 50 
h = 100 
WIDTH = w * 16 + 2 
HEIGHT = 102 
first_card = 0 
second_card = 0 
0

Прежде всего, это не так ваше заявление it won't work unless you run it in CodeSkulptor, вы можете найти simplegui на пип и каждый может запустить свой код без использования CodeSkulptor. Мне интересно, в чем причина получения downvotes, так что не надоедайте их.

Теперь о вашей ошибке ... Давайте подумаем о логике mouseclick, давайте предположим, что first_card и second_card являются скрытыми (value = -1) в начале игры. И давайте думать о логике простой игры, где есть 2 возможные состояния:

  • State0, обе карты скрыть: Если нажать на карте вы подвергаете CARD1
  • State1, когда первая карта подвергается: При нажатии кнопки на карточке вам нужно проверить, равна ли эта новая открытая карта первой карточке, если это так, игрок догадался, что вам нужно вернуться в состояние 0 и сохранить открытую обе карты. Если нет, игрок пропустил, поэтому вам не следует выставлять карту2 и скрывать карту1. В этом состоянии вы также можете записать, сколько попыток попытался игрок.

Вы никогда назначая None first_card = None и second_card = None снова и снова, и это не правильно.

Попробуйте сделать еще один снимок, следуя этим подсказкам, и если вы все еще боретесь, я опубликую вам возможное решение.

Смежные вопросы