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

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

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

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

Q&A

解決済

1回答

1554閲覧

ビンゴゲームプログラムの内容

ts174cm

総合スコア3

Python

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

0グッド

0クリップ

投稿2021/10/04 02:14

前提・実現したいこと

これはビンゴゲームのプログラムです。
このプログラムの説明をしていく課題があるのですが
説明できる方いたらよろしくお願い致します。
すでに少し説明を各行にコメントしていますがもう少しわかりやすくお願いします。

発生している問題・エラーメッセージ

ないです

該当のソースコード

Python

1```import random 2# 乱数生成のためのパッケージ 3 4 5 6# ビンゴシートの作成 7def gen_sheet(): 8 9 10 11 # B,I,N,G,O列の範囲に合わせてリストの作成 12 # 1 ~ 15 13 # 16 ~ 30 14 # 31 ~ 45 15 # 46 ~ 60 16 # 61 ~ 75 17 samples = [[n + 1 for n in range(st , st + 15, 1)] for st in range(0,75, 15)] 18 19 20 21 # シートの作成 22 # samplesからランダムに5つずつ取り出して行に保存 23 # この時点では実際の縦横と逆 24 org = [random.sample(s, 5) for s in samples ] 25 26 27 28 # 縦横の入れ替え 29 # 処理のイメージ: 30 # 行ごとのリストを展開してB、I、N、G、Oの列の最初から1つずつ取り出していくイテレータをつくってそれをリストに変換 31 tmp = zip(*org) 32 res = list(map(list, zip(*org))) 33 return res 34 35 36 37 38# ビンゴシートの情報の取得と表示 39def show_sheet(sh, table): 40 41 42 43 """ 44 ビンゴシートの情報の表示 45 46 Parameters 47 ----------- 48 sh: sheetのintの二次配列 49 table: カードの数字が出ているか出ていないを保存する booleanの二次配列 50 51 CUIのカラーリングはStack Overflowのリンクを参照 52 https://stackoverflow.com/questions/61815855/is-it-possible-to-change-linux-terminal-text-and-background-color-using-c 53 54 """ 55 for i, r in enumerate(zip(sh, table)): 56 for j, n in enumerate(zip(r[0], r[1])): 57 if i == 2 and j == 2 : 58 print('\x1B[41m F\x1B[0m', end=' ') 59 elif n[1]: 60 print('\x1B[41m {:2}\x1B[0m'.format(n[0]), end=' ') 61 else: 62 print(' {:2}'.format(n[0]), end=' ') 63 print() 64def check(table, n): 65 66 67 68 # 横方向でTrueの個数のカウント 69 # 行方向で値がTrueなものでフィルターをかける → Trueじゃないものは取り除かれる 70 rows_count = [len(list(filter(lambda x : x, r))) for r in table] 71 72 73 74 # print(rows_count) 75 r = rows_count.count(n) 76 77 78 79 # 列方向でTrueの個数のカウント 80 # zipで縦横の変換して残りは行方向と同じ 81 cols_count = [len(list(filter(lambda x: x, c))) for c in list(map(list, zip(*(table.copy()))))] 82 c = cols_count.count(n) 83 84 85 86 # 斜め方向 87 # numpy使えないので愚直に実装 88 cross = 0 89 count_tmp = 0 90 for i in range(0, 5): 91 if table[i][i]: # Trueならcount_tmpを1増やす 92 count_tmp += 1 93 94 if count_tmp == n: # count_tmpがnと一緒のときcrossを1増やす 95 cross += 1 96 97 count_tmp = 0 98 for i in range(0,5): 99 if table[i][4-i]: # Trueならcount_tmpを1増やす 100 count_tmp += 1 101 if count_tmp == n: 102 cross += 1 103 104 return r+c+cross 105def show_info(sh, table): 106 107 bingo = check(table, 5) 108 reach = check(table, 4) 109 110 print("BINGO: ", bingo) 111 print("REACH: ", reach) 112 show_sheet(sh, table) 113 return bingo 114 115 116 117# ビンゴゲームの処理のメイン 118def main(): 119 120 121 122 sheet = gen_sheet() 123 table4check = [[False for _ in range(0, 5)] for _ in range(0, 5)] # 5 by 5 のBooleanの二次配列 124 table4check[2][2] = True # Freeの穴 125 choices = [a for a in range(1, 76)] # 1-75でリストの生成 126 count = 0 # 試行回数 127 bingo = 0 128 129 show_sheet(sheet, table4check) 130 print() 131 132 while len(choices) > 0 and bingo < 12: 133 ball = random.choice(choices) 134 count += 1 135 choices.remove(ball) 136 print('ball[{}] '.format(count), end='') 137 print(ball) 138 139 j = (ball - 1) // 15 # 各列が15の倍数で値が格納されるのでループを1つ減らすためインデックスの計算 140 for i in range(5): 141 if sheet[i][j] == ball: 142 table4check[i][j] = True 143 144 bingo = show_info(sheet, table4check) 145 print() 146main() 147 148### 試したこと 149 150ここに問題に対して試したことを記載してください。 151 152### 補足情報(FW/ツールのバージョンなど) 153 154ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

自己解決

あうにやはなまやはたま

投稿2021/10/07 08:15

ts174cm

総合スコア3

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.45%

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

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

質問する

関連した質問