@riiiii12321

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

神経衰弱のプログラミング

import tkinter
import random

img = [None] * 27
card = [0] * 26
proc = 0
tmr = 0
sel1 = 0
sel2 = 0

for i in range(26):
card[i] = 0

def draw_card():
cvs.delete("all")
for i in range(26):
if card[i] == 1:
x = (i % 7) * 120 + 60
y = int(i / 7) * 168 + 84
cvs.create_image(x, y, image=img[i])
if card[i] == 0:
x = (i % 7) * 120 + 60
y = int(i / 7) * 168 + 84
cvs.create_image(x, y, image=img[26])

def click(e):
global proc, tmr, sel1, sel2
mx = int(e.x / 120)
my = int(e.y / 168)
if 0 <= mx <= 6 and 0 <= my <= 3:
g = mx + 7 * my
if g >= 26:
return
if card[g] == 0:
if proc == 1:
card[g] = 1
sel1 = g
proc = 2
elif proc == 2:
card[g] = 1
sel2 = g
proc = 3
tmr = 0

def main():
global proc, tmr
tmr += 1
draw_card()
if proc == 0:
proc = 1
if proc == 1:
cvs.create_text(780, 580, text="1枚目捲れ")
if proc == 2:
cvs.create_text(780, 580, text="2枚目剥れ")
if proc == 3:
if img[sel1] == img[sel2]:
card[sel1] = 2
card[sel2] = 2
else:
card[sel1] = 0
card[sel2] = 0
proc = 1
root.after(200, main)

root = tkinter.Tk()
root.title("dd")
root.bind("", click)
root.resizable(False, False)
cvs = tkinter.Canvas(width=960, height=672)
cvs.pack()

img[26] = tkinter.PhotoImage(file="card/0.png")
for i in range(26):
img[i] = tkinter.PhotoImage(file="card/" + str(1 + i % 13) + ".png")

main()

root.mainloop()
神経衰弱を作成しているのですが、60行目で画像ファイルが同じ場合にというプログラムを作りたいのですがなかなか動かないです。なぜめくった2枚の画像ファイルが同じなのにプログラムが実行されないのでしょうか





0 likes

2Answer

プログラムコードは、コードブロックを使って、読みやすくしてください。
特に、Pythonは、インデント命です。質問者さんは、このQ&Aのコードを見てなんとも思わないのですか?


追伸;

プログラムは、作った通りに動きます。思った通りに動きません。

1Like

コードが正しく表示されていないので推測になりますが「60行目」というのはif img[sel1] == img[sel2]:の部分なのだと思います。
おそらくtkinter.PhotoImage同士を比較しているのだと思いますが、オブジェクト同士の比較には注意が必要です。
例えば次の例を見てください。

class Person:
    def __init__(self, name):
        self.name = name

yamada1 = Person('山田太郎')
yamada2 = Person('山田太郎')
print(yamada1 == yamada2) # False
print(yamada1 == yamada1) # True

2つの変数はどちらも「名前が山田太郎のPersonオブジェクト」ですが、その比較はTrueになりません。
これは、通常オブジェクト同士の等価比較==は「同一であるかどうか」だからです。
2つの変数のメモリアドレスを見てみましょう。

print(id(yamada1)) # 22984305636400
print(id(yamada2)) # 22984305638656

このように、メモリアドレスは異なるのでコンピューター上は別のものとして存在します。
人間の感覚としては「名前が同じなので等しい」と感じるかもしれませんが、コンピューター上は同一ではないのでTrueになりません。

しかしこの挙動はカスタマイズする事ができます。ですのでオブジェクト同士の比較については、そのクラスの仕様を確認する必要があります。

このプログラムにおける解決方法ですが、単純な数値や文字列の配列を作って比較する方法が考えられます。文字列や数字は==での比較が意図されている挙動になると思います。検討されてはいかがでしょうか。

参考

等価比較 (== および !=) のデフォルトの振る舞いは、オブジェクトの同一性に基づいています。 従って、同一のインスタンスの等価比較の結果は等しいとなり、同一でないインスタンスの等価比較の結果は等しくないとなります。

0Like

Your answer might help someone💌