Python(Bingoゲーム)

python

毎度おなじみのビンゴゲームだ。
一緒に作成していこう!

実行例

まずは実行例から。
最初に200枚のコインを保有し、その範囲でBETする。
3✕3のビンゴテーブルが表示され、縦、横、ななめのラインが揃うと
揃ったライン ✕ 12 ✕ BET数
を獲得できる。(揃わなかった場合はbooと表示される)
BETの際に0を入力するか、残り枚数が0になってしまったらGame Overだ

実行例1

残り枚数:200
BET枚数を入力。0で終了 1-200>>10
[3, 4, 8]
[6, 8, 3]
[7, 5, 6]
boo
残り枚数:190
BET枚数を入力。0で終了 1-190>>10
[7, 3, 3]
[4, 2, 9]
[5, 2, 2]
boo
残り枚数:180
BET枚数を入力。0で終了 1-180>>10
[2, 3, 6]
[3, 8, 6]
[7, 3, 7]
boo
残り枚数:170
BET枚数を入力。0で終了 1-170>>10
[7, 1, 2]
[7, 3, 0]
[3, 8, 1]
boo
残り枚数:160
BET枚数を入力。0で終了 1-160>>10
[2, 8, 6]
[7, 2, 6]
[2, 3, 6]
1 LINE BINGO!!win:120
残り枚数:270
BET枚数を入力。0で終了 1-270>>0
Game Over

実行例2

以下のように残り枚数を超えるBET数を入力した場合はメッセージと共に再入力となる。残り枚数が0になったら終了する。

残り枚数:200
BET枚数を入力。0で終了 1-200>>1000
コインが不足しています
残り枚数:200
BET枚数を入力。0で終了 1-200>>200
[8, 8, 1]
[7, 8, 5]
[5, 4, 3]
boo
コインがなくなりました
Game Over

作成の前に

ビンゴゲームの作成に入る前に外堀から埋めていこう。
○内包表記
今回は2次元リストを使うのでその際に内包表記による生成を行う。これがわからない人はこちらでまず確認してもらいたい。

それができたらまずは以下ができるかやってみよう。

3行3列の表を作成し、その表を0-9のランダムの数字で埋める

実行例

[8, 8, 1]
[7, 8, 5]
[5, 4, 3]

作例

内包表記を使い3行3列のリストをつくり、for文で出力している。最初はぎょっとする内包表記だがなれるとやみつきになる、Pythonやるなら使わない手はない。

import random
table=[[random.randint(0,9) for j in range(3)] for i in range(3)]
for row in table:
	print(row)

縦と横を入れ替えた表を作成する。(行列の転置)

以下のように縦と横を入れ替えたリストを新規に作成する処理を作成してみよう。

[8, 8, 1]
[7, 8, 5]
[5, 4, 3]
から
[8, 7, 5]
[8, 8, 4]
[1, 5, 3]
をつくる

作例

この処理もたまに出てくる。iとjを入れ替えるだけなので一度知ってしまえば簡単。プログラミングにありがちな「知ってるか、知らない」かだ。

import random
table=[
	[8,8,1],
	[7,8,5],
	[5,4,3],
]
vertical=[[table[j][i] for j in range(3)] for i in range(3)]

for row in vertical:
	print(row)

ななめのラインの抽出

これは今回に限っての場合の処理となるがビンゴゲームには必要なので考えてみよう。

[8, 8, 1]
[7, 8, 5]
[5, 4, 3]
から
[8, 8, 3]
[1, 8, 5]
をつくる

解答例

場合の処理なので試行錯誤する部分だが、以下の処理で求める結果が得られる

import random
table=[
	[8,8,1],
	[7,8,5],
	[5,4,3],
]
cross=[[table[j][j] if i==0 else table[j][2-j] for j in range(3)] for i in range(2)]
for row in cross:
	print(row)

作例

さきほどの処理ができればこのビンゴお題はほぼ終わりだ。実際に作成していこう。bingo.pyというファイルを作成し以下のように作成していく

関数

まずは必要な処理を関数に括りだそう。

○3✕3の表を作成し表示する関数の作成と確認

import random
table=[]

def createTable():
	global table
	table=[[random.randint(0,9) for j in range(3)] for i in range(3)]
	for row in table:
		print(row)

createTable()

今回最初に作成するテーブルは使い回すのでグローバルに定義した。以下のように表示されれば成功だ。(数字は毎回異なる)

ビンゴラインのカウント

今回の核となる部分の処理を以下のように追記する。

import random
table=[]

def createTable():
	global table
	table=[[random.randint(0,9) for j in range(3)] for i in range(3)]
	for row in table:
		print(row)

createTable()

def countBingoLine():
	global table
	vertical=[[table[j][i] for j in range(3)] for i in range(3)]
	cross=[[table[j][j] if i==0 else table[j][2-j] for j in range(3)] for i in range(2)]
	bingo_line=0
	for row in table+vertical+cross:
		if len(set(row))==1:
				bingo_line+=1
	return bingo_line

print(countBingoLine()) 

もともとのテーブルをもとに上で行った転置とクロスの行列をつくり、それを足し算で結合して、そのラインの数字が1種類なのかでビンゴ判定をしている。
何度か繰り返し実行してみよう。ラインが揃ったときに揃ったライン数が表示されていればOKだ

実行例にあわせて処理を作成していく

メインのロジックは作成できた。あとは実行例にあわせて処理を作成していくだけだ。以下のハイライト部分のように修正する

import random
COINS=200
table=[]

def createTable():
	global table
	table=[[random.randint(0,9) for j in range(3)] for i in range(3)]
	for row in table:
		print(row)

#createTable()

def countBingoLine():
	global table
	vertical=[[table[j][i] for j in range(3)] for i in range(3)]
	cross=[[table[j][j] if i==0 else table[j][2-j] for j in range(3)] for i in range(2)]
	bingo_line=0
	for row in table+vertical+cross:
		if len(set(row))==1:
				bingo_line+=1
	return bingo_line

#print(countBingoLine()) 
while True:
	print(f'残り枚数:{COINS}')
	bet=int(input(f'BET枚数を入力。0で終了 1-{COINS}>>'))
	if bet==0:
		break
	if bet > COINS:
		print('コインが不足しています')
		continue
	
	COINS -= bet
	createTable()
	bingo_line=countBingoLine()
	if bingo_line>0:
		get_coin=bingo_line*12*bet
		COINS+=get_coin
		print(f'{bingo_line} LINE BINGO!!win:{get_coin}')
	else:
		print('boo')
	
	if COINS==0:
		print('コインがなくなりました')
		break
print('Game Over')

リファクタリング

最後にもうひと手間加えよう。実は上記のソースコードは3 ✕ 3だけでなく5 ✕ 5などの任意の大きさで実行できる。上部にTWという変数を用意してそこで大きさを管理するようにする。

import random
COINS=200
TW=3;
table=[]

def createTable():
	global table
	table=[[random.randint(0,9) for j in range(TW)] for i in range(TW)]
	for row in table:
		print(row)

def countBingoLine():
	global table
	vertical=[[table[j][i] for j in range(TW)] for i in range(TW)]
	cross=[[table[j][j] if i==0 else table[j][TW-1-j] for j in range(TW)] for i in range(2)]
	bingo_line=0
	for row in table+vertical+cross:
		if len(set(row))==1:
				bingo_line+=1
	return bingo_line

while True:
	print(f'残り枚数:{COINS}')
	bet=int(input(f'BET枚数を入力。0で終了 1-{COINS}>>'))
	if bet==0:
		break
	if bet > COINS:
		print('コインが不足しています')
		continue
	
	COINS -= bet
	createTable()
	bingo_line=countBingoLine()
	if bingo_line>0:
		get_coin=bingo_line*12*bet
		COINS+=get_coin
		print(f'{bingo_line} LINE BINGO!!win:{get_coin}')
	else:
		print('boo')
	
	if COINS==0:
		print('コインがなくなりました')
		break
print('Game Over')

完成!

以上でビンゴゲームの完成だ。このくらい小規模なアプリ作成には簡潔に記述できるPythonがピッタリだ。

python
スポンサーリンク
シェアする
mjpurinをフォローする

コメント

タイトルとURLをコピーしました