ChatGPTを使って、ブロック崩しゲームを作ってみた。(pythonプログラミング)
5分で完成。
そんなわけないだろうと思う方は、読んで!
最初に提示されたプログラムでは、操作キーが使えなかったので、質問したところ別のプログラム教えてくれました。環境によっては、1分で作れるかも。
スポンサーリンク
目次
自動生成されるコードの量も簡潔なプログラミング
ブロック崩しは、Pythonで簡単にプログラミングすることができます。以下は、Pythonの「turtle」モジュールを使用してブロック崩しゲームをプログラムする方法の例です。
import turtle
import time
# ゲーム画面の設定
win = turtle.Screen()
win.title("ブロック崩しゲーム")
win.bgcolor("white")
win.setup(width=600, height=600)
# ボールの作成
ball = turtle.Turtle()
ball.shape("circle")
ball.color("red")
ball.penup()
ball.speed(0)
ball.goto(0, -250)
ball.dx = 3
ball.dy = 3
# パドルの作成
paddle = turtle.Turtle()
paddle.shape("square")
paddle.color("blue")
paddle.shapesize(stretch_wid=1, stretch_len=5)
paddle.penup()
paddle.speed(0)
paddle.goto(0, -280)
# ブロックの作成
blocks = []
for i in range(-200, 225, 50):
block = turtle.Turtle()
block.shape("square")
block.color("green")
block.penup()
block.goto(i, 250)
blocks.append(block)
# ボールの移動
while True:
ball.setx(ball.xcor() + ball.dx)
ball.sety(ball.ycor() + ball.dy)
# ボールが壁に当たった時の処理
if ball.xcor() > 290:
ball.dx *= -1
elif ball.xcor() < -290:
ball.dx *= -1
elif ball.ycor() > 290:
ball.dy *= -1
# パドルとの当たり判定
if (ball.ycor() < -270) and (ball.xcor() < paddle.xcor() + 50 and ball.xcor() > paddle.xcor() - 50):
ball.dy *= -1
# ブロックとの当たり判定
for block in blocks:
if (ball.distance(block) < 50):
ball.dy *= -1
block.hideturtle()
blocks.remove(block)
# ゲームオーバー
if ball.ycor() < -300:
break
time.sleep(0.01)
turtle.done()
このプログラムでは、turtleモジュールを使用して、画面上にボール、パドル、ブロックを作成し、ボールを移動させます。ボールが壁やパドル、ブロックに当たったときに適切な処理を行い、ブロックを全て破壊するか、ボールが画面下部に落ちた場合にゲームオーバーとします。
スポンサーリンク
最初のブロック崩しゲームアプリは、キー操作できず。
自動生成されたコードをjupyterに入力し、RUNを押す。シンプルだが、それなりのまさに「ブロックくずし」ではないか。
「あれ、キーボードで、バーが移動してくれない。」
操作の説明をしてもらう
やっぱり、右と左キーで、移動だよね。 だけどできない。
何が問題かを聞く
なんと素晴らしい答えなんだろう。 あなたは、プログラミングの先生ですか? ChatGPTさん。
もしキー操作ができない場合は、以下のような原因が考えられます。
-
turtleモジュールのバージョンが古い キー操作に必要な機能がturtleモジュールに追加されたバージョン以降でなければ、キー操作が正しく動作しない可能性があります。最新版のturtleモジュールをインストールすることをお勧めします。
-
turtle.listen()が呼び出されていない キー操作を受け取るには、turtle.listen()を呼び出す必要があります。この関数を呼び出していない場合は、キー入力が無視されます。turtle.listen()を呼び出して、キー入力を有効にしてください。
-
イベントハンドラーが正しく登録されていない キー入力を受け取るためには、キーイベントを処理するイベントハンドラーを登録する必要があります。イベントハンドラーが正しく登録されていない場合は、キー操作が動作しない可能性があります。turtle.onkeypress()を使用して、イベントハンドラーを正しく登録してください。
上記のいずれかが原因である可能性があります。問題を解決するためには、turtleモジュールのバージョンを確認し、必要に応じて最新版に更新し、turtle.listen()を呼び出し、正しいイベントハンドラーを登録してください。
スポンサーリンク
キー操作ができるように修正したpythonコードを書いてください
「何が問題かを聞いた際に、なんと、修正コードまで提案してくれていた。(が、途中ネットワークエラーで消えてしまい。)
再度、「キー操作ができるように修正したpythonコードを書いてください」と聞くと、
import turtle
# ゲーム画面の設定
screen = turtle.Screen()
screen.title("ブロック崩し")
screen.bgcolor("black")
screen.setup(width=600, height=800)
# パドルの作成
paddle = turtle.Turtle()
paddle.shape("square")
paddle.color("white")
paddle.shapesize(stretch_wid=1, stretch_len=5)
paddle.penup()
paddle.goto(0, -350)
# ボールの作成
ball = turtle.Turtle()
ball.shape("circle")
ball.color("white")
ball.penup()
ball.goto(0, 0)
ball.dx = 5
ball.dy = -5
# ブロックの作成
blocks = []
for i in range(-200, 200, 80):
block = turtle.Turtle()
block.shape("square")
block.color("blue")
block.shapesize(stretch_wid=1, stretch_len=4)
block.penup()
block.goto(i, 250)
blocks.append(block)
# パドルの移動関数
def move_left():
x = paddle.xcor()
if x > -250:
x -= 20
paddle.setx(x)
def move_right():
x = paddle.xcor()
if x < 250:
x += 20
paddle.setx(x)
# キー操作の設定
screen.listen()
screen.onkeypress(move_left, "Left")
screen.onkeypress(move_right, "Right")
# ゲームループ
while True:
# ボールの移動
ball.setx(ball.xcor() + ball.dx)
ball.sety(ball.ycor() + ball.dy)
# 壁との反射
if ball.xcor() > 290 or ball.xcor() < -290:
ball.dx *= -1
if ball.ycor() > 390 or ball.ycor() < -390:
ball.dy *= -1
# パドルとの反射
if ball.ycor() < -340 and ball.xcor() < paddle.xcor() + 50 and ball.xcor() > paddle.xcor() - 50:
ball.dy *= -1
# ブロックとの衝突
for block in blocks:
if ball.distance(block) < 40:
blocks.remove(block)
ball.dy *= -1
block.goto(1000, 1000) # ブロックを画面外に移動させる
# ゲームオーバー判定
if ball.ycor() < -400:
ball.goto(0, 0)
ball.dx *= -1
ball.dy *= -1
# ゲームクリア判定
if not blocks:
ball.goto(0, 0)
ball.dx = 0
ball.dy = 0
turtle.write("GAME CLEAR!", align="center", font=("Arial", 24, "normal"))
# 画面を更新する
screen.update()
# 終了処理
turtle.done()
と提案してくれた。
スポンサーリンク
ついに、ブロック崩しゲームができる。5分でできた。
すごい、今度は、動くブロック崩しゲームができたぞ。 やってみよう。
あれ、これ、ボールが落ちても、ゲームオーバーにならない。
注文つけてみた。(ゲームルール、ブロックの色、量)
もっとブロックが、カラフルで多くて、ボールが落ちたらゲームオーバーになるものを作って欲しいです。
と言ったら、
import turtle
import random
# ゲーム画面の設定
screen = turtle.Screen()
screen.title("ブロック崩し")
screen.bgcolor("black")
screen.setup(width=600, height=800)
# パドルの作成
paddle = turtle.Turtle()
paddle.shape("square")
paddle.color("white")
paddle.shapesize(stretch_wid=1, stretch_len=5)
paddle.penup()
paddle.goto(0, -350)
# ボールの作成
ball = turtle.Turtle()
ball.shape("circle")
ball.color("white")
ball.penup()
ball.goto(0, 0)
ball.dx = random.choice([-5, 5])
ball.dy = -5
# ブロックの作成
colors = ["red", "orange", "yellow", "green", "blue", "purple"]
blocks = []
for y in range(200, 320, 30):
for x in range(-250, 250, 60):
block = turtle.Turtle()
block.shape("square")
block.color(random.choice(colors))
block.shapesize(stretch_wid=1, stretch_len=4)
block.penup()
block.goto(x, y)
blocks.append(block)
# スコアの初期化
score = 0
# スコア表示用のテキスト
score_text = turtle.Turtle()
score_text.speed(0)
score_text.color("white")
score_text.penup()
score_text.hideturtle()
score_text.goto(0, 360)
score_text.write("Score: {}".format(score), align="center", font=("Arial", 24, "normal"))
# ゲームループ
while True:
# ボールの移動
ball.setx(ball.xcor() + ball.dx)
ball.sety(ball.ycor() + ball.dy)
# 壁との反射
if ball.xcor() > 290 or ball.xcor() < -290:
ball.dx *= -1
if ball.ycor() > 390:
ball.dy *= -1
# パドルとの反射
if ball.ycor() < -340 and ball.xcor() < paddle.xcor() + 50 and ball.xcor() > paddle.xcor() - 50:
ball.dy *= -1
# ブロックとの衝突
for block in blocks:
if ball.distance(block) < 40:
blocks.remove(block)
ball.dy *= -1
block.goto(1000, 1000) # ブロックを画面外に移動させる
score += 10
score_text.clear()
score_text.write("Score: {}".format(score), align="center", font=("Arial", 24, "normal"))
# ゲームオーバー判定
if ball.ycor() < -400:
ball.goto(0, 0)
ball.dx = random.choice([-5, 5])
ball.dy = -5
score = 0
score_text.clear()
score
あれ、ソースが、きれている。
追記:ソースが、切れてしまったら、上記の例だと、「# ゲームオーバー判定からソースコード切れているので続きを出してとか聞いてみよう!」
スポンサーリンク
要求どおり、色が増え、ブロックが増えたが、ゲームオーバーにならず。
要求どおり、色が増え、ブロックが増えた。ゲーム開始。
が、ゲームオーバーにならず。(最後まで、コード書いてくれてないため)さらに、再度、キー操作もできなくなった。
追記:最後までコードが出なかった時には、「途中でコードが切れたことを言おう。」
スポンサーリンク
またキー操作ができなくなったことと、ボールが落ちても、ゲームオーバーにならないことを打ち明ける。
キー操作ができない問題は、turtleのスクリーンに対してフォーカスを与えることで解決できます。具体的には、screen.listen()
を呼び出すことでキーイベントを受け取るようになります。
ボールが落ちてもゲームオーバーにならない問題は、ボールが画面外に出た場合にゲームオーバーにする処理を追加することで解決できます。
以下は修正後のコードになります。
↑最初から、修正コード付きで返してくれる。
import turtle
import random
# ゲーム画面の設定
screen = turtle.Screen()
screen.title("ブロック崩し")
screen.bgcolor("black")
screen.setup(width=600, height=800)
screen.tracer(0) # 描画の更新を手動で行う
# パドルの作成
paddle = turtle.Turtle()
paddle.shape("square")
paddle.color("white")
paddle.shapesize(stretch_wid=1, stretch_len=5)
paddle.penup()
paddle.goto(0, -350)
# ボールの作成
ball = turtle.Turtle()
ball.shape("circle")
ball.color("white")
ball.penup()
ball.goto(0, 0)
ball.dx = random.choice([-5, 5])
ball.dy = -5
# ブロックの作成
colors = ["red", "orange", "yellow", "green", "blue", "purple"]
blocks = []
for y in range(200, 320, 30):
for x in range(-250, 250, 60):
block = turtle.Turtle()
block.shape("square")
block.color(random.choice(colors))
block.shapesize(stretch_wid=1, stretch_len=4)
block.penup()
block.goto(x, y)
blocks.append(block)
# スコアの初期化
score = 0
# スコア表示用のテキスト
score_text = turtle.Turtle()
score_text.speed(0)
score_text.color("white")
score_text.penup()
score_text.hideturtle()
score_text.goto(0, 360)
score_text.write("Score: {}".format(score), align="center", font=("Arial", 24, "normal"))
# ゲームオーバー用のテキスト
game_over_text = turtle.Turtle()
game_over_text.speed(0)
game_over_text.color("white")
game_over_text.penup()
game_over_text.hideturtle()
game_over_text.goto(0, 0)
game_over_text.write("Game Over", align="center", font=("Arial", 48, "normal"))
game_over_text.hideturtle()
# キー操作用の関数
def move_left():
x = paddle.xcor()
if x > -250:
paddle.setx(x - 20)
def move_right():
x = paddle.xcor()
if x < 250:
paddle.setx(x + 20)
# キー操作の設定
screen.listen()
screen.onkeypress(move_left, "Left")
screen.onkeypress(move_right, "Right")
# ゲームループ
while True:
screen.update() # 描画を更新する
# ボールの移動
む、む、、、プログラムが、途中で切れている。
このあとも、何回か試したが、プログラムが切れる。
無料で、使える範囲は、ここまでってことなのだろうか。
追記:途中で切れたところから、教えてとChatGPTに聞こう!
出典:ChatGPT