LoginSignup
10
7

More than 5 years have passed since last update.

アタック25を再現してみた【Python3】

Last updated at Posted at 2018-10-13

新入生歓迎会の企画で,アタック25(早押しクイズ)をやることになったため,そこそこハイクオリティなアタック25プログラムを作成しました.(下の画像は実際に動作している様子)
IMG_1595.JPG

アタック25パネル管理システム【GitHub】
ss.gif

実行環境

  • Python3が動作するPC5台(メインPC1台+枚数表示用PC4台)
  • ルータ
  • Python 3.7.0

必要なパッケージ(for BGM)

メインPC,獲得枚数表示用PC共に音声出力にはpygameを用いている.
pip install pygame

注意事項

このプログラムは4台のPCのIPアドレスを固定し,メインPCからルーターを経由し,獲得枚数が変化するたびにソケット通信で枚数を送信することで,リアルタイムに獲得枚数を管理しています.
そのため,PCのIPアドレスと実行するプログラムの対応に注意する必要あり.以下が対応表です.

デバイス ルータ メインPC 赤PC 緑PC 白PC 青PC
IPアドレス 192.168.0.1 192.168.0.2 192.168.0.3 192.168.0.4 192.168.0.5 192.168.0.6
実行プログラム名 main.py sub.py sub.py sub.py sub.py

IPアドレスは適宜自分の環境に合わせて変更してください.その際にソースのアドレスも変更してください.
通信機能が不要で,手軽に実行したい人のために,デフォルトでは通信は行わないようになっているため,はじめはmain.pyだけで動作します.通信も行いたい人はGitHubのREADME.mdの通りソースコード内のコメントを変更してください.

やりたいこと

  1. アタック25のパネルを管理する
  2. 各色の現在の獲得枚数をリアルタイムで表示
  3. アタックチャンス(別の回答者が任意のパネルを再度獲得できるようにするチャンス)
  4. 2.とは別に色ごとに計4台のモニターで獲得枚数を表示
  5. 4台のPCのEnterキーを押すと効果音がなり,ディスプレイを各チームの色で塗りつぶす
  6. パネルを獲得した際に,効果音を鳴らす
  7. 各色ごとに取れるパネルを点滅させる(サジェスト機能)
  8. 獲得枚数が最多の解答者が海外旅行を賭けた最終問題に挑戦

main.py

GitHubにて類似プログラムを発見.

アタック25アプリ【GitHub】

やりたいことの1〜3までは実現されていたため,このコードをベースにして作成することにしました.
しかし,このコード,実行してみるとパネルを左下から右上に2枚のパネルを挟むとパネルの色が変化しないというバグを発見したため,実際にはパネルの色変更を行うプログラムも書き換えました.

色ごとに計4台のモニターで獲得枚数を表示

これに関してはGPUを使えば1台のPCだけで実現可能かもしれないが,空きのGPUがなかったため,PCを4台用意し,メインPCから4台のPCへ各色の枚数をそれぞれ送信し,それを各PCで表示するという方法をとりました.Pythonにはsocketというパッケージがあるため比較的簡単に実装することができました.

効果音を鳴らす

効果音は,ゲーム開発用のパッケージpygameを用いることで,音声の再生・停止などを実装しました.

各色ごとに取れるパネルを点滅させる(サジェスト機能)

サジェスト機能は,以下の(おそらく競プロ用の)記事を参考に実装しました.

CodeIQ挑戦の記録:今週のアルゴリズム:第86回アタック25に挑戦!

記事通りでは,言語がRubyであったのと,アタックチャンス時の例外処理がされていなかったため,追加で記述する必要がありました.また再帰で実装されていたが,個人的に再帰の実装が苦手なので,再帰を用いずに書いたため,コードが汚くなってしまいました.

sub.py

4台のPCのIPアドレスを取得し,そのアドレスが,
192.168.0.3 => 赤の枚数を表示
192.168.0.4 => 緑の枚数を表示
192.168.0.5 => 白の枚数を表示
192.168.0.6 => 青の枚数を表示
となるように実装しているため,違うIPアドレスを使う場合は,適宜ソースコード変更してください.

film_quiz.py

アタック25を再現するのには欠かせない最終問題.このプログラムは,
1. 指定したフォルダにある複数枚の静止画を読み込み,上にパネルを重ね,(音源の長さ)/(枚数)[秒]ずつ静止画を切り替える処理
2. 音声を再生する処理
の二つの処理を同時に行わないといけないため,PythonのThreadingパッケージを用いて実装しました.また,上に重ねるパネルの情報はmain.pyをEscキーで終了するときにtxtファイルで保存されるようにしているため,そのtxtファイルから読み込まれます.

最後に

以上,Pythonとネットワークの勉強がてら作ってみたアタック25プログラムでした.
皆さんもぜひ使ってみてください.結構盛り上がります.
ちなみに,優勝景品はラズパイ3モデルBでした.
IMG_5775.JPG

10
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
7