Pythonのこと1ミリも知らないけどpyxel使ってみた

はいどーもこんにちは無職です。
みなさんPythonしてますか。
僕は本日初めてPythonもといpyxelを使いました(https://github.com/kitao/pyxel/blob/master/README.ja.md)。
その感想記事を書いていきたいと思いますよ(作った神経衰弱のコードも公開します)。

なんでpyxelか

唐突に始めたPythonもといpyxelですが、これ単にTwitterのTLで見かけたからですw
「前からPythonいじってみたいと思ってたし、こりゃちょうどいいや!」と思ったわけですね。
ですが僕はPythonのことを1ミリも知りません。
とは言え1ミリというと語弊があるかもしれないので、ちょっと前提をまとめておきます。

・なんか機械学習で強いのは聞いたことある
・入門書とか入門サイトは一回も見たことない
・当然コードも書いたことない

こんな感じです。
今回pyxelをするにあたっても、特に勉強はしませんでした。
付属しているサンプルコードを眺め、当て推量でコードを書き、動かなかったらググる。
「C#やJavaScriptならこういうコードが書けるけど、Pythonではどうするのか?」と思ったときもググる。
ググった結果が面倒そう(理解に時間がかかりそう)なら「古典的だが動くコード」で妥協する。
こんな感じでやっていきました。

作ったゲーム

最初にも書いた通り、作ったのは神経衰弱です(初めはマルバツゲームでも作ろうと思ったのですが、思ったより規模が大きくなりそうだったので急遽神経衰弱にしましたw)。
作成したコードはGitHubで公開しています(https://github.com/Tsumio/pyxel_pelmanism/blob/master/pelmanism.py)。
操作方法は以下の通りです。

・マウスの左クリック:対象マスをオープン
・Rキー:リトライ

ゲームの仕様は以下の通りです。

・文字が各マスにランダムに配置される
・普通の神経衰弱と同じで、同じ文字を見つけたらOK
・クリック数が左上に表示される
・クリアしたらCongratulationsと点滅文字が表示される

Twitterで動画も公開していますので、そちらもご覧ください。

工夫した点

Pythonのことをよく知らないので、オブジェクト指向っぽく書くのが正解なのかどうか不明でしたが、オブジェクト指向はなるべく意識して書きました。
小さなプログラムではありますが、例えばObserverパターンを用意したり、ほぼ全ての機能に対してクラスを作成したりしました(Pythonはクラスを使わなくてもいいみたい)。
ゲーム的なことで言えば、「1つ目開いた文字と違う文字を開いた場合、開いた2つの文字を一定時間表示する」というところはぜひ実装したいなと思って作成しました。

なお全体マスの数は好きなように設定できますが(ゲーム上では無理。コードをいじる必要がある)、全体が奇数になっていると一つカード(文字)が余ります。この場合のゲームクリア判定は「最後に一つ残っていてもクリア」としました。

反省点

Playerクラスはもう少し分割してもよかったかもしれませんね。
例えばCongratulationsと表示する機能は別のクラスにもたせて、表示方法を簡単に切り替えられるようにしたほうがスッキリしそうです(まあ改造する予定もないので別にいいっちゃいい気もしますが)。
アクセス修飾子も課題ですね。
アクセス修飾子がサンプルで使われてなかったので、Pythonにはアクセス修飾子がないと思っていた(JavaScriptと同じ感じだと思っていた)のですが、どうもプロパティ名でprivateかpublicか決まる? ようでした。
privateに設定できるなら、ちゃんと隠蔽はしておきたいところですね。
あとは「ジェネレータ」の機能も何か使いたいなと考えていたのですが(ジェネレータ好きですし、Pythonはジェネレータの構文が洗練されているなと感じました)、神経衰弱でうまいこと使えるものが思いつかなかったので実装しませんでした。

Pythonについて

最初にもちょろっと触れましたが、Pythonと言えば機械学習ですよね。
有名な言語なのでライブラリも豊富だと思うのですが、その辺は今回ノータッチです(インポートしたのはpyxelとrandomのみ)。
構文について言うと、中括弧がないのが慣れませんでしたw
インデントの数でブロックを構成するようなのですが、これは僕の好みではないかなあ、という感じです。
オブジェクト指向っぽい書き方もやりにくかったので(インターフェイスはそもそもサポートしていないっぽい)、オブジェクト指向ではないPython流の書き方があるのかもしれません(関数型とも違いそうです)。
ああ、あと無名関数として利用するラムダ式の書き方も違和感バリバリでしたw
C#やJavaScriptと同じ感じで無名関数が使えると嬉しいんですが、そもそも中括弧もないですし、これがPython流なのでしょうね。
慣れですかね。

pyxelについて

これはGitHubの紹介ページでも書かれている通り、レトロゲームを作るためのゲームエンジンです。
触ってみた感じ、今風のゲームを作るのには向いていないと思います。
ですが機能が制限されている分、わかりやすいAPIとなっていますので、学習コストは非常に低いと思われます。
例えば僕のようにツクールMV(のスクリプト)やUnityを触ったことがあるなら、一日かければある程度は把握できるのではないかなと思いました。
これは機能が豊富もとい学習コストが高いゲームエンジンでは考えられないことですね。
GameObject的なものを作って自分なりに使いやすいように拡張していくのがいいかも。

終わりに

初めてPythonに触れましたが、何の知識がなくてもググりながらでわりと書けることがわかりました。
一日集中して簡単なプログラムを組むことは、入門書を一冊紐解くよりも得られることが多いかもなあと思いましたよ(そういえばツクールMVを購入したときもそんな感じでした)。

Laravelやらvue.jsやらにも興味があるので、これからチマチマしていきます。
UnityかツクールMVの仕事もほしいですねえ……。

ほなそんな感じでまた。

フォローする