質問するログイン新規登録
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

540閲覧

神経衰弱のようなゲームのプログラミング

riii12321

総合スコア1

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2024/02/10 07:36

0

0

実現したいこと

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("<Button-1>", 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()
今プログラミングを始めたものなのですが、神経衰弱のようなアプリを参考本を読みながらつくっているのですが2枚の画像ファイルが同じだったらcard[]の値を2にしてその2枚を描かないようにして消すというプログラムが働いてくれないです。何日も考えchatgptにも聞いているのですが、解決しませんでした、なぜ動かないのか教えて欲しいです。

ここに実現したいことを箇条書きで書いてください。

  • ▲▲機能を動作するようにする

前提

pythonで作っています。
ここに質問の内容を詳しく書いてください。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

ソースコード

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2024/02/10 09:13 編集

コードは「コードの挿入」で記入しましょう。現状とてもコードが読みにくいので回答がつきずらくなるかと思います。
meg_

2024/02/10 08:25

> 参考本を読みながら 書名は何でしょうか? > 何日も考えchatgptにも聞いているのですが 上記の具体的なことを「試したこと」欄に書きましょう。
riii12321

2024/02/10 08:28

pythonで作って学べるアルゴリズム入門です
guest

回答1

0

ベストアンサー

Windows 11、Python 3.12.1で確認しました。ソースのインデントは想像です。

if img[sel1] == img[sel2]:ですが、tkinter.PhotoImageの戻り値は画像ファイルが同じでも異なるオブジェクトになるので、この比較は成立しません。
なので、別途ファイル名を持つ配列を設定して比較するようにしました。

現状、同じ画像ファイルならカードを消す処理は出来ています。残りは

  • カードをランダムにならべる
  • カードを全部消した後の処理
    を追加すると、神経衰弱ゲームになります。がんばってください!
import tkinter import random img = [None] * 27 card = [0] * 26 proc = 0 tmr = 0 sel1 = 0 sel2 = 0 # 1行追加 # 画像ファイル名を持つ配列 imgf = [None] * 26 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: # 1行変更 # 画像ファイル名で比較 if imgf[sel1] == imgf[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("<Button-1>", 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") # 1行追加 # 画像ファイル名 imgf[i] = str(1 + i % 13) + ".png" main() root.mainloop()

投稿2024/02/10 12:45

編集2024/02/10 14:58
hiroki-o

総合スコア1467

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問