世界を変えるテクノロジー、人達を追う(本サイトでは、「アフィリエイト広告」を使用しています)

テクノロジーの羅針盤

AI ChatGPT GPT4 python プログラミング

ChatGPTを使って、5分で「ブロック崩しゲーム」を作ってみた チャットジーピーティー

投稿日:2023年3月25日 更新日:

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さん

 

もしキー操作ができない場合は、以下のような原因が考えられます。

  1. turtleモジュールのバージョンが古い キー操作に必要な機能がturtleモジュールに追加されたバージョン以降でなければ、キー操作が正しく動作しない可能性があります。最新版のturtleモジュールをインストールすることをお勧めします。

  2. turtle.listen()が呼び出されていない キー操作を受け取るには、turtle.listen()を呼び出す必要があります。この関数を呼び出していない場合は、キー入力が無視されます。turtle.listen()を呼び出して、キー入力を有効にしてください。

  3. イベントハンドラーが正しく登録されていない キー入力を受け取るためには、キーイベントを処理するイベントハンドラーを登録する必要があります。イベントハンドラーが正しく登録されていない場合は、キー操作が動作しない可能性があります。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

 

-AI, ChatGPT, GPT4, python, プログラミング

Copyright© テクノロジーの羅針盤 , 2024 All Rights Reserved.