astamuse Lab

astamuse Labとは、アスタミューゼのエンジニアとデザイナーのブログです。アスタミューゼの事業・サービスを支えている知識と舞台裏の今を発信しています。

ターミナルで遊べるゲームつくってみた(Go言語)+Github Releasesで配布

f:id:astamuse:20181216013702j:plain

こんにちは、omiです。
前回の初ブログから4,5ヶ月経っていました。びっくりです。

今回は業務とは関係ありません。すみません。

皆さんは、pongというものをご存知ですか?
調べ物をしている最中に偶然見つけました。
pingじゃありません。pongです。

pingと間違えてpongと打つと発動するpingpongゲームです。

f:id:astamuse:20181215205615g:plain

github.com

・・・めちゃ面白い!!!!いいな!!!!!
わたしもつくりたい!!!!!!
わたしも、ゲームを、つくりたい!!!!! !!!!!!!!

ヾ(゚∀゚*)ノ”彡☆

ターミナルで遊べるゲームをつくってみました。
ぬるぬる動くリッチなイマドキのゲームなんて作れません。
でもこのターミナルゲームなら、わたしにも作れそうな気がする。

このpongをベースとさせていただきました。

goでした。goのコードは見たことも書いたこともありません。
超絶感覚プログラミングでなんとかしました。

f:id:astamuse:20181215220034g:plain

ひたすらおにぎりが降ってくるゲームです。意味は考えちゃいけません。
地面に落とすとゲーム・オーバーです。食べ物を粗末に扱ってはいけません。
時間が経つとおにぎりの降ってくるスピードが速くなっていきます。(無駄なこだわり

そうなってくると今度、バーの速度のせいでおにぎりに到達できずにイライラしてくるので
左端・右端にジャンプできるキーも設定しておきました。

暇な訳じゃありません。自由研究です。キリッ

github.com

※macじゃない環境はおにぎりがうまく表示されないきがします。

ゲーム作成〜パッケージをgithubへリリースまでの流れ

コード書く以外で難しいところは何もなかったです。だれでもできる。ストレスフリー!

環境設定

開発環境:mac(mac以外の人は適宜調べてください)

  • goをインストール
$ brew install go

  • $GOPATHを通す
$ export GOPATH=$HOME/go  #ディレクリの場所は自由

  • パッケージ用のディレクトリを作成
$ $GOPATH/src/github.com/[github-user-name]/[package-name]

この[package-name]が実行コマンドになります。

ゲーム作成

  • pong様のコードをコピペしてきます。
  • 解読してonigiri仕様に修正します。(適当に消してみて動きを確認する、適当に書き換えて動きを確認する、の繰り返し)
  • 確認用実行コマンド
$ go run *.go


pongから書き換えるに当たって主な修正点は、

  • 敵がいなくなる
  • プレイヤーのバーは縦方向の移動 => 横方向の移動に
  • ボール(おにぎり)の動きは単純に落下するだけに
  • プレイヤー or 敵 or 壁に衝突した場合にボールの向きを変える
    => プレイヤー or 底に衝突した場合にボール(おにぎり)の動きを止めて(プレイヤーの場合)プレイヤーに合体させる
  • キーアクションとして、←→の他に、↑↓(右/左端ジャンプ)を追加
  • ゲームオーバー時にプレイヤー操作を止めてゲームオーバーの文字を表示させる

githubへリリース

goreleaserというものを使います。
(バイナリのクロスコンパイルと Github Releases へのデプロイを簡単にやってくれる。ぐっじょぶ。)

  • goreleaserのインストール
$ go get github.com/goreleaser/goreleaser

  • リポジトリのルートに.goreleaser.ymlファイルを配置する
builds:
  - binary: onigiri
    goos:
      - windows
      - darwin
      - linux
    goarch:
      - amd64
      - 386
archive:
  format: zip
  name_template: "{{ .ProjectName }}_{{ .Os }}_{{ .Arch }}"
  replacements:
    amd64: 64-bit
    386: 32-bit
    darwin: macOS
release:
  github:
    owner: omi-chan
    name: onigiri-catch

書き方はみた感じでわかりやすいと思います。
作成するバイナリファイルはどういうOSでどういう名前のどういう形式のファイルにするかという指定です。

  • githubにリポジトリを作っておく
  • githubにプッシュする
    作ったパッケージフォルダ($GOPATH/src/github.com/[github-user-name]/[package-name])配下で、
$ git init
$ git add .
$ git remote add origin https://github.com/omi-chan/onigiri-catch.git #自分のgithubリポジトリ
$ git pull origin master
$ git commit -m "コメント"
$ git push -u origin master
$ export GITHUB_TOKEN="YOUR_TOKEN"

  • gitのTagをうつ
$ git tag v0.1.0
$ git push --tags

  • goreleaserする
$ goreleaser

   • releasing using goreleaser dev...
   • loading config file       file=.goreleaser.yml
   • RUNNING BEFORE HOOKS
   • GETTING AND VALIDATING GIT STATE
      • releasing v0.1.0, commit b05477eb4a3ed4b23f2394e5333d58a70b700d7d
   • SETTING DEFAULTS 
   • SNAPSHOTING      
      • skipped                   reason=not a snapshot
   • CHECKING ./DIST  
   • WRITING EFFECTIVE CONFIG FILE
      • writing                   config=dist/config.yaml
   • GENERATING CHANGELOG
      • writing                   changelog=dist/CHANGELOG.md
   • LOADING ENVIRONMENT VARIABLES
   • BUILDING BINARIES
      • building                  binary=dist/linux_386/onigiri
      • building                  binary=dist/darwin_amd64/onigiri
      • building                  binary=dist/windows_386/onigiri.exe
      • building                  binary=dist/windows_amd64/onigiri.exe
      • building                  binary=dist/linux_amd64/onigiri
      • building                  binary=dist/darwin_386/onigiri
   • ARCHIVES         
      • creating                  archive=dist/onigiri-catch_macOS_64-bit.zip
      • creating                  archive=dist/onigiri-catch_linux_32-bit.zip
      • creating                  archive=dist/onigiri-catch_linux_64-bit.zip
      • creating                  archive=dist/onigiri-catch_macOS_32-bit.zip
      • creating                  archive=dist/onigiri-catch_windows_32-bit.zip
      • creating                  archive=dist/onigiri-catch_windows_64-bit.zip
   • LINUX PACKAGES WITH NFPM
      • skipped                   reason=no output formats configured
   • SNAPCRAFT PACKAGES
      • skipped                   reason=no summary nor description were provided
   • CALCULATING CHECKSUMS
      • checksumming              file=onigiri-catch_windows_32-bit.zip
      • checksumming              file=onigiri-catch_macOS_64-bit.zip
      • checksumming              file=onigiri-catch_macOS_32-bit.zip
      • checksumming              file=onigiri-catch_linux_32-bit.zip
      • checksumming              file=onigiri-catch_linux_64-bit.zip
      • checksumming              file=onigiri-catch_windows_64-bit.zip
   • SIGNING ARTIFACTS
      • skipped                   reason=artifact signing is disabled
   • DOCKER IMAGES    
      • skipped                   reason=docker section is not configured
   • PUBLISHING       
      • S3               
      • skipped                   reason=s3 section is not configured
      • releasing with HTTP PUT
      • skipped                   reason=put section is not configured
      • Artifactory      
      • skipped                   reason=artifactory section '' is not configured properly (missing target)
      • Docker images    
      • Snapcraft Packages
      • GitHub Releases  
      • creating or updating release repo=omi-chan/onigiri-catch tag=v0.1.0
      • release updated           url=https://github.com/omi-chan/onigiri-catch/releases/tag/v0.1.0
      • uploading to release      file=dist/onigiri-catch_0.1.0_checksums.txt name=onigiri-catch_0.1.0_checksums.txt
      • uploading to release      file=dist/onigiri-catch_windows_32-bit.zip name=onigiri-catch_windows_32-bit.zip
      • uploading to release      file=dist/onigiri-catch_linux_64-bit.zip name=onigiri-catch_linux_64-bit.zip
      • uploading to release      file=dist/onigiri-catch_linux_32-bit.zip name=onigiri-catch_linux_32-bit.zip
      • uploading to release      file=dist/onigiri-catch_macOS_32-bit.zip name=onigiri-catch_macOS_32-bit.zip
      • uploading to release      file=dist/onigiri-catch_macOS_64-bit.zip name=onigiri-catch_macOS_64-bit.zip
      • uploading to release      file=dist/onigiri-catch_windows_64-bit.zip name=onigiri-catch_windows_64-bit.zip
      • homebrew tap formula
      • skipped                   reason=brew section is not configured
      • scoop manifest   
      • skipped                   reason=scoop section is not configured
   • release succeeded after 5.26s

コマンドがないと言われたら、$GOPATHが通ってない可能性があります。
$GOPATH/bin/goreleaser に入っているはずです。


これで、onigiri-catchを全世界の人に使ってもらうことができます。

ゲームをつくって思ったこと

時間軸も含まれている4次元の世界でシステムをつくるの楽しい・難しい

普段のシステム開発では、何かしらのアクションによる次イベント発火という構図が主なので、
時間軸による状態の変化を表現することの楽しさ・難しさを感じました。

まるでパソコン上で天地創造している気分になりました。
onigiri-catchの世界でもおにぎりは逆流しないし、重力は下に向かっているのです。

難しすぎても簡単すぎても面白くない

つくったゲームを試していて、難易度の設定がそのゲームが継続的に遊ばれる・浸透するかどうかの重要なファクターのひとつだなと感じました。
onigiri-catchでは、おにぎりの落下速度とバーの移動速度・可動性を何度も調整しました。
できそうでできない、絶妙なラインに難易度を設定するのが遊びたくなるポイントだと思いました。

以上です、またゲームつくりたいと思います。
ありがとうございました。

一緒にはたらく仲間を募集中です!バナーからよろしくお願いします。
では。サリュ!

Copyright © astamuse company, ltd. all rights reserved.