見出し画像

pyxelでpython勉強帳(2)

さて、今回はpythonのデータ型から数値型を取り上げてみたいと思います。
まずは数値をいろいろ表示するサンプルコードを作ります。

# -*- coding: utf-8 -*-

import pyxel

class APP:
 def __init__(self):
     pyxel.init(128, 128, caption="pyxel")
     
     self.number1 = 1
     self.number2 = 2
     self.number3 = 3      
     
     pyxel.run(self.update, self.draw)
    
 def update(self):
     pass

 def draw(self):
     pyxel.cls(0)
     pyxel.text(20, 20, str(self.number1), 7)
     pyxel.text(20, 30, str(self.number2), 7)
     pyxel.text(20, 40, str(self.number3), 7)      
     
     pyxel.text(20, 50, str(self.number1 + 10), 8)
     pyxel.text(20, 60, str(self.number2 - 10), 8)
     pyxel.text(20, 70, str(self.number3 * 10), 8)      

     pyxel.text(20, 80, str(self.number1 + self.number2), 9)
     pyxel.text(20, 90, str(self.number2 - self.number1), 9)
     pyxel.text(20, 100, str(self.number3 / self.number2), 9)      
     
APP()

▲数値表示のサンプルプログラムです。
※2021/12/14追記
pyxelの新バージョン「pyxel 1.5.0」がリリースされました。1.5.0ではウィンドウタイトルの指定は「caption」ではなく「title」となっています

画像1

▲実行するとこんな感じ。

コードの中身について書いていきます。

 def __init__(self):
     pyxel.init(128, 128, caption="pyxel")
     
     self.number1 = 1
     self.number2 = 2
     self.number3 = 3      
     
     pyxel.run(self.update, self.draw)

▲今回はinit部分で変数を宣言しています。self.number1からself.number3までの変数を用意し、1から3の値を入れています。変数とは数値や文字列とかを入れておく「入れ物」と思っていただければ大丈夫です。
「self.」についてはインスタンス変数とかクラス変数といった部分に関係するのですが今回は割愛。その後のnumber1とかが変数名です。変数には「self.」を頭につける、ってことでとりあえずはいいんじゃないかと思います。

  def update(self):
     pass

▲update部分は特に何もしないので、「pass」で処理をとばします。

  def draw(self):
     pyxel.cls(0)
     pyxel.text(20, 20, str(self.number1), 7)
     pyxel.text(20, 30, str(self.number2), 7)
     pyxel.text(20, 40, str(self.number3), 7)      
     
     pyxel.text(20, 50, str(self.number1 + 10), 8)
     pyxel.text(20, 60, str(self.number2 - 10), 8)
     pyxel.text(20, 70, str(self.number3 * 10), 8)      

     pyxel.text(20, 80, str(self.number1 + self.number2), 9)
     pyxel.text(20, 90, str(self.number2 - self.number1), 9)
     pyxel.text(20, 100, str(self.number3 / self.number2), 9)      
     
APP()

▲draw部分で、定義した変数を色々な形で表示させてみます。
pyxelでの文字出力は「pyxel.text(x座標, y座標, 表示対象(文字型), 色コード)」です。今回は数値を出力するので、文字列に変換する必要があります。
「str(変換対象)」で対象を文字列にすることができます。

画像2
▲実行結果です。

白文字の部分は変数に入れた値がそのまま表示されています。
赤文字の部分は演算を行ってみました。変数が数値型なので四則演算をすることができます。
オレンジの部分は変数同士の演算です。型が一緒なので、変数同士で四則演算ができます。

この数値表示を使って簡単なスロットゲームを作ってみます。

# -*- coding: utf-8 -*-

import pyxel

class APP:
 def __init__(self):
     pyxel.init(128, 128, caption="pyxel")
     
     self.number1 = 0
     self.number2 = 0
     self.number3 = 0
     self.number1_stop = False
     self.number2_stop = False
     self.number3_stop = False
     
     
     pyxel.run(self.update, self.draw)
    
 def update(self):
     if pyxel.btnp(pyxel.KEY_1):
         self.number1_stop = True
     if pyxel.btnp(pyxel.KEY_2):
         self.number2_stop = True
     if pyxel.btnp(pyxel.KEY_3):
         self.number3_stop = True
     if pyxel.btnp(pyxel.KEY_SPACE):
         self.number1_stop = False
         self.number2_stop = False
         self.number3_stop = False     
         
     if self.number1_stop == False:
         self.number1 = pyxel.frame_count % 9
     if self.number2_stop == False:
         self.number2 = pyxel.frame_count % 9
     if self.number3_stop == False:          
         self.number3 = pyxel.frame_count % 9

 def draw(self):
     pyxel.cls(0)
     pyxel.text(20, 50, str(self.number1), 7)
     pyxel.text(40, 50, str(self.number2), 7)
     pyxel.text(60, 50, str(self.number3), 7)      
     
     pyxel.rectb(15, 45, 15, 15, pyxel.frame_count % 16)
     pyxel.rectb(35, 45, 15, 15, pyxel.frame_count % 16)
     pyxel.rectb(55, 45, 15, 15, pyxel.frame_count % 16)
     pyxel.rectb(10, 40, 65, 40, 7)            
     
APP()

▲先ほどのサンプルよりはコードが複雑になってきました。今回はスロットのリールのような処理(数字が変わっていく動き)を実現するために、update部分にも処理を書いています。

コードの中身を見ていきます。

 def __init__(self):
     pyxel.init(128, 128, caption="pyxel")
     
     self.number1 = 0
     self.number2 = 0
     self.number3 = 0
     self.number1_stop = False
     self.number2_stop = False
     self.number3_stop = False

▲init部分ではnumber1から3の変数に加えて、リールストップを判定するnumber1_stopからnumber3_stopの変数を定義しました。値は「False」となっていますが、これは真偽型でTrueが真、Falseが偽となるデータ型です。雑に書くと「はい/いいえ」みたいなものですかね。

 def update(self):
     if pyxel.btnp(pyxel.KEY_1):
         self.number1_stop = True
     if pyxel.btnp(pyxel.KEY_2):
         self.number2_stop = True
     if pyxel.btnp(pyxel.KEY_3):
         self.number3_stop = True
     if pyxel.btnp(pyxel.KEY_SPACE):
         self.number1_stop = False
         self.number2_stop = False
         self.number3_stop = False     
         
     if self.number1_stop == False:
         self.number1 = pyxel.frame_count % 9
     if self.number2_stop == False:
         self.number2 = pyxel.frame_count % 9
     if self.number3_stop == False:          
         self.number3 = pyxel.frame_count % 9

▲update部分です。ここではキーボード入力を受け取って、リールを止めたり、再度スタートさせたりします。

if pyxel.btnp(pyxel.KEY_XX):

▲pyxelでの入力判定はの書き方です。「if」は英語で「もしも○○だったら」という意味。プログラミングでは条件分岐に使われます。「XX」の部分は任意のキー名が入ります。今回はそれぞれのリールを止めるキーを、数字キーの1,2,3に、リールの再スタートをスペースキーに設定しました。

     if pyxel.btnp(pyxel.KEY_1):
         self.number1_stop = True
         
      ここを日本語にすると
      
      もしも数字キーの1が押されたら
        self.number1_stopの値をTrueにする
      
      という感じです。

そしてその後に、リールが止まっていない場合に数値を変化させる処理を書いています。

if self.number1_stop == False:

▲1つ目のリールが止まっていない場合の分岐です。if分の判定で「等しい」ということを示すにはイコールを2つ(==)書きます。

self.number1 = pyxel.frame_count % 9

▲数値を変化させる処理です。self.number1に何やら代入していますが、ここは「経過フレームを9で割ったあまり」を代入しています。
少し詳しく書くと、pyxel.frame_countにはプログラム起動時から経過したフレーム数が入っています。ざっくりいうと「経過秒数」のようなものだと思ってください。ただし、デフォルトで1秒は30フレームなので実際は経過秒数よりもっと大きい値が入っています。これを9で割ったあまりを求めます。「割ったあまり」を出すには「%」を使います。
すると以下のようになります。

1 % 9 = 1
2 % 9 = 2
3 % 9 = 3
4 % 9 = 4
5 % 9 = 5
6 % 9 = 6
7 % 9 = 7
8 % 9 = 8
9 % 9 = 0
10 % 9 = 1
11 % 9 = 2
12 % 9 = 3
13 % 9 = 4
14 % 9 = 5
15 % 9 = 6
16 % 9 = 7
17 % 9 = 8
18 % 9 = 0
...................

9の倍数で0なり、そこから8まで増えてまた0になり...。これで数値が0から8のスロットになりました。ちなみにここの「% 9」を「% 10」とか「% 5」とか変えることで、出てくる数値を制御することができます。

 def draw(self):
     pyxel.cls(0)
     pyxel.text(20, 50, str(self.number1), 7)
     pyxel.text(40, 50, str(self.number2), 7)
     pyxel.text(60, 50, str(self.number3), 7)      
     
     pyxel.rectb(15, 45, 15, 15, pyxel.frame_count % 16)
     pyxel.rectb(35, 45, 15, 15, pyxel.frame_count % 16)
     pyxel.rectb(55, 45, 15, 15, pyxel.frame_count % 16)
     pyxel.rectb(10, 40, 65, 40, 7)            
     

▲画面描画部分です。

pyxel.cls(0)

▲まず「pyxel.cls」で画面を初期化します。これをしないと描画が上書きされてぐちゃぐちゃになります。カッコ内は色コードで0は黒なので、この部分は「画面を黒で塗りつぶす」ということになります。

次のブロックは変数を表示しているだけなので割愛。

     pyxel.rectb(15, 45, 15, 15, pyxel.frame_count % 16)
     pyxel.rectb(35, 45, 15, 15, pyxel.frame_count % 16)
     pyxel.rectb(55, 45, 15, 15, pyxel.frame_count % 16)
     pyxel.rectb(10, 40, 65, 40, 7)            

▲最後のブロックは蛇足感はありますが、見た目がさみしいので枠をつけてみた部分です。「pyxel.rectb」は四角形の枠を描画するときに使います。書き方は「pyxel.rectb(x座標, y座標, 横幅, 立幅, 色コード」です。
色コードの指定は「pyxel.frame_count % 16」となっていますが、これは数値を変えた時と同じ理屈で色コードを0から15まで変化させているものになります。

ダウンロード
▲実行してみるとこんな感じ。シンプルなスロットゲームです。

今回はここまで。
単純なスロットゲームですが、数字がそろった際にコインが出たり、特別な役を決めてみたりすると、よりゲームらしくなると思います。
次回はデータ型から「文字列型」を取り上げます

ここまで読んでいただきありがとうございました。

ここまで読んでいただきありがとうございます!