pythonのpygameのコードエラーです。
マインスイーパー的なものを起動するコードですが下記エラーコードが出てしまい実行できません。
コードレビューと共に解決策のご教授を願いたいです。
エラーコード
Traceback (most recent call last):
File "/Users/〇〇/Desktop/minesweeper.py", line 120, in <module>
main()
File "/Users/〇〇/Desktop/minesweeper.py", line 99, in main
count=num_of_bomb(field,xpos.ypos)
AttributeError: 'int' object has no attribute 'ypos'
pygame
1import sys 2from math import floor 3from random import randint 4import pygame 5from pygame.locals import QUIT,MOUSEBUTTONDOWN 6 7WIDTH=20 8HEIGHT=15 9SIZE=50 10NUM_OF_BOMBS=20 11EMPTY=0 12BOMB=1 13OPENED=2 14OPEN_COUNT=0 15CHECKED=[[0 for _ in range(WIDTH)]for _ in range(HEIGHT)] 16 17pygame.init() 18SURFACE=pygame.display.set_mode([WIDTH*SIZE,HEIGHT*SIZE]) 19FPSCLOCK=pygame.time.Clock() 20 21def num_of_bomb(field,x_pos,y_pos): 22 """周囲にある爆弾の数を返す""" 23 count=0 24 for yoffset in range(-1,2): 25 for xoffset in range(-1,2): 26 xpos,ypos=(x_pos+xoffset,y_pos+yoffset) 27 if 0<=xpos<WIDTH and 0<=ypos<HEIGHT and\ 28 field[ypos][xpos]==BOMB: 29 count+=1 30 return count 31 32def open_tile(field,x_pos,y_pos): 33 """タイルをオープン""" 34 global OPEN_COUNT 35 if CHECKED[y_pos][x_pos]:#すでにチェック済みのタイル 36 return 37 38 CHECKED[y_pos][x_pos]=True 39 40 for yoffset in range(-1,2): 41 for xoffset in range(-1,2): 42 xpos,ypos=(x_pos+xoffset,y_pos+yoffset) 43 if 0<=xpos<WIDTH and 0<=ypos<HEIGHT and\ 44 field[ypos][xpos]==EMPTY: 45 field[ypos][xpos]=OPENED 46 OPEN_COUNT+=1 47 count=num_of_bomb(field,xpos,ypos) 48 if count==0 and\ 49 not(xpos==x_pos and ypos==y_pos): 50 open_tile(field,xpos,ypos) 51 52def main(): 53 """メインルーチン""" 54 smallfont=pygame.font.SysFont(None,36) 55 largefont=pygame.font.SysFont(None,72) 56 message_clear=largefont.render("!!CLEAERD!!",True,(0,255,225)) 57 message_over=largefont.render("!!GAME OVER!!",True,(0,255,225)) 58 message_rect=message_clear.get_rect() 59 message_rect.center=(WIDTH*SIZE/2,HEIGHT*SIZE/2) 60 game_over=False 61 62 field=[[EMPTY for xpos in range(WIDTH)] 63 for ypos in range(HEIGHT)] 64 65 #爆弾を設置 66 count=0 67 while count<NUM_OF_BOMBS: 68 xpos,ypos=randint(0,WIDTH-1),randint(0,HEIGHT-1) 69 if field[ypos][xpos]==EMPTY: 70 field[ypos][xpos]=BOMB 71 count+=1 72 73 while True: 74 for event in pygame.event.get(): 75 if event.type==QUIT: 76 pygame.quit() 77 sys.exit() 78 if event.type==MOUSEBUTTONDOWN and\ 79 event.button==1: 80 xpos,ypos=floor(event.pos[0]/SIZE),\ 81 floor(event.pos[1]/SIZE) 82 if field[ypos][xpos]==BOMB: 83 game_over=True 84 else: 85 open_tile(field,xpos,ypos) 86 #描画 87 SURFACE.fill((0,0,0)) 88 for ypos in range(HEIGHT): 89 for xpos in range(WIDTH): 90 tile=field[ypos][xpos] 91 rect=(xpos*SIZE,ypos*SIZE,SIZE,SIZE) 92 93 if tile==EMPTY or tile==BOMB: 94 pygame.draw.rect(SURFACE,(192,192,192),rect) 95 if game_over and tile==BOMB: 96 pygame.draw.ellipse(SURFACE,(225,225,0),rect) 97 elif tile==OPENED: 98 count=num_of_bomb(field,xpos.ypos) 99 if count>0: 100 num_image=smallfont.render("{}".format(count),True,(255,255,0)) 101 SURFACE.blit(num_image,(xpos*SIZE+10,ypos*SIZE+10)) 102 #線の描画 103 for index in range(0,WIDTH*SIZE,SIZE): 104 pygame.draw.line(SURFACE,(96,96,96),(index,0),(index,HEIGHT*SIZE)) 105 for index in range(0,HEIGHT*SIZE,SIZE): 106 pygame.draw.line(SURFACE,(96,96,96), 107 (0,index),(WIDTH*SIZE,index)) 108 109 #メッセージの描画 110 if OPEN_COUNT==WIDTH*HEIGHT-NUM_OF_BOMBS: 111 SURFACE.blit(message_clear,message_rect.topleft) 112 elif game_over: 113 SURFACE.blit(message_over,message_rect.topleft) 114 115 pygame.display.update() 116 FPSCLOCK.tick(15) 117 118if __name__=='__main__': 119 main() 120
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/08/28 08:19
2021/08/29 23:17 編集
2021/08/30 12:07