こんにちは、ユクサスです!
前回は、作った関数を紹介しました。今回からは、ゲームの流れのコードについて紹介していこうと思います!
↓【ゲーム制作】勉強始めて約3週間の初心者がEカードゲーム作ってみた まとめはこちらから
前回と同じく、使用言語は『Python』で、『Google Colaboratory』でコードの作成・実行しました。それぞれに関する記事も書いてるのでよろしければどうぞ!
↓コードを書くのに使用した環境『Google Colaboratory』はこちら
↓使用したプログラミング言語『Python』についてはこちら
↓このゲームを作るまでに学習した内容はこちら
3週間もあれば余裕で習得できるよ!笑
それでは、行きましょう!
ゲームコードの概要
まず最初にゲームコードの概要を改めて紹介します!
- 辞書として、数字を『キー』、カードを『値』として『皇帝デッキ』と『奴隷デッキ』を作成
- 出されたカードを『引数』とし、勝敗を『戻り値』として返す 『関数』 の作成
- ゲームの流れをコード
前回は2の「出されたカードを『引数』とし、勝敗を『戻り値』として返す 『関数』 の作成」の説明を行いました。今回は、3の「ゲームの流れ」について話していきます!
ゲームの流れ
では、まずゲームの流れをもう少し細かく見ていきましょう。
- ゲームモード(対人戦・CPU戦)の選択
- 使用デッキ(皇帝デッキ・奴隷デッキ)の選択
- 勝敗が決まるまで、カードを出し続ける
- 勝敗が決まったら終了する
ゲームの流れは大体こんな感じです。今回は3の「勝敗が決まるまで、カードを出し続ける」の中の第1回戦までを紹介していこうと思います。
モード選択〜第1回戦
まずはコードを見ていきましょう。
これは、CPU戦モードのプレイヤーが皇帝デッキを使用するときの第1回までのコードです。
次に、説明を入れていくよ!
初期値や自作関数の説明は以前の記事で解説してます!
CPUの出す手順
ここでは、randomモジュールを使ってCPUの出すカードの手順を決めています。先に、1〜5の数字を毎回ランダムに並び替えて、それをリストとして保存しています。
実は、CPUが毎回違う手順でカードを出すようにするまで悩みました…
勉強を始めて3週間の私には、「1〜5までの数字を毎回ランダムにとり、しかも一度出た数を使わないようにする」というのはなかなか大変でした。今なら、いろいろ方法を思いつきますが、当時の私が思いついたのはこの方法です。
アイデア
- 各回でCPU戦で、1〜5の数字をランダムで被らないようにとる
⬇︎
- 先に、1〜5の順番を決めてリストにする
- そのリストから順番に数字をとる
このようにすれば、簡単に「1〜5までの数字を毎回ランダムにとり、しかも一度出た数を使わないようにする」を達成することができます。もちろん、他にもいろいろ方法はあると思います。
この方法を思いついた時は、きたーー!ってなりました笑
詰まっていたところを、ひらめきで突破していくのが
プログラミングの醍醐味の1つかも?
random.sample()はリストやタプル、文字列などのシーケンスオブジェクトから複数の要素をリストで取得できます。sample()は重複なしで選択し、重複ありにしたい時はchoices()にするとできます。
対戦モードの選択・デッキの選択
ここでは、対戦モード・デッキを選択するのに「input」を使っています。
input
- キーボードの入力を受け取ることができる
- ()内の文字を一緒に表示できる
- 受け取った入力は全て文字列として扱う
- 数値にしたい時は、上のようにint()で囲む
↓実際の実行画面
対戦モードは変数select_modeに、デッキは変数select_sideとし、それぞれの値によってゲームの進行が変わるように場合分けします。
input()を使用するのに注意をすることは、受け取った入力は全て文字列として扱うということです。今回、入力してほしいのは1と2ですが、ちゃんとint()で囲まないとすぐにエラーになります。
頭ではわかってるのに、何回もint()をつけ忘れてエラーが出ました笑
1回戦結果開示まで
いよいよ、1回戦の解説に入るよ!
今まで出てきたことを使って、ゲームを進行していきます。まず、print()を使い簡単なナレーションを入れていきます。現在の手札の状態を表示し、プレイヤーにカードを選択させます。選択するときは、先ほどと同様にinput()を用いて入力を受け取ります。
次に、コンピュータのカードを決めます。あらかじめ、1〜5がランダムに並んでいるリストnumberから順番に取ります。
リストの要素の番号
リストから要素を取り出すときは、リスト名[番号]として要素を取ります。しかし、リストの要素は左から順番に番号を0からつけられます。
つまり、要素1を取り出すには、リスト名[0]・要素2を取り出すには、リスト名[1]…、と言うふうにリスト要素の順番と1ずれます。
慣れないうちは、とても間違いやすいので要注意!
(私は間違いすぎて、Colaboratoryに何度も怒られてます笑)
お互いのカードが決定したら、自分で作った関数judge()を使い戻り値をresultに代入します。そして、あらかじめ作っておいた関数openとナレーションを合わせて、結果の開示を行います。
結果による場合分け
最後にresultの値によって、場合分けしていきます。resultの値については下の通りです。
今回は最初にCPUが勝った時を場合わけして、print()を使って煽り文句を入れました。苦手な方は、普通に「コンピュータの勝ち!」とかにするといいと思います。
次に、引き分けの時について場合分けします。実際に使ったカードは捨てるというのを再現したかったので、使用したカードを辞書型のデッキから取り除きます。
辞書型の要素の消去
今回は『del』を使いました。
- del 辞書名[キー]
このようにすることで、指定した「キー」とそれに対応する「値」を辞書から消去できます。
del を使って、ゲームのリアルさを出そうとしました!
でも、こうすることによって悲劇が起こります…
最後に
今回はここで締めようと思います。
ゲームの流れを説明したので、段々と完成が見えてきました。もちろんここまでくるのに、スラスラできたと言うわけではありません。ちょっと難しいなと思った方がいても、全然おかしくないです。
このブログで一緒に成長していこう!
次回からは、第2回戦以降のコードの解説をしていきます。「第1回戦ができたなら、簡単じゃね?」っと思った方もいるかもしれませんが、実は悲劇はそこで起こったのです…
そんなこんなで私がこのゲーム制作で1番大変だったところについても、詳しく解説していきます!
では、また次の記事で!
ユクサスのアカウントで BlogMap も登録してます!記事を読んで、気に入っていただけたら「購読通知」と「いいね」をポチってもらえると、嬉しいです!ぜひ、お気軽にどうぞ!
BlogMapのページはこちらから⇨https://blogmap.jp/details/4997
コメント