amagoのエンジニアブログ

IT関連のネタを中心に記事を書いてます。

【Flask入門】Python初心者がマインスイーパーを作ってみる⑥ ~ランダムに爆弾を配置する〜

こんにちは、Amagoです。

進捗があったのでブログを書きます。

前回まで

前回は、爆弾と数字のレイアウトの設定をおこないました。
見ていないかたは、こちらからお願いします。
hamaguchi-amago.hatenablog.com


今回はランダムに爆弾を設定する関数を作ってみました。

Pythonの修正

pythonファイルの修正はこんな感じです。後程修正箇所を記述します。
セルの作成用の関数はファイルを分けようかなと思いましたが、マインスイーパーのアプリケーション自体大きくないのでまとめて記述してあります。

[Minesweeper.py]

from flask import Flask, render_template
import random

def create_cell():
	BOMB_NUMBER = 10
	cell =  [['' for i in range(9)] for j in range(9)]
	
	# 爆弾をランダムに配置
	index = 0
	while index < BOMB_NUMBER:
		row = random.randint(0, 8)
		col = random.randint(0, 8)
		value = cell[row][col]
		if	value != 'B':
			cell[row][col] = 'B'
			index += 1
	return cell

app = Flask(__name__)

@app.route("/")
def hello():
	cell = create_cell()
	return render_template("index.html", cell = cell)

if __name__ == "__main__":
	app.run( debug = True )
関数を作る

今まではcell変数に二次元配列を直接設定してましたが、create_cell関数を作成しました。関数について細かく見ていきます。

def create_cell():
	BOMB_NUMBER = 10
	cell =  [['' for i in range(9)] for j in range(9)]
	
	# 爆弾をランダムに配置
	index = 0
	while index < BOMB_NUMBER:
		row = random.randint(0, 8)
		col = random.randint(0, 8)
		value = cell[row][col]
		if	value != 'B':
			cell[row][col] = 'B'
			index += 1
	return cell

①cellの生成
 まず、cell変数に二次元配列を格納します。内側のforで文字列の配列を9個作っています。行にあたる部分ですね。そして、外側のforで列を作ります。この時点では、なにも値を設定していないので、すべて空文字が設定されています。

②爆弾を10回設置するまでループ
 while文でindexが10より大きくなるまでループさせています。爆弾を設置するときにindexを加算してあげます。

③行と列にランダムな値を設定する
 randint関数はrandomライブラリをインポートして使います。下の記述では0から8のランダムの値を生成しています。

④爆弾を設定するか判定する
 if文の前の行でランダムに選択したセルの値を取得します。そして、セルの値がB以外か判定します。

もし、B以外の場合はランダムに選択したセルに爆弾を定義する値の"B"を設定し、indexの値を1追加します。
Bの場合は次のループでもう一度ランダムにセルを選択して判定を行います。

やがて、10回爆弾を設定し終えるとループから抜けて、呼び出し元に爆弾を設定した二次元配列を渡します。

実行結果・次回目標

実行結果はこんな感じです。
ランダムに爆弾が設定されるようになりました。
f:id:hamaguchi_amago:20190525162919g:plain

次回は、爆弾の周りの数字を設定する処理について書いていこうかと思います。
最後まで読んでくださって、ありがとうございました。