[golang]二次元スライスでピンポン球を作ろう!

こんにちは。KOUKIです。

今日は、Udemyで習ったgolangで作るピンポン球を紹介したいと思います。

こんなやつです↓

事前準備

実装

ボールが動き回るマスを作る

最初にボールが動き回るためのマスを作りましょう。

これを表現するには、二次元のスライスを用意すればOKです。

縦(y)のマスを10、横(x)のマスを50に設定しました。そして、x、yの値を両方格納できるように[][]boolで、二次元のスライスを格納します。

例えば[1][2]boolとなった場合は、以下のようにボールが格納されるイメージです。

ボールを描画する

次は、ボールを描画してみましょう。

board[0]は列が入っているので、これをループします。

cell変数にはボールを格納する役割を果たしてもらいます。そして、boardのスライスにtrueが格納された時、ボールを描画します(例:board[16][7] = true)。

プログラムを実行してみましょう。

問題なく描画されましたね。

バッファを作る

プログラムの効率化のために、バッファを作成して、そこにボールを格納しましょう。

バッファを作ることで、ループごとに描画していた処理を一度に短縮できます。

加えて、先にバッファを作ってメモリを確保した方が処理速度も早くなるのでオススメです。

また、「buf = buf[:0]」についてですが、この後この処理をfor文で囲むのですが、bufの先頭から値を格納した方が処理速度が早くなるので、このようにしてます。逆にこれがないと遅くなりますね。

描画も問題なくできています。

ボールポジションとベロシティを設定

次は、ボールのポジションとベロシティを設定します。

ベロシティは、ボールの飛び交う範囲をここでは示していますね。マスの枠が決まっているので、その範囲を超えないように調整しています。

プログラムを実行してみましょう。

めちゃくちゃボールが出てきますね。

ボールを削除する

ボールの描画が残ったままだと先ほどの出力になってしまうので、ボールを削除しましょう。

描画前に以前格納したポジション情報を削除する処理を入れました。また、ボールの描画速度が早すぎるので、それを緩めるためにtime.Sleepを追加しています。

実行すると以下のようになります。

ボールがピンポンしてますね。もう少しです。

screenパッケージで描画を調整する

最後にscreenパッケージを使って、パッケージの描画を調整しましょう。

これで完成です!

おわりに

このプログラムをみたとき、Go言語ってこんなことができるんだと感動しました^^

色々なバリエーションを楽しめますよね。

それでは、また!

オススメ書籍