在ChatGPT中可以单独制作游戏吗?

首先

你好!我是一名平时忙于写报告的高中生(3年级)。
这次我对于能否用Chat GPT3.5制作游戏感到好奇,所以进行了总结。
顺便说一下,这次我尝试制作了三个游戏。
如果出现错误或者无法执行的情况,我会跳过。

ChatGPT的首选语言是中文。

如果不指定语言就写程序的话,ChatGPT会被Python渗透,因为ChatGPT推荐使用Python这个非常慢的脚本语言。(虽然我主要写的语言也是Python…)

如何让ChatGPT生成语言的方法

我以前对编程感兴趣,尝试过几次写代码,但是即使告诉他们我想要做什么,他们也只告诉我使用的技术,而没有帮我写代码。所以每次请求时,我会额外加上一句话”请输出代码”,这样他们就会帮我生成代码。另外,ChatGPT更喜欢使用Python语言,所以如果没有指定语言并要求输出代码,注意代码将会以Python语言输出!

我的世界

我请求您首先制作超级热门游戏Mincraft。

请制作一款类似Minecraft风格的简单游戏,并输出源代码。

''' 
ChatGPT
Minecraft風のシンプルなゲームを作るには、
言語やプラットフォームによって異なるアプローチがあります。
ここでは、PythonとPygameを使用して、
シンプルなブロックビルディングゲームの例を示します。
以下は、Pythonのコード例です。
'''
import pygame
import sys

# 初期化
pygame.init()

# 画面の設定
width, height = 800, 600
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption("Simple Block Game")

# 色の設定
white = (255, 255, 255)
blue = (0, 0, 255)

# プレイヤーの初期位置
player_x, player_y = width // 2, height // 2
player_size = 50

# ブロックの初期位置
block_size = 50
blocks = [(100, 100), (200, 200), (300, 300)]

# ゲームループ
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

    # キー入力の処理
    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        player_x -= 5
    if keys[pygame.K_RIGHT]:
        player_x += 5
    if keys[pygame.K_UP]:
        player_y -= 5
    if keys[pygame.K_DOWN]:
        player_y += 5

    # 描画
    screen.fill(white)
    pygame.draw.rect(screen, blue, (player_x, player_y, player_size, player_size))

    for block in blocks:
        pygame.draw.rect(screen, blue, (block[0], block[1], block_size, block_size))

    pygame.display.flip()
'''
このコードはPygameを使用しています。
PygameはPythonのゲーム開発ライブラリであり、
簡単な2Dゲームを作成するのに適しています。
上記のコードでは、プレイヤーが矢印キーを使用して移動し、
青いブロックを配置できるシンプルなゲームが作成されます。

ゲームのループ内でキー入力を処理し、
描画を行っています。このコードは基本的な概念を示しているため、
さらに機能を追加したり、改良したりすることができます。
'''
スクリーンショット 2023-12-04 16.50.45.png

我想大家都知道的Minecraft是一款3D游戏。

请使用三维技术来制作

'''
ChatGPT
3Dゲームを制作するには、
通常は専門的な3Dグラフィックスライブラリやエンジンが必要です。
PythonにはPygameやPyOpenGLなどのライブラリがありますが、
これらは2Dグラフィックスに特化しており、
簡単には3Dゲームを構築するのが難しいです。

以下に、PythonとPygameを使用して簡単な3Dブロックワールドの例を示します。
ただし、注意が必要で、これは非常に基本的なものであり、
実際の3Dゲーム制作に必要な機能や技術には程遠いものです。
本格的な3Dゲーム開発には、
通常は専用のゲームエンジンやフレームワークが使用されます。
'''import pygame
from pygame.locals import *
from OpenGL.GL import *
from OpenGL.GLU import *

vertices = (
    (1, -1, -1),
    (1, 1, -1),
    (-1, 1, -1),
    (-1, -1, -1),
    (1, -1, 1),
    (1, 1, 1),
    (-1, -1, 1),
    (-1, 1, 1)
)

edges = (
    (0, 1),
    (1, 2),
    (2, 3),
    (3, 0),
    (4, 5),
    (5, 6),
    (6, 7),
    (7, 4),
    (0, 4),
    (1, 5),
    (2, 6),
    (3, 7)
)

def draw_cube():
    glBegin(GL_LINES)
    for edge in edges:
        for vertex in edge:
            glVertex3fv(vertices[vertex])
    glEnd()

def main():
    pygame.init()
    display = (800, 600)
    pygame.display.set_mode(display, DOUBLEBUF | OPENGL)
    gluPerspective(45, (display[0] / display[1]), 0.1, 50.0)
    glTranslatef(0.0, 0.0, -5)

    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()

        glRotatef(1, 3, 1, 1)
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
        draw_cube()
        pygame.display.flip()
        pygame.time.wait(10)

if __name__ == "__main__":
    main()
スクリーンショット 2023-12-04 16.56.55.png

?这就是Minecraft吗…
我觉得Minecraft更难了,所以不行,下一个吧!!

超级马里奥兄弟

我来尝试创作一个世界知名的游戏《超级马里奥兄弟》的Minecraft版本。

请使用2D设计一个类似超级马里奥兄弟的游戏。

'''
ゲームの作成には、プログラミングの知識や開発環境が必要です。
以下に、PythonとPygameというライブラリを使用して2Dのスーパーマリオ風のゲームを作成する基本的な手順を示します。
なお、PythonやPygameのバージョンによっては、
コードの一部が変更される可能性があります。

Pythonのインストール:
最初にPythonをインストールしてください。公式ウェブサイト(https://www.python.org/)から最新のバージョンをダウンロードしてインストールします。

Pygameのインストール:
コマンドライン(ターミナルやコマンドプロンプト)を開き、以下のコマンドを実行してPygameをインストールします。
以下は、基本的なスーパーマリオ風のゲームの例です。ファイル名をsuper_mario.pyなどに保存してください。
'''

import pygame
from pygame.locals import *

pygame.init()

# ゲーム画面の設定
screen_width, screen_height = 800, 600
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("Super Mario Clone")

# キャラクターの初期位置
player_x, player_y = 50, 500

# ゲームループ
running = True
while running:
    for event in pygame.event.get():
        if event.type == QUIT:
            running = False

    # ゲームロジック

    # 描画
    screen.fill((255, 255, 255))  # 背景色
    pygame.draw.rect(screen, (255, 0, 0), (player_x, player_y, 50, 50))  # プレイヤーの描画

    pygame.display.flip()

pygame.quit()
スクリーンショット 2023-12-04 22.46.45.png

完成したかどうかわかりませんが、赤いボックスが操作できない状態で作られました。

import pygame
from pygame.locals import *

pygame.init()

# ゲーム画面の設定
screen_width, screen_height = 800, 600
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("Super Mario Clone")

# プレイヤーの設定
player_width, player_height = 50, 50
player_x, player_y = 50, 500
player_velocity_x, player_velocity_y = 0, 0
player_speed = 5
is_jumping = False
jump_count = 10

# 床の設定
floor_height = 100
floor_color = (0, 255, 0)

# 敵キャラクターの設定
enemy_width, enemy_height = 50, 50
enemy_x, enemy_y = screen_width - enemy_width, screen_height - floor_height - enemy_height
enemy_speed = 3

# ゲームループ
running = True
while running:
    for event in pygame.event.get():
        if event.type == QUIT:
            running = False

    # キー入力の処理
    keys = pygame.key.get_pressed()
    if keys[K_LEFT]:
        player_velocity_x = -player_speed
    elif keys[K_RIGHT]:
        player_velocity_x = player_speed
    else:
        player_velocity_x = 0

    # ジャンプ処理
    if not is_jumping:
        if keys[K_SPACE]:
            is_jumping = True
    else:
        if jump_count >= -10:
            neg = 1
            if jump_count < 0:
                neg = -1
            player_velocity_y = (jump_count ** 2) * 0.5 * neg
            jump_count -= 1
        else:
            is_jumping = False
            jump_count = 10

    # プレイヤーの移動
    player_x += player_velocity_x
    player_y -= player_velocity_y  # y座標を減算することで上方向に移動

    # 画面端の処理
    if player_x < 0:
        player_x = 0
    elif player_x > screen_width - player_width:
        player_x = screen_width - player_width

    # 床との衝突判定
    if player_y > screen_height - floor_height - player_height:
        player_y = screen_height - floor_height - player_height
        is_jumping = False
        jump_count = 10

    # 敵キャラクターの移動
    enemy_x -= enemy_speed
    if enemy_x < 0:
        enemy_x = screen_width - enemy_width

    # プレイヤーと敵キャラクターの接触判定
    if (
        player_x < enemy_x + enemy_width
        and player_x + player_width > enemy_x
        and player_y < enemy_y + enemy_height
        and player_y + player_height > enemy_y
    ):
        print("Game Over!")
        running = False

    # 描画
    screen.fill((255, 255, 255))  # 背景色

    # 床の描画
    pygame.draw.rect(screen, floor_color, (0, screen_height - floor_height, screen_width, floor_height))

    # プレイヤーの描画
    pygame.draw.rect(screen, (255, 0, 0), (player_x, player_y, player_width, player_height))

    # 敵キャラクターの描画
    pygame.draw.rect(screen, (0, 0, 255), (enemy_x, enemy_y, enemy_width, enemy_height))

    pygame.display.flip()

pygame.quit()
スクリーンショット 2023-12-04 22.52.17.png

虽然大致了解了地形和敌方角色的情况,但实际玩了之后发现玩家的操控真是差劲透顶,敌方角色的动作也非常快速,一次都没能躲避成功(顺便说一下,我的朋友竟然成功躲过了三次)。

这之后我试图把调整的工作交给他,但是他似乎完全没有给我任何改善的迹象,所以我放弃了。

打砖块

考虑到这样简单的块破坏游戏应该能够做,我决定让他试试。

请告诉我打破砖块游戏的源代码。

'''
もちろんです!ブロック崩しゲームのソースコードは、
プログラミング言語やゲームエンジンに依存します。
以下は、PythonとPygameを使用した基本的なブロック崩しゲームの例です。
PygameはPythonのゲーム開発用ライブラリで、インストールする必要があります。
'''
import pygame
import sys
from pygame.locals import *

# 初期化
pygame.init()

# 画面サイズ
WIDTH, HEIGHT = 640, 480

# 色
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)

# パドルのサイズと速度
PADDLE_WIDTH, PADDLE_HEIGHT = 100, 10
PADDLE_SPEED = 10

# ボールのサイズと速度
BALL_SIZE = 20
BALL_SPEED = 5

# 画面の作成
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("ブロック崩し")

# パドルの初期位置
paddle_x = (WIDTH - PADDLE_WIDTH) // 2
paddle_y = HEIGHT - PADDLE_HEIGHT - 10

# ボールの初期位置と速度
ball_x = WIDTH // 2
ball_y = HEIGHT // 2
ball_dx = BALL_SPEED
ball_dy = BALL_SPEED

# メインループ
while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()

    keys = pygame.key.get_pressed()
    if keys[K_LEFT] and paddle_x > 0:
        paddle_x -= PADDLE_SPEED
    if keys[K_RIGHT] and paddle_x < WIDTH - PADDLE_WIDTH:
        paddle_x += PADDLE_SPEED

    # ボールの移動
    ball_x += ball_dx
    ball_y += ball_dy

    # 壁との反射
    if ball_x <= 0 or ball_x >= WIDTH - BALL_SIZE:
        ball_dx = -ball_dx
    if ball_y <= 0 or ball_y >= HEIGHT - BALL_SIZE:
        ball_dy = -ball_dy

    # パドルとの衝突判定
    if (
        ball_y + BALL_SIZE >= paddle_y
        and paddle_x <= ball_x <= paddle_x + PADDLE_WIDTH
    ):
        ball_dy = -ball_dy

    # 画面の描画
    screen.fill(BLACK)
    pygame.draw.rect(screen, WHITE, (paddle_x, paddle_y, PADDLE_WIDTH, PADDLE_HEIGHT))
    pygame.draw.ellipse(screen, RED, (ball_x, ball_y, BALL_SIZE, BALL_SIZE))

    pygame.display.flip()
    pygame.time.Clock().tick(30)
スクリーンショット 2023-12-04 23.04.22.png

请给它增加游戏元素吧
ChatGPT

'''
ChatGPT
ゲーム性を追加するために、以下のような要素を導入できます:

ブロックの追加:
ブロックを画面上にランダムまたは固定の配置で追加し、ボールがブロックに当たったときにブロックを削除します。ブロックをすべて削除したら、新しいレベルに進むなどの概念を導入できます。

得点の計算:
ブロックを破壊したときに得点を加算し、プレイヤーのスコアを表示します。スコアに基づいて難易度を調整することもできます。

レベルの進行:
一定のスコアに達すると、新しいレベルに進むようにします。新しいレベルでは、ブロックの配置やボールの速度などが変化します。

パワーアップ:
特定の条件で出現するアイテムやパワーアップを導入し、それを取得すると一時的な強化が得られるようにします。例えば、ボールが2つになる、パドルが広がるなどです。

ゲームオーバーとリスタート:
プレイヤーがボールを落としてしまった場合、ライフを減らしてゲームオーバーにすることができます。その後、リスタートオプションを提供することで、プレイヤーが再挑戦できます。

以下に、ブロック崩しゲームにこれらの概念を追加したサンプルコードを示します。このコードはさらに拡張できますが、基本的なアイデアはここにあります:
'''
import pygame
import sys
import random
from pygame.locals import *

# 初期化
pygame.init()

# 画面サイズ
WIDTH, HEIGHT = 640, 480

# 色
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)

# パドルのサイズと速度
PADDLE_WIDTH, PADDLE_HEIGHT = 100, 10
PADDLE_SPEED = 10

# ボールのサイズと速度
BALL_SIZE = 20
BALL_SPEED = 5

# ブロックのサイズ
BLOCK_WIDTH, BLOCK_HEIGHT = 60, 20

# レベルごとのブロックの行数と列数
LEVEL_ROWS, LEVEL_COLS = 5, 10

# 画面の作成
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("ブロック崩し")

# パドルの初期位置
paddle_x = (WIDTH - PADDLE_WIDTH) // 2
paddle_y = HEIGHT - PADDLE_HEIGHT - 10

# ボールの初期位置と速度
ball_x = WIDTH // 2
ball_y = HEIGHT // 2
ball_dx = BALL_SPEED * random.choice([1, -1])
ball_dy = BALL_SPEED

# ブロックの初期化
def initialize_blocks():
    blocks = []
    for row in range(LEVEL_ROWS):
        for col in range(LEVEL_COLS):
            block_x = col * (BLOCK_WIDTH + 5)
            block_y = row * (BLOCK_HEIGHT + 5) + 50
            blocks.append(pygame.Rect(block_x, block_y, BLOCK_WIDTH, BLOCK_HEIGHT))
    return blocks

blocks = initialize_blocks()

# スコアとライフの初期化
score = 0
lives = 3

# フォントの設定
font = pygame.font.Font(None, 36)

# メインループ
while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()

    keys = pygame.key.get_pressed()
    if keys[K_LEFT] and paddle_x > 0:
        paddle_x -= PADDLE_SPEED
    if keys[K_RIGHT] and paddle_x < WIDTH - PADDLE_WIDTH:
        paddle_x += PADDLE_SPEED

    # ボールの移動
    ball_x += ball_dx
    ball_y += ball_dy

    # 壁との反射
    if ball_x <= 0 or ball_x >= WIDTH - BALL_SIZE:
        ball_dx = -ball_dx
    if ball_y <= 0:
        ball_dy = -ball_dy

    # パドルとの衝突判定
    if (
        ball_y + BALL_SIZE >= paddle_y
        and paddle_x <= ball_x <= paddle_x + PADDLE_WIDTH
    ):
        ball_dy = -ball_dy

    # ブロックとの衝突判定
    for block in blocks:
        if block.colliderect(pygame.Rect(ball_x, ball_y, BALL_SIZE, BALL_SIZE)):
            blocks.remove(block)
            ball_dy = -ball_dy
            score += 10

    # レベルクリア判定
    if not blocks:
        # 次のレベルへ進む
        blocks = initialize_blocks()
        ball_dy = -ball_dy

    # ボールが底に到達した場合
    if ball_y >= HEIGHT:
        lives -= 1
        ball_x = WIDTH // 2
        ball_y = HEIGHT // 2
        ball_dy = BALL_SPEED
        if lives == 0:
            # ゲームオーバー処理
            print("Game Over")
            pygame.quit()
            sys.exit()

    # 画面の描画
    screen.fill(BLACK)
    pygame.draw.rect(screen, WHITE, (paddle_x, paddle_y, PADDLE_WIDTH, PADDLE_HEIGHT))
    pygame.draw.ellipse(screen, RED, (ball_x, ball_y, BALL_SIZE, BALL_SIZE))

    for block in blocks:
        pygame.draw.rect(screen, WHITE, block)

    # スコアとライフの表示
    score_text = font.render("Score: {}".format(score), True, WHITE)
    screen.blit(score_text, (10, 10))

    lives_text = font.render("Lives: {}".format(lives), True, WHITE)
    screen.blit(lives_text, (WIDTH - 100, 10))

    pygame.display.flip()
    pygame.time.Clock().tick(30)
スクリーンショット 2023-12-04 23.08.06.png

顺便提一下,当要求加入新功能时,玩家突然消失了,所以我们就在这里结束吧。

结束

这次我让ChatGPT来制作游戏,但我认为与通常自己绘制相比,难度应该要高得多。
也许GPT4可以输出更复杂的代码,但目前只能免费使用的GPT3.5只能制作非常简单的东西,如果想添加新功能,可能会遇到错误或无法运行的情况。
如果要进行代码修改等操作,使用ChatGPT会非常有帮助,但仅靠GPT进行游戏开发似乎还需要一段时间。

赠品

我用ChatGPT的竞争对手Microsoft的bingAI以及Google的Bard进行了尝试,
Bing的表现比我想象的还要差,对聊天有限制。
Bard在遇到错误时几乎只有同样的代码输出(比ChatGPT还糟糕),而且投给Bard一个错误时,它有时回复的是英文,这让我相当恼火。
不管怎样,GPT3.5君表现出色。

广告
将在 10 秒后关闭
bannerAds