2016-08-22 9 views
-2

私はカードゲームに取り組んでいます。ポイントは、ユーザーが2枚のカードをクリックすると、カードが上になることです。それらが同じでない場合、3番目のものをクリックすると、最初の2つが消えます(これはまだ実装されていません)。この変数が更新されないのはなぜですか

私は変数に使用しようとしている:first_cardとsecond_cardをクリックされているカードを追跡します。また、ユーザーがカードをクリックしたときに「公開」の値をFalseからTrueに変更するリストを使用しています。

問題は、リストが更新されるが、変数が更新されないということです。つまり、2番目のカードをクリックすると、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

mouseclick関数の先頭には、必ずNoneに設定されているので、確かに。 –

+0

* "CodeSkulptorで実行しない限り動作しません" * - なぜですか?あなたはそうすることができますか? – jonrsharpe

+0

あなたは単純なGUIライブラリを必要としません。そのコードは、あなたが彼にdownvotingされている痛みのあるemabarassingをデバッグするのは簡単ですmouseclickメソッドにいくつかのランダムなタプルのpos値を追加し、彼を助けてください – 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

まず第一に、それはあなたがピップと皆にsimpleguiがCodeSkulptorを使用せずに、あなたのコードを実行することができます見つけることができ、it won't work unless you run it in CodeSkulptorのあなたの声明本当ではありません。私はダウンボトムを得る理由が何であるか疑問に思っています。だから気にしないでください。

今、あなたのバグについて...マウスのロジックについて考えてみましょう。最初のカードとsecond_cardが両方ともゲームの始めにhide(値= -1)であるとしましょう。そして、の2つの可能性のある状態がある場合、単純なゲームのロジックについて考えてみましょう:

  • STATE0は、両方のカードを隠す:あなたがクリックした場合:あなたはカードをクリックした場合は、最初のカードが露出しているカード1
  • 状態1を公開この新しい公開されたカードが最初のカードと等しいかどうかをチェックする必要があります。もしそうなら、プレイヤーはあなたがstate0に戻り、両方のカードを公開しておくべきだと推測しました。そうでなければ、プレイヤーは見逃しているので、カード2を公開せず、カード1を隠すべきではありません。この状態では、プレイヤーが試した試行回数を記録することもできます。

なしfirst_card = Noneとを割り当てていますが、これは正しくありません。

これらのヒントに沿ってもう一度試してみてください。まだ苦労している場合は、解決策を投稿します。

関連する問題