毎度おなじみのビンゴゲームだ。
一緒に作成していこう!
実行例
まずは実行例から。
最初に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がピッタリだ。
コメント