Python初心者講座 60行でタイピングゲームを作ろう!

はじめに

Pygameで60行ぐらいでタイピングゲームを作ります。以下が完成したときのソースコードです。このぐらいの量なら初心者でも行けると思います。この記事は、各見出しごとに、機能を追加し、解説、ソースコードと実行結果を載せています。機能を追加した時点のちゃんと動くソースコードを載せているので、もし自分で書いて動かない場合は比較して参考にしてください。

それでははじめていきましょう。

 

※Pygameはpipでインストールしておいてください

タイピングゲームの基本動作を確認

  1. 単語帳からランダムに単語を選ぶ
  2. キー入力と単語の先頭文字が同じなら、単語の先頭文字を削除
  3. 単語が空かチェックして、空なら1に戻る

上に書いたように、タイピングゲームの基本動作は単純です。まずは赤文字の部分を作ってしまいます。

単語帳からランダムに単語を選ぶ

select_wordを追加したソースコード

解説

単語(word)、選ぶ(select)で、select_word関数を作ります。

単語帳(word_list)を配列で作ります。

len()関数は、配列の中身の数が分かるので、len(word_list)で、個数を求めます。上記の例では5個です。

random.randintでランダムな数を求めます。random.randint(0, 5)なら、0,1,2,3,4,5のどれかが取得できます。word_listは、中身が5個あって、配列は以下のように0から4で取得できます。word_list[5]とするとエラーになってしまうので、random.randint(0, num_of_elements – 1)のように-1します。

最後に、0から4のどれかがiに保持できたので、return word_list[i]で、呼び出し元に、選んだ単語を返します。

実行

スクリプトの最後に3つテストを書いているので実行したら、実行毎にランダムな単語が3つ表示されます。

単語の先頭文字を削除

解説

Pythonはスライス機能があるので、文字列[開始インデックス:終了インデックス] で文字列から一部分を取得できます。開始インデックス、終了インデックスは省略もできます。例えば”abcde”[1:]と書いたら、1番目の文字以降の文字列”bcde”を取得できます。配列のインデックスと同じで、ゼロ始まりなので、aは0番目の文字、bは1番目の文字です。

cust_head_charを追加したソースコード

実行

テスト2でpple, anana,herryのように、先頭文字を削除できているのがわかります。

単語が空かチェック

Pythonではnot演算子で、空””かどうかチェックできます。not演算子は、文字列が”abcde”のようにある場合は、Falseを返します。空””の場合はTrueを返します。

is_empty_wordを追加したソースコード

実行

テスト3の最後のテストが、Trueになっているのが分かります。

ここまでの作業のまとめ

  1. 単語帳からランダムに単語を選ぶ
  2. キー入力と単語の先頭文字が同じなら、単語の先頭文字を削除
  3. 単語が空かチェックして、空なら1に戻る

ここまでで3つの関数を作りました。残りは画面に単語を表示して、キー入力に対応するだけです。残り20行ぐらい。

画面を用意して塗る(fill,フィル)

いきなりいろんな作業をすると、分からなくなるので、まずは720×480の画面を作って背景を塗りつぶします。うまくいってから、文字列表示やキー入力を実装していきます。

解説

run_game関数を作ってそれを実行することで、ゲーム画面を表示します。

pygame.init()でゲームライブラリーを初期化します。

pygame.display.set_mode((720, 480))で、720×480の画面用意しscreen変数に保持します。今後はここに単語を表示させます。

screen.fill((200, 200, 200))で、淡いグレーでscreenを塗ります。

pygame.display.update()で、実際に画面が更新されます。

イベントについて

「閉じるボタンを押した」「キー入力」「マウスクリック」「マウス移動」「ウィンドウ最大化」などはすべてイベントとして扱います。何か発生するたびに、pygame.event.get()でイベントを取得して処理できるようにします。ちょうどfor文のとこです。

まずはpygame.QUITイベントに対応します。「閉じるボタンを押した」ときにこのpygame.QUITイベントが発生します。発生したときはsys.exit()でアプリを終了します。これを書かないとアプリが終了できなくなるので必ず必要です。

また、今回pygameとsysパッケージを使ったのでimport文も追加します。

ここまでのソースコード

実行

画面を灰色で塗る

単語を表示

ペイントソフトをイメージすると分かりやすいです。ペイントソフトで文字列を書く場合、フォントを用意して、文字列を書いて、それをpngなど画像ファイルとして書き出します。pygameの場合以下のようになります。

  1. フォントを用意 pygame.font.SysFont
  2. 文字列を書く font.render
  3. 書き出し screen.blit

解説

文字列を表示するためには、まずフォントを用意します。今回はNoneを指定し初期フォントを使います。

word = select_word()で、ランダムに選んだ単語を1つ用意して、それをrenderで書きます。

screen.blitで画面に書きだします。

ここまでのソースコード

実行

単語が表示できた!

キー入力と単語の先頭文字が同じなら、単語の先頭文字を削除

解説

キーが押されたら、pygame.KEYDOWNイベントが発生します。この時の入力されたキーはevent.keyで取れます。これはアスキーコードという数値なのでchr(event.key)で文字にします。そして、chr(event.eky) == word[0]で、単語の先頭文字と比較します。

もし同じなら、最初に作ったcut_head_char関数で、単語の先頭文字を削除します。

ここまでのソースコード

これで、キー入力して単語の先頭文字が同じ場合には削除されます。

単語が空かチェックして、空なら新たな単語を用意する

解説

単語が空かチェックするis_empty_word関数をあらかじめ用意していたので、空なら、word = select_word()で新たな単語を用意します。

解説:文字のセンタリング

文字列の左上頂点を求める

スクリーンサイズの半分から、文字列の幅の半分を引くとセンタリングするための文字列の左上頂点が求められます。図で理解するとよいです。

ここまでのソースコード

今回、以前書いたテストのprint文も削除しました。

実行

センタリングして、タイピングできるようになった

まとめ

60行ぐらいでタイピングソフトができました。これをどんどん改造していこう!フォントサイズ変更、色変更をした後に、スコア表示などができると思います。需要があれば、改造のしかたも書こうと思います。

カウントダウンタイマーはちょっと面倒でget_ticksを使います。以下は60秒のタイマーです。60行後、start_ticks = pygame.time.get_ticks()を呼び出してリセットする必要があります。

 

 

結月ゆかりとマキさんとゆっくりのゲームを作ります!

結月ゆかり、弦巻マキ、ゆっくり霊夢が主人公の簡単なゲームを作成し始めました。以下のGifのように、見下ろし型のガン・シューティングゲームです。あまり大風呂敷を広げると途中で挫折してしまうので、まずは5分ぐらいで遊べるゲームを作ります。

A01
ゾンビだ!!

なので、最初のリリースをするまでの現在の残り作業は以下ぐらいです。

  • アイテムドロップと、取得して銃の性能アップをする仕組み
  • 敵をあと2,3種類は増やす。
  • 時間経過で、ウェーブ中の敵が多く強くなり、5分以上は無理な状態にする。
  • ライフバーやダメージテキストの表示
  • インベントリー管理は保留。

Blenderで結月ゆかりにアニメーションをつけてみました。

トップダウンシューティングのチュートリアルが完了したので、以前MagicaVoxelで作った結月ゆかりモデルにBlenderでアニメーションをつけて、Unityで動かしてみました。はじめてのモーション作成ですが、やっぱり自分で作ったキャラクターが動くのはいいですね!

Blenderでアニメーションを用意して、Unityで再生
Blenderでアニメーションを用意して、Unityで再生
002
.blendファイルとpngをドラッグアンドドロップするとfbxが作成される

Unityでは、Cubeなどを拡大縮小したり回転したりしてアニメーション・クリップを用意できますが、Blenderで作ったhumanoidベースのモデルの場合は、Unityでボーン修正してアニメーション作るのは簡単ではないようです。Unity上で試行錯誤しましたが、私は結局やり方が分からず、最終的にはBlender側でアニメーションを作成して、それをUnityに読み込むことにしました。

Unityでゲームを作る場合は、Blenderでモデリングとアニメーションをする人と、Unityでプログラミングをする人を明確に分けれるので、複数人がやりやすいと感じました。

FBXを生成する必要なし?

ネット上を見るとBlenderで、FBXファイルをエクスポートするという方法をよく見かけますが、特に細かい設定をしない場合は、そのまま.blendファイルを画像ファイルをUnityにドラッグアンドドロップすれば自動で、FBXが生成されるようです。

 

ImageEffectsをいろいろつけた
ImageEffectsをいろいろ試した

まとめ

Blenderでアニメーションを複数用意して、FBXファイルとしてエクスポートして、Unityで動作させる一連の作業フローが確立できました。まずはゲームを作るため適当なモーションになりますが、少しづつ磨き上げていこうと考えています。

 

Unity Create a Game Series (E19. crosshairs)をやってみました。

E17. weapon variationでは、単発、バースト、オートマティックで弾を打てるように修正し、E18. wave difficultyでは、敵ウェーブごとに敵の強さなどを調整できるようにしました。そしてE19.crosshairsでは、照準を作成しました。

002
ウェーブ毎に敵の攻撃力や速度を調整できるようにした

照準の表示の仕方

照準を実装する方法は、すこし特徴的で、照準オブジェクトのレイヤーをUIにしました。またメインカメラはUIレイヤーを映さないにして、UIレイヤーのみを映すカメラ(Crossharis camera)を別途用意しました。これで、Crossharis cameraの深度(Depth)を上げることで、必ず標準が手前に表示されるようにしました。シンプルな2Dゲームの場合、ゲームオブジェクト自体のz軸を変更して手前に表示するか奥に表示するかなを調整したりしますが、カメラでどのレイヤーを映すかを設定できるのは、大きなゲームフレームワークでないと使わない機能なので、新鮮で勉強になりました。

003
crosshairs(照準)はUIレイヤー
004
マスキングでUIレイヤーのみ対象にしたカメラ

このプロジェクトの配布

http://hajimete-program.com/games/Unity Create a Game Series (E18. wave difficulty).zip

Unity Create a Game Series (E14. game over)をやってみました。

Unity Create a Game Series (E14. game over)をやってみました。

今回はゲームオーバー画面をuGUIで作成し、”Play again”ボタンで、シーンをリロードする仕組みを作りました。これは今までミニゲームを作ったりした際に経験していたので簡単でした。

ゲームオーバーシーンを表示
ゲームオーバーシーンを表示

この回で、基本的なゲームの仕組みは揃いました。これから先の目次を見ると、それぞれの機能を磨き上げる工程になるので、おそらくそこまで難しいものではないと思われるので頑張って進んでいきます。

  • パーティクル追加
  • 敵ウェーブの修正
  • リコイル・リロード
  • 武器の追加
  • UI改良、
  • オーディオ追加
  • メニュー

あとは、ライフバー、アイテム、インベントリーあたりを学べばさらに良くなりそうです。

このプロジェクトの配布

http://hajimete-program.com/games/Unity Create a Game Series (E14. game over).zip

 

 

次に作るゲームは、トップダウン形式のシューティングゲーム

MagicaVoxelを使うことで絵が描けなくても3Dモデリングができなくても、キャラクターを用意してリギングとアニメーションができそうなところまできました。実際に、先日の「MagicaVoxelで東方プロジェクトのキャラクターも作ってみました」では、簡単なキャラクターをつくりました。

A04

 

どのようなゲームにするか

ニコニコ動画に「Left 4 Ships」というトップダウンのシューティングゲームがありました。またちょうど、Sebastian Lagueさんがトップダウンゲームのチュートリアルを用意しているので、このチュートリアルを実装してトップダウンのシューティングゲームの基礎を手に入れて、MagicaVoxelで作ったキャラクターで遊べるようにしたいです。ゲームの概要

  • トップダウン(見下ろし)シューティングゲーム
  • ステージは、マップ・ジェネレーションで、1、2画面の無機質なステージ
  • 5分~10分で遊べるゲーム
  • アイテム要素、ショット切り替えなし
  • アニメーションなし

最初のゲームは上記のような感じで大風呂敷を広げません。とりあえずSebastian Lagueのチュートリアルの実装で、キャラクターをMagicaVoxelにするという感じです。これであれば、なんとか完了できそうです。

将来的な要素

以下があると本格的なトップダウンシューティングになりそうです。

  • ジャンプ、ドッジ(スピン)
  • ノックバック
  • ボム、詠唱、キャラクター・コレクション
  • コンビ技
  • ランキング
  • アニメーション
  • ステージテクスチャ
  • SE,BGM
  • 構造物破壊