前提・実現したいこと
下のコードで関数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()
回答2件
あなたの回答
tips
プレビュー