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

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

新規登録して質問してみよう
ただいま回答率
85.37%
Pygame

Pygameは、ビデオゲームの製作用に設計されたクロスプラットフォームのPythonモジュールセットです。Pythonでコンピューターグラフィックスと音声を扱うためのライブラリが含まれています。

コードレビュー

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

Python

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

Q&A

解決済

1回答

1309閲覧

マインスイーパーを起動するためのpygameのエラーコードが治らない

kekekun

総合スコア7

Pygame

Pygameは、ビデオゲームの製作用に設計されたクロスプラットフォームのPythonモジュールセットです。Pythonでコンピューターグラフィックスと音声を扱うためのライブラリが含まれています。

コードレビュー

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

Python

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

0グッド

0クリップ

投稿2021/08/28 03:27

編集2021/08/28 08:20

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

関数num_of_bombは、def num_of_bomb(field,x_pos,y_pos):と定義されているので、関数mainで呼び出している箇所、

diff

1 elif tile==OPENED: 2- count=num_of_bomb(field,xpos.ypos) 3+ count=num_of_bomb(field,xpos,ypos) 4 if count>0:

を訂正。

追加分:
次に、この関数num_of_bombのreturnの位置がおかしい。内側のfor文の中に書いてあるので、繰り返し処理の最初の1回目で関数から抜けてしまう。外側のfor文と同じインデントに修正する。

diff

1- return count 2+ return count

以下は質問が修正されたので不問:
ところで、提示されているコードでは関数mainを呼び出していませんが、本当は

Python

1if __name__ == "__main__": 2 main()

みたいなの(あるいは単にmain()だけ)が末尾あたりに書いてあったりしませんか。

投稿2021/08/28 03:40

編集2021/08/28 21:30
Daregada

総合スコア11990

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

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

kekekun

2021/08/28 08:19

ありがとうございます。 ご指摘の通り末尾には if __name__ == "__main__": main() というコードがございます。 また、上記修正点を修正したのですが、CLEARした状態で起動してしまう(ゲームの初期化ができていないのですが、どの部分が問題かを教えていただけると幸いです。
Daregada

2021/08/29 23:17 編集

回答に問題となる部分の修正方法を追加しました。
kekekun

2021/08/30 12:07

こちらでできました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問