seigot / tetris

A Tetris Game for programming education in Japanese
MIT License
30 stars 107 forks source link

Table of Contents

Tetris

プログラミング学習を目的とした、ブロックを操作してスコアを競うゲームです。
FAQはこちら。
tutorialはこちら。
tetris_score_serverはこちら
tetris_battle_serverはこちら

実行環境準備

Mac環境

Finder→Application→Utility→Terminalから、ターミナルを起動して以下コマンドを実行する。
install成功後、実行方法によりゲーム開始すればOK

# install pyqt6 and NumPy
brew install python3
brew install pyqt6
brew install numpy
# install other packages
brew install git

doc/files/install_mac.mdに手順を記載

windows環境

windowsのpowershellを使ってテトリス環境を構築する場合の手順
WSL(Windows Subsystem for Linux)を使う場合の手順
Docker for Windowsを使う場合の手順

Ubuntu/JetsonNano環境

doc/files/install_ubuntu.mdに手順を記載

docker環境

docker/README.mdに手順を記載

実行方法

本リポジトリを取得

cd $HOME
git clone https://github.com/seigot/tetris

ゲーム開始用スクリプトを実行

cd tetris
python start.py

Screenshot

サンプルコード

実行時、以下のようにオプションを与えることで、スコアアタック用サンプルコードの実行が可能です。
サンプルコードの詳細は、ブロック操作用サンプルプログラムを参照下さい。

python start.py -m sample

手動操作

実行時、以下のようにオプションを与えることで、手動操作が可能です。 操作方法は、PC操作準拠とゲーム機コントローラ準拠の2種類を選択できるようにしています。

手動操作 PC操作準拠 ゲーム機コントローラ準拠
実行コマンド python start.py -m keyboard python start.py -m gamepad
up key 回転 落下
left key 左に移動 左に移動
right key 右に移動 右に移動
m key 下に移動 下に移動
space key 落下 回転
P key Pause Pause
c key hold hold

--nextShapeMode hateオプション付きで実行するとhateモード(手動操作で遊ぶ用)になります。

python3 start.py -m keyboard --nextShapeMode hate

AI実装

実行方法、サンプルコードを用意しています
詳細はAIについてを参照下さい。

art

実行方法、サンプルコードを用意しています
詳細はartについてを参照下さい。

自動評価サーバ

表題のサーバを有志で用意しています
https://github.com/ChallengeClub/tetris_score_server

Play rules

制限時間内の獲得スコアを評価します。

Score

加点

項目 得点 備考
1ライン消し + 100点 -
2ライン消し + 300点 -
3ライン消し + 700点 -
4ライン消し + 1300点 -
落下ボーナス + 落下したブロック数を得点に加算 -
全消しボーナス + 全消し時に得点 -

減点

項目 得点 備考
gameover - 500点 ブロック出現時にフィールドが埋まっていたらgameover

game level

実行時、オプションを与えることで、難易度(レベル)を指定できます。

level1 level2 level3 level4
実行方法 python start.py python start.py -l2 python start.py -l3 python start.py -l4
制限時間 180秒 180秒 180秒 180秒
ブロックの順番 固定(1-7まで順番に繰り返し) ランダム ランダム ランダム
フィールドの初期ブロック なし なし あり あり
フレーム更新頻度 約1秒 約1秒 約1秒 約0.001秒
全消しボーナス +500 +500 +4000 +4000
備考 - - - -

各レベルの参考スコア

ファイル構成

ファイル一覧

詳細

以下のような構成になっています。
ブロック操作用プログラムは、管理プログラムから定期的に呼び出されるので、ボード情報から次の動作を決定して下さい。

  graph TB

  subgraph ゲーム管理用プログラム
    B1["game_manager.py"]
    C1["board_manager.py"]
    D1["block_controller.py<br>ここで現在のブロックの動作を決定する"]
    B1 --update--> C1
    B1 --getNextMove--> D1
    D1 --NextMove--> B1
    subgraph ボード管理用プログラム
        C1
    end
    subgraph ブロック操作用プログラム
        D1
    end
  end

  subgraph ゲーム開始用コマンド
     A1[start.py] --> B1
  end
style ブロック操作用プログラム fill:#fef

詳細

コード作成のはじめかた

本リポジトリのfork

まず、Githubアカウントを取得して本リポジトリを自リポジトリにforkして下さい。

リポジトリのフォークの例

  1. GitHubアカウントを作成/ログインする。
  2. GitHub で、https://github.com/seigot/tetrisリポジトリに移動します
  3. ページの右上にある [Fork] をクリックします。
    参考:リポジトリをフォークする

その後、自リポジトリにforkしたtetrisをローカルマシンに取得して下さい。

cd ~
git clone https://github.com/<yourname>/tetris   # "<yourname>"さん(yourname=自分のアカウント名に読みかえて下さい)のリポジトリを取得する場合
git clone https://github.com/seigot/tetris       # このリポジトリを取得する場合

既にtetrisが存在しており、これを削除したい場合はrm -fを実行して下さい。

# ubuntu/mac等の場合
sudo rm -rf tetris

# windows powershellの場合
Remove-Item -Recurse -Force tetris

取得後はソースコード変更、変更リポジトリに反映する等してアップデートを進めて下さい。

実行

実行方法を参考に実行環境の構築をして下さい。
環境構築の完了後、ブロック操作用プログラムblock_controller.pyを更新していってください。

自リポジトリのバイナリを公式リリースする

提出時、自リポジトリのバイナリを公式リリースする場合は、Githubリリースの機能を使うと簡単なのでお勧めです。

自リポジトリのコードを提出(バイナリリリース)する場合の手順参考
リポジトリのリリースを管理する
7.オプションで、コンパイルされたプログラムなどのバイナリファイルをリリースに含めるには、ドラッグアンドドロップするかバイナリボックスで手動で選択します。

本リポジトリの最新バージョン取り込み

今後、本リポジトリもバージョンアップしていく予定です。
本リポジトリのバージョンアップを取り込む場合は、forkしたリポジトリにて以下を実行して下さい。

※追記 2021/5より、Github UI上から操作可能になったようです。
GitHub新機能「Fetch upstream」使ってみた! 1クリックで親リポジトリに追従(同期)

git checkout master                                        # ローカルのmainブランチに移動
git remote add upstream https://github.com/seigot/tetris  # fork元のリポジトリをupstream という名前でリモートリポジトリに登録(名前はなんでもいい。登録済みならスキップ)
git fetch upstream                                         # upstream から最新のコードをfetch
git merge upstream/master                                  # upstream/main を ローカルのmaster にmerge
git push                                                   # 変更を反映

参考:github で fork したリポジトリで本家に追従する

Pull Requestを送る(Optional)

本リポジトリへ修正リクエストを送ることが可能です。詳しくは参考をご参照下さい。

※追記 Pull Request練習用リポジトリを作成しました。
test_pull_request

解説図:

Git Commentary

参考:
GitHub-プルリクエストの作成方法
[実践] はじめてのPull Requestをやってみよう
【GitHub】Pull Requestの手順

FAQ

doc/files/FAQ.mdを参照下さい。

参考

https://github.com/LoveDaisy/tetris_game
https://github.com/seigot/tetris_game (2021.12時点まで使用)
http://zetcode.com/gui/pyqt6/tetris/
テトリスの歴史を「ブロックが落ちるルール」の進化から学ぶ
『テトリスでPythonを学ぼうv4』優勝コード解説

今後の課題

次のブロックのランダム性

次のブロックのランダム性は、現在はrandom関数の出力に依存しています。
しかし、こちらの記事によると選択方式が色々ありそうです。
有識者の方からアドバイス頂けると助かります。

nextShapeIndex = np_randomShape.random.randint(1, 8)

競争要素の追加

例えば、AI学習を目的としたルールのアップデート、火力ボーナス、などが該当する
issues

学習要素の追加

例えば、文法、アルゴリズム、AI要素、などが該当する
issues#120

LICENSE

MIT LICENSE

Finnaly

~ HAVE FUN ~