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

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

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

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

解決済

『python 初心者』pythonでマインスイーパーを作成しています。リストの範囲の外を指定しないようにしたいです。

Yutaro
Yutaro

総合スコア1

Python

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

2回答

-1評価

0クリップ

369閲覧

投稿2022/05/09 08:14

編集2022/05/11 14:05

20*20 のマインスイーパーを作成しているのですが、
①周辺マス(8マス)が空白であることを判定する再帰処理で、20*20のリストの範囲外を判定してしまった時に”index 20 is out of bounds for axis 0 with size 20”とエラーが起きる。
②爆弾が置いてあるマスの周り8マスに爆弾の数を表示する処理で、下1行と右一列に数字が表示されないバグが起きてしまいます。

リストの範囲外を判定しないようにするにはどうしたら良いのでしょうか?

ご教示いただければ幸いです。

以下がコードとなっています。
(1部抜粋しております)

python

import tkinter as tk import math import random from tkinter import messagebox import numpy as np canvas = None #ボードの情報を格納するリスト cells = np.array([[0 for i in range(20)]for j in range(20)]) #ますが開いてるかを判定するリスト open_cells = np.array([[0 for i in range(20)]for j in range(20)]) bomb_count = 0 open_count = 0 BOM = 20 SQUARE_LENGTH = 30 RADIUS = SQUARE_LENGTH / 2 - 5 POSITION = {"x": 8, "y": 8} BORDER_WIDTH = 2 NUMBER = 20 LENGTH = SQUARE_LENGTH * NUMBER + BORDER_WIDTH * NUMBER CELL_DIFF_NUMBERS = [ [-1, -1], [0, -1], [1, -1], [-1, 0], [1, 0], [-1, 1], [0, 1], [1, 1] ] def set_field(): canvas.create_rectangle(POSITION["x"], POSITION["y"], LENGTH + POSITION["x"], LENGTH + POSITION["y"], tag="rect_1", fill="darkgray", width=BORDER_WIDTH) for i in range(NUMBER - 1): x = POSITION["x"] + SQUARE_LENGTH * (i + 1) + BORDER_WIDTH * i + BORDER_WIDTH y = POSITION["y"] + SQUARE_LENGTH * (i + 1) + BORDER_WIDTH * i + BORDER_WIDTH canvas.create_line(x, POSITION["y"], x, LENGTH + POSITION["y"], width=BORDER_WIDTH) canvas.create_line(POSITION["x"], y, LENGTH + POSITION["x"], y, width=BORDER_WIDTH) def set_bomb(): global bomb_count while bomb_count < BOM: x = random.randint(0, NUMBER - 1) y = random.randint(0, NUMBER - 1) if cells[y][x] == 0: cells[y][x] = -1 set_item("bom", x, y) bomb_count += 1 def count_cell(): for x in range(NUMBER - 1): for y in range(NUMBER - 1): if cells[y][x] == -1: continue count = 0 for arround_x in range(-1,2): for arround_y in range(-1,2): if cells[y + arround_y][x + arround_x] == -1: count += 1 cells[y][x] = count set_item(count, x, y) def set_item(kind, x, y): center_x = POSITION["x"] + BORDER_WIDTH * x + BORDER_WIDTH / 2 + SQUARE_LENGTH * x + SQUARE_LENGTH / 2 center_y = POSITION["y"] + BORDER_WIDTH * y + BORDER_WIDTH / 2 + SQUARE_LENGTH * y + SQUARE_LENGTH / 2 canvas.create_rectangle(center_x - SQUARE_LENGTH / 2, center_y - SQUARE_LENGTH / 2, center_x + SQUARE_LENGTH / 2, center_y + SQUARE_LENGTH / 2,tag="none", fill="white", width=0) if kind != None: if kind == "bom": canvas.create_rectangle(center_x - SQUARE_LENGTH / 2, center_y - SQUARE_LENGTH / 2, center_x + SQUARE_LENGTH / 2, center_y + SQUARE_LENGTH / 2, fill="pink", width=0, tag="mine") canvas.create_oval(center_x - RADIUS, center_y - RADIUS, center_x + RADIUS, center_y + RADIUS, fill="red", width=0, tag="mine") elif kind == "F": canvas.create_rectangle(center_x - SQUARE_LENGTH / 2, center_y - SQUARE_LENGTH / 2, center_x + SQUARE_LENGTH / 2, center_y + SQUARE_LENGTH / 2, tag="flag", fill="lightgray", width=0) canvas.create_text(center_x, center_y, text=kind, justify="center", font=("F", 25), tag="flag", fill="red") elif kind == "B": canvas.create_rectangle(center_x - SQUARE_LENGTH / 2, center_y - SQUARE_LENGTH / 2, center_x + SQUARE_LENGTH / 2, center_y + SQUARE_LENGTH / 2, tag="flag", fill="darkgray", width=0) else: canvas.create_rectangle(center_x - SQUARE_LENGTH / 2, center_y - SQUARE_LENGTH / 2, center_x + SQUARE_LENGTH / 2, center_y + SQUARE_LENGTH / 2,tag="count_text", fill="cyan", width=0) canvas.create_text(center_x, center_y, text=kind, justify="center", font=("", 25),tag="count_text") def point_to_numbers(event_x, event_y): x = math.floor((event_x - POSITION["x"]) / (SQUARE_LENGTH + BORDER_WIDTH)) y = math.floor((event_y - POSITION["y"]) / (SQUARE_LENGTH + BORDER_WIDTH)) return x, y def create_canvas(): root = tk.Tk() root.geometry(f"""{LENGTH + POSITION["x"] * 2}x{LENGTH + POSITION["y"] * 2}""") root.title("マインスイーパー") canvas = tk.Canvas(root,relief=tk.RAISED, width=(LENGTH + POSITION["x"]), height=(LENGTH + POSITION["y"])) canvas.place(x=0, y=0) return root, canvas def game_over(): canvas.itemconfig("rect_1", fill="") canvas.itemconfig("none", fill="") canvas.delete("flag") messagebox.showerror("game_over", "爆弾をクリックしてしまった。。") def game_clear(): if cells.size - bomb_count == open_count: canvas.itemconfig("rect_1", fill="") canvas.itemconfig("none", fill="") canvas.delete("flag") messagebox.showinfo("game clear!", "ゲームをクリアしました!") def click(event): x, y = point_to_numbers(event.x, event.y) open_cell(x, y) open_number(x, y) game_clear() def open_cell(x, y): global open_count if open_cells[y][x] != 1: if cells[y][x] == 0: set_item(None, x, y) open_cells[y][x] = 1 open_count += 1 for cell_diff_number in CELL_DIFF_NUMBERS: diff = cell_diff_number if y >= 0 and y < NUMBER and x >= 0 and x < NUMBER: if cells[y + diff[1]][x + diff[0]] == 0: item = None open_cell(x + diff[0], y + diff[1]) else: item = cells[y + diff[1]][x + diff[0]] set_item(item, x + diff[0], y + diff[1]) if open_cells[y + diff[1]][x + diff[0]] != 1: open_count += 1 open_cells[y + diff[1]][x + diff[0]] = 1 def open_number(x, y): global open_count if open_cells[y][x] != 1: if cells[y][x] == -1: game_over() else: set_item(cells[y][x], x, y) open_cells[y][x] = 1 open_count += 1 def flag(event): x,y = point_to_numbers(event.x, event.y) if open_cells[y][x] == 0: set_item("F", x, y) open_cells[y][x] = -1 elif open_cells[y][x] == -1: set_item("B", x, y) open_cells[y][x] = 0 def play(): global canvas root, canvas = create_canvas() set_bomb() count_cell() set_field() canvas.bind("<Button-1>", lambda event: click(event)) canvas.bind("<Button-2>", lambda event: flag(event)) root.mainloop() play()

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Python

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