質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

Q&A

解決済

2回答

1167閲覧

python ローカル変数の定義

inari_sun

総合スコア3

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

0グッド

0クリップ

投稿2021/09/04 22:07

前提・実現したいこと

下のコードで関数main()が実行されているとき、count=0とopen_tileを実行する前にcountを定義できていると考えたのですが、

if count==0 and not (xpos==x_pos and ypos==y_pos): UnboundLocalError: local variable 'count' referenced before assignment

というエラーメッセージが表示されます。
間違っていることは確かなのですが、どこが間違っているか、どのように解決すべきなのかがわかりません。ご教授いただければ幸いです。

該当のソースコード

python

1import sys 2from math import floor(100.61->100) 3from random import randint 4import pygame 5from pygame.locals import QUIT , MOUSEBUTTONDOWN 6 7 8WIDTH=20 9HEIGHT=15 10SIZE=50 11NUM_OF_BOMBS=20 12EMPTY=0 13BOMB=1 14OPENED=2 15OPEN_COUNT=0 16CHECKED=[[0 for _ in range(WIDTH)]for _ in range(HEIGHT)] 17 18pygame.init() 19SURFACE=pygame.display.set_mode([WIDTH*SIZE,HEIGHT*SIZE]) 20FPSCLOCK=pygame.time.Clock() 21 22def num_of_bomb(field, x_pos , y_pos): 23 """周囲にある爆弾の数を返す""" 24 count=0 25 for yoffset in range(-1,2): 26 for xoffset in range(-1,2): 27 xpos,ypos=(x_pos + xoffset , y_pos + yoffset) 28 29 if 0 <= xpos < WIDTH and 0 <= ypos < HEIGHT and field[ypos][xpos]==BOMB: 30 count +=1 31 32 return count 33 34def open_tile(field,x_pos,y_pos): 35 """タイルをオープン""" 36 global OPEN_COUNT 37 if CHECKED[y_pos][x_pos]: 38 return 39 40 CHECKED[y_pos][x_pos]=True 41 42 for yoffset in range(-1,2): 43 for xoffset in range(-1,2): 44 xpos,ypos=(x_pos + xoffset , y_pos + yoffset) 45 if 0 <= xpos < WIDTH and 0 <= ypos < HEIGHT and field[ypos][xpos]==EMPTY: 46 field[ypos][xpos]=OPENED 47 OPEN_COUNT +=1 48 count = num_of_bomb(field,x_pos,y_pos) 49 50 if count==0 and not (xpos==x_pos and ypos==y_pos): 51 open_tile(field,xpos,ypos) 52 53def main(): 54 """main routine""" 55 smallfont=pygame.font.SysFont(None,36) 56 largefont=pygame.font.SysFont(None,72) 57 58 message_clear=largefont.render("!!CLEARED!!",True,(0,255,255)) 59 message_over=largefont.render("GAMEOVER!!",True,(0,255,255)) 60 message_rect=message_clear.get_rect() 61 message_rect.center=(WIDTH*SIZE/2,HEIGHT*SIZE/2) 62 63 game_over=False #False=0 64 65 field=[[EMPTY for xpos in range(WIDTH)] for ypos in range(HEIGHT)] 66 67 count=0 68 69 while count<NUM_OF_BOMBS: 70 xpos,ypos = randint(0,WIDTH-1),randint(0,HEIGHT-1) 71 72 if field[ypos][xpos]== EMPTY: 73 field[ypos][xpos]=BOMB 74 count+=1 75 76 while True: 77 for event in pygame.event.get(): 78 if event.type==QUIT: 79 pygame.quit() 80 sys.exit() 81 82 if event.type==MOUSEBUTTONDOWN and event.button==1: 83 xpos,ypos=floor(event.pos[0]/SIZE),floor(event.pos[1]/SIZE) 84 85 if field[ypos][xpos]==BOMB: 86 game_over=True 87 88 else: 89 open_tile(field,xpos,ypos) 90 91 92 SURFACE.fill((0,0,0)) 93 for ypos in range(HEIGHT): 94 for xpos in range(WIDTH): 95 tile=field[ypos][xpos] 96 rect=(xpos*SIZE,ypos*SIZE,SIZE,SIZE) 97 98 if tile==EMPTY or tile==BOMB: 99 pygame.draw.rect(SURFACE,(192,192,192),rect) 100 if game_over and tile==BOMB: 101 pygame.draw.ellipse(SURFACE,(225,225,0),rect) 102 elif tile==OPENED: 103 count=num_of_bomb(field,xpos,ypos) 104 if count > 0: 105 num_image=smallfont.render( 106 "{}".format(count),True,(255,255,0)) 107 SURFACE.blit(num_image,(xpos*SIZE+10,ypos*SIZE+10)) 108 109 110 for index in range(0,WIDTH*SIZE,SIZE): 111 pygame.draw.line(SURFACE,(96,96,96),(index,0),(index,HEIGHT*SIZE)) 112 for index in range(0,HEIGHT*SIZE,SIZE): 113 pygame.draw.line(SURFACE,(96,96,96),(0,index),(WIDTH*SIZE,index)) 114 115 #messadeの描写 116 if OPEN_COUNT==WIDTH*HEIGHT- NUM_OF_BOMBS: 117 SURFACE.blit(message_clear,message_rect.topleft) 118 119 elif game_over: 120 SURFACE.blit(message_over,message_rect.topleft) 121 122 pygame.display.update() 123 FPSCLOCK.tick(15) 124 125if __name__=='__main__': 126 main()

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

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

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

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

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

hoshi-takanori

2021/09/04 22:52

その if 文のインデントを見直すと良いかも。
inari_sun

2021/09/05 00:27

if分のインデントを一つ増やすとうまくいきました。ありがとうございました。
guest

回答2

0

ロジック追ってないですが、global countが抜けているということでは?

投稿2021/09/05 00:43

otn

総合スコア85901

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

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

0

ベストアンサー

そこの一つ前のif文が成立したときだけ、countが定義されます。
そうじゃないばあいは、そうじゃないってことですね

投稿2021/09/04 23:03

y_waiwai

総合スコア88042

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問