見出し画像

PyxelとChatGPTを使ってPythonを勉強してみる【第1回】


仕事の研修でPythonというプログラミング言語を少し勉強しました。

結局、ちょっと触らせてもらっただけで、今やっている業務では扱わないのですが、結構面白かったのともしかしたら業務で使う時が来るかもしれない、と思い、空いてる時間でPythonを勉強しようと思いました。

ただ、私はお金がありません。プログラミング経験も0。こんな自分でもPythonを継続して勉強できる教材はないかな~?と探していると、「Pyxel」というPythonで動くゲームエンジンがあることを知りました。

Pyxelは主にファミコンやゲームボーイを彷彿とさせる8bitのゲームを作るのが得意なゲームエンジンみたいです。レトロゲームは得意分野や!と思い、早速、手持ちのノートPCにインストールしてみました。

色々調べて何とかPyxelが動くように設定できました。しかし、ここで問題が起こります。Pyxelに関しての教材がネットにあまり転がっていなかったのです。いや、あるにはあるのですが、全くの初心者の私からしたら難しいなと感じました。

もし、すでにPyxelについて知っていて、プログラミングもある程度理解できている人は、↑の方々の記事がとても面白かったので、参考にしてみて下さい。自分でこんなレベルのものが出来るかは分かりませんが、ゆくゆくは挑戦してみたいですね。

さて、困りました。ネットで頼れないとなると、完全自力で学習するしかないのか?不安になった私は、「Python 勉強 無料」みたいなので、調べてみると、「ChatGPTがすごい!!!」みたいな記事を見つけました。

見てみると、「~~みたいなことができるコードを作って!」と頼むと、GPT君が秒でそれっぽいコードを出してくれるとのこと。これはすごい!と思い、もしかしたらPyxelのコードも書いてくれるんじゃね?と実際にやってみると・・・出てきました!しかも、ちゃんと動く!

やったー!これで勉強ができる!と思い、意気揚々でPyxelを動かし始めて、まさに今、勉強している次第です。

さぁ、PyxelとChatGPTと一緒にPythonを勉強してみましょう。

*Pyxelを始める際の設定方法はこちらでは省きます。OSによってインストール方法が違うので、自身の環境にあった方法を試してください。

・・・・・
さて、とりあえずサンプルを確認して遊んでみました。いよいよ、自分でコードを打ってみることに。

GPTを開いて、私はこのような文章でGPTにお願いしてみました。

Pyxelで簡単なゲームを作成してください。

右も左も分からないので、ざっくりな質問を投げてみました。こんな適当でいいんか?すると、

PyxelはPythonで簡単なゲームを作成するための軽量なライブラリです。基本的な使いかたを学ぶために、プレイヤーが星を集めるシンプルなゲームを作成しましょう。以下のコードは、プレイヤーが星を集めるゲームの基本的な実装です。

必要なライブラリのインストール
まず、Pyxelライブラリがインストールされていない場合は、インストールします。
(省略)

おおっ!インストール方法から優しく教えてくれました。ありがたい。

ゲームの実装
以下のコードを使ってプレイヤーが星を集めるゲームを作成します。

import pyxel
import random

# 定数の設定
SCREEN_WIDTH = 160
SCREEN_HEIGHT = 120
PLAYER_SIZE = 8
STAR_SIZE = 4
NUM_STARS = 10

class StarCollectorGame:
    def __init__(self):
        pyxel.init(SCREEN_WIDTH, SCREEN_HEIGHT, caption="Star Collector Game")
        self.reset_game()
        pyxel.run(self.update, self.draw)

    def reset_game(self):
        self.player_x = SCREEN_WIDTH / 2
        self.player_y = SCREEN_HEIGHT / 2
        self.stars = [(random.randint(0, SCREEN_WIDTH - STAR_SIZE), random.randint(0, SCREEN_HEIGHT - STAR_SIZE)) for _ in range(NUM_STARS)]
        self.score = 0

    def update(self):
        self.update_player()
        self.check_star_collisions()

    def update_player(self):
        if pyxel.btn(pyxel.KEY_LEFT):
            self.player_x = max(self.player_x - 2, 0)
        if pyxel.btn(pyxel.KEY_RIGHT):
            self.player_x = min(self.player_x + 2, SCREEN_WIDTH - PLAYER_SIZE)
        if pyxel.btn(pyxel.KEY_UP):
            self.player_y = max(self.player_y - 2, 0)
        if pyxel.btn(pyxel.KEY_DOWN):
            self.player_y = min(self.player_y + 2, SCREEN_HEIGHT - PLAYER_SIZE)

    def check_star_collisions(self):
        for star in self.stars[:]:
            if (self.player_x < star[0] + STAR_SIZE and
                self.player_x + PLAYER_SIZE > star[0] and
                self.player_y < star[1] + STAR_SIZE and
                self.player_y + PLAYER_SIZE > star[1]):
                self.stars.remove(star)
                self.score += 1
                self.spawn_new_star()

    def spawn_new_star(self):
        new_star = (random.randint(0, SCREEN_WIDTH - STAR_SIZE), random.randint(0, SCREEN_HEIGHT - STAR_SIZE))
        self.stars.append(new_star)

    def draw(self):
        pyxel.cls(0)
        pyxel.rect(self.player_x, self.player_y, PLAYER_SIZE, PLAYER_SIZE, pyxel.COLOR_WHITE)
        for star in self.stars:
            pyxel.circ(star[0], star[1], STAR_SIZE // 2, pyxel.COLOR_YELLOW)
        pyxel.text(5, 5, f"Score: {self.score}", pyxel.COLOR_WHITE)

# ゲームの開始
StarCollectorGame()

・・・?

いきなり難しすぎてしょんぼりする私

早速、1つ目の壁です。プログラミング経験者にとっては「簡単じゃん!」と思うかもしれませんが、私はこれすらも難しいと思う程のレベルです。

なので、GPT君にさらにこんな文章を投げてみました。

もう少しシンプルなゲームを作成してください。

すると、

了解しました。それでは、さらにシンプルなゲームを作成しましょう。プレイヤーが1つの星を集めるだけの基本的なゲームを作成します。

さっきのゲームは星10個を集めるゲームでしたが、何とか頼み込んで集める星を1つに絞ってもらいました。これなら、何とかできるかな?

以下のコードを使って、プレイヤーが星を集めるシンプルなゲームを作成します。

import pyxel

#初期化
class Simplegame:
    def __init__(self):
        pyxel.init(160,120)
        
        self.player_x = 72
        self.player_y = 56
        
        self.star_x = pyxel.rndi(0,160)
        self.star_y = pyxel.rndi(0,120)
        
        self.score = 0
        
        pyxel.run(self.update,self.draw)
        
                
    def update(self):
    #playerの移動  
        if pyxel.btn(pyxel.KEY_UP):
            self.player_y = max(self.player_y - 2,0)
        if pyxel.btn(pyxel.KEY_DOWN):
            self.player_y = min(self.player_y + 2,112)
        if pyxel.btn(pyxel.KEY_LEFT):
            self.player_x = max(self.player_x - 2,0)
        if pyxel.btn(pyxel.KEY_RIGHT):
            self.player_x =min(self.player_x + 2,152)
            
    #スターとの衝突判定
        if (self.player_x <= self.star_x <= self.player_x + 8 and
            self.player_y <= self.star_y <= self.player_y + 8):
            self.score += 1
            self.star_x = pyxel.rndi(0,160)
            self.star_y = pyxel.rndi(0,120)
            
    def draw(self):
        pyxel.cls(0)
        pyxel.text(5,4,f"Score:{self.score}",pyxel.COLOR_WHITE)
        pyxel.rect(self.player_x,self.player_y,8,8,pyxel.COLOR_RED)
        pyxel.circ(self.star_x,self.star_y,3,pyxel.COLOR_WHITE)
        
Simplegame()

う、うーん・・・
結構単純なゲームだと思ったのに、この量・・・
これ以上短くするのは難しいと思い、まずはこのコードを題材に勉強することに決めました。およそ40行程度しかないコードですが、初心者にとっては多すぎる量です。

・・・なるほどなるほど。コードの中身を確認すると、要は、

・プレイヤーの移動
・ランダムな場所に星が出現する
・プレイヤーと星との当たり判定

これらの動きを設定している、ということがなんとなく分かります。ただ、全て見知らぬ英語が並んでいるので、GPT君に1つ1つ聞いてみることにしました。

こちらのコードをPythonを初めて勉強する人でも理解できるように丁寧に教えてください。

私が理解できるような説明をしてくれるといいのですが・・・すると、

Pythonを初めて勉強する人でも理解できるように、Pyxelを使ったシンプルなゲームのコードを詳しく説明します。このゲームでは、プレイヤーが動いて星を集めるという簡単なものです。コードを順を追って説明しますね。

初期設定
まず、ゲームを初期化する部分です。

 class Simplegame:
    def __init__(self):
        pyxel.init(160, 120)
        
        self.player_x = 72
        self.player_y = 56
        
        self.star_x = pyxel.rndi(0, 160)
        self.star_y = pyxel.rndi(0, 120)
        
        self.score = 0
        
        pyxel.run(self.update, self.draw)

class Simplegame:
これは新しいクラス(オブジェクト)を作成する宣言です。このクラスの名前は Simplegame です。
def __init__(self):
これはクラスのコンストラクタです。クラスからオブジェクトが作成されるときに自動的に呼ばれるメソッドです。
pyxel.init(160, 120)
これは Pyxel でゲームの画面を幅160ピクセル、高さ120ピクセルに初期化します。
self.player_x = 72 と self.player_y = 56
プレイヤーの初期位置を設定しています。画面の左上が (0, 0) で、x 座標が 72、y 座標が 56 にプレイヤーを配置します。
self.star_x = pyxel.rndi(0, 160) と self.star_y = pyxel.rndi(0, 120)
スター(星)の初期位置をランダムに設定しています。pyxel.rndi(0, 160) は 0 から 160 の間でランダムな整数を返します。
self.score = 0
スコアを 0 に初期化します。
pyxel.run(self.update, self.draw)
Pyxel に update メソッド(ゲームロジックの更新)と draw メソッド(画面の描画)を渡してゲームを開始します。

これまた、丁寧に教えてくださいました。GPT君はいきなり全部のコード内容を解説してくれたのですが、少しずつ勉強したいので、とりあえず、ここまでのコードを完璧に理解したいと思います。

GPT君の説明でここのコードは、ゲームの初期設定を司っている部分だというのはなんとなく分かりました。ただ、一部分からない単語も出てきましたね。クラス?コンストラクタ?オブジェクト?メソッド?・・・

これもGPT君に質問して理解しようと思います。

丁寧な説明ありがとうございます。ただ、以下の単語の意味が分かりませんでした。pyxelにおいて以下の要素はどういう意味なのかを丁寧に教えてください。
・クラス
・コンストラクタ
・オブジェクト
・メソッド

すると、

了解しました。以下では、それぞれの単語について詳しく説明します。

クラス

クラスは、プログラムの中でデータとそれに対する操作(関数)をまとめるための設計図のようなものです。例えば、車を作るための設計図があるように、プログラムでもクラスを使ってデータの構造や操作を定義します。

Pyxelでの例

class Simplegame:

この部分は Simplegame という名前のクラスを定義しています。Simplegame クラスの中には、ゲームの初期設定や更新、描画に関する情報とメソッドが含まれています。

コンストラクタ

コンストラクタは、クラスからオブジェクトを作成するときに自動的に呼ばれる特別なメソッドです。主にオブジェクトの初期設定を行います。Pythonでは、コンストラクタは __init__ という名前のメソッドです。

Pyxelでの例

def __init__(self):

この部分が Simplegame クラスのコンストラクタです。ゲーム画面の初期化、プレイヤーや星の初期位置の設定、スコアの初期化などを行っています。

オブジェクト

オブジェクトは、クラスという設計図から実際に作られた具体的な「もの」です。クラスが設計図なら、オブジェクトはその設計図に基づいて作られた実体です。例えば、クラスが「車」という設計図なら、オブジェクトは「具体的な1台の車」になります。

Pyxelでの例

Simplegame()

ここで Simplegame クラスから Simplegame オブジェクトを作成しています。このオブジェクトが実際にゲームを動かすためのものです。

メソッド

メソッドは、クラスの中に定義された関数のことです。メソッドは、そのクラスから作られたオブジェクトに対して操作を行います。例えば、車クラスに「エンジンをかける」というメソッドがあれば、そのメソッドを使って実際の車オブジェクトのエンジンをかけることができます。

Pyxelでの例

def update(self):
    # プレイヤーの移動やスターとの衝突判定などのコード
def draw(self):
    # 画面の描画に関するコード

これらは Simplegame クラスのメソッドです。update メソッドはゲームのロジックを更新し、draw メソッドは画面を描画します。

総まとめ

以下に簡単にまとめます
クラス: データとその操作をまとめた設計図(例: Simplegame クラス)
コンストラクタ: クラスからオブジェクトを作成する際に初期設定を行う特別なメソッド(例: __init__ メソッド)
オブジェクト: クラスという設計図から作られた具体的なもの(例: Simplegame() で作られたゲームオブジェクト)
メソッド: クラス内で定義される関数で、オブジェクトに対する操作を行う(例: update や draw メソッド)

これらの概念を理解すると、プログラム全体がどのように構造化されているかが分かりやすくなります。

ああ~なんとなくですが分かりました。でも、こちらはネットで詳しく説明されている方の方が分かりやすそうでしたね。

今回はここまで。次回はプレイヤーを十字キーで動かしてみます。


いいなと思ったら応援しよう!

この記事が参加している募集