您现在的位置是:首页 >技术交流 >ChatGPT4写贪吃蛇游戏(Notion)[pygame的学习]网站首页技术交流

ChatGPT4写贪吃蛇游戏(Notion)[pygame的学习]

寅恪光潜 2023-05-28 04:00:02
简介ChatGPT4写贪吃蛇游戏(Notion)[pygame的学习]

这里我使用的是Notion写出来的贪吃蛇,开始使用百度的文心一言来试下效果,生成了好几次的代码都是有bug,所以生成代码这块还得是ChatGPT。这篇主要就是了解下pygame库的一些方法,当然在没有安装这个库的,需要先安装,安装的时候还是一直都推荐的安装方法,带上国内镜像地址,这样下载速度快很多,本人喜欢带豆瓣镜像,在命令行执行如下命令:

pip install pygame -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com

其中对于Notion在前面也有介绍,还跟百度的文心一言做了一下对比:
百度文心一言与Notion的比较(机器人通信的例子)
Notion的使用还是很方便的,有桌面客户端,登录一次之后,后期就不需要翻墙了。跟国内使用没有区别,推荐大家去体验。

代码来自Notion自动生成的,本人做了一些注释和修改,方便大家查阅,比如可以显示中文,使用自定义图片作为背景,而不是颜色填充。这里未修改之前的中文是乱码,需要注意的是这里的乱码不属于常规意义的编码问题,属于字体的问题。

font_style = pygame.font.SysFont(None, 30)

这种默认系统的字体,如果是中文就会显示乱码,于是指定系统里的一种字体:

font_style = pygame.font.Font('C:/WINDOWS/Fonts/simkai.ttf', 20)

贪吃蛇是一种比较简单的游戏,所以对于熟悉pygame库来说,是一种很好的入门示例,代码如下:

import pygame
import time
import random

pygame.init()

white = (255, 255, 255)
black = (0, 0, 0)
red = (255, 0, 0)
green = (0, 255, 0)
blue = (50, 153, 213)
# 游戏界面的宽高
dis_width = 600
dis_height = 400
dis = pygame.display.set_mode(size=(dis_width,dis_height)) #若size=(0,0)为全屏
pygame.display.set_caption('贪吃蛇')

clock = pygame.time.Clock() #每秒帧数(控制游戏的速度)

snake_block = 10 #蛇和食物的大小
snake_speed = 15 #蛇的频率或说速度

#font_style = pygame.font.SysFont(None, 30)
#显示中文
font_style = pygame.font.Font('C:/WINDOWS/Fonts/simkai.ttf', 20) 

# 绘制蛇(随着键盘操作,不断更新xy坐标位置)
def our_snake(snake_block, snake_List):
    for x in snake_List:
        pygame.draw.rect(dis, black, [x[0], x[1], snake_block, snake_block])

# 将游戏结束时的文字,绘制到屏幕1/6宽,1/3高的位置
def message(msg, color):
    mesg = font_style.render(msg, True, color)
    dis.blit(mesg, [dis_width / 6, dis_height / 3])

bg=pygame.image.load("D:/n.jpg")
def gameLoop():
    game_over = False
    game_close = False

    x1 = dis_width / 2
    y1 = dis_height / 2

    x1_change = 0
    y1_change = 0

    snake_List = []
    Length_of_snake = 1

    # 随机食物
    foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0
    foody = round(random.randrange(0, dis_height - snake_block) / 10.0) * 10.0

    while not game_over:

        while game_close == True:
            #dis.fill(blue)
            dis.blit(bg,bg.get_rect())
            message("游戏结束!按大写Q键退出或者C键重新开始游戏", white)
            pygame.display.update()

            for event in pygame.event.get():
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_q:
                        game_over = True
                        game_close = False
                    if event.key == pygame.K_c:
                        gameLoop()
        
        # 按键事件下捕获上下左右键,注意方向
        for event in pygame.event.get():
            #右上角的关闭
            if event.type == pygame.QUIT:
                game_over = True
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    x1_change = -snake_block
                    y1_change = 0
                elif event.key == pygame.K_RIGHT:
                    x1_change = snake_block
                    y1_change = 0
                elif event.key == pygame.K_UP:
                    y1_change = -snake_block
                    x1_change = 0
                elif event.key == pygame.K_DOWN:
                    y1_change = snake_block
                    x1_change = 0
        # 越界了,游戏结束
        if x1 >= dis_width or x1 < 0 or y1 >= dis_height or y1 < 0:
            game_close = True
        # 根据方向键进行坐标的更新
        x1 += x1_change
        y1 += y1_change
        #dis.fill(blue)
        bg=pygame.image.load("D:/n.jpg")
        dis.blit(bg,bg.get_rect())
        # 绘制食物
        pygame.draw.rect(dis, green, [foodx, foody, snake_block, snake_block])
        snake_Head = []
        snake_Head.append(x1)
        snake_Head.append(y1)
        snake_List.append(snake_Head)
        if len(snake_List) > Length_of_snake:
            del snake_List[0]

        # 首尾相连游戏结束
        for x in snake_List[:-1]:
            if x == snake_Head:
                game_close = True
        # 时刻更新蛇的状态
        our_snake(snake_block, snake_List)
        pygame.display.update()
        
        # 吃到食物,随机更新食物位置
        if x1 == foodx and y1 == foody:
            foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0
            foody = round(random.randrange(0, dis_height - snake_block) / 10.0) * 10.0
            Length_of_snake += 1
            print("真棒!")

        clock.tick(snake_speed)

    pygame.quit()
    quit()

gameLoop()

 

 

修改背景为自定义图片:

 

当然还可以加一些音乐之类的,玩起来更有意思。

PS:说个题外话,很多人对于ChatGPT4的出现,产生了焦虑感,感觉会替代很多工作,甚至有人调侃首先就是代替了程序员的工作,在我看来是不会的,我一直保持一种乐观的看法,这种里程碑式的产品问世,大大提高了人们的工作效率,作为一种工具是不会将人代替的,当然会解雇一些人这个是肯定的。就以这个游戏代码为例来说明,如果说跨行业的来做程序,虽然可以运行,但需求是无止境的,就拿前面说的中文乱码的例子来说吧,如果只是寄希望于ChatGPT4,我想它也可能不会给出正确答案,因为ChatGPT4再怎么厉害,它还是需要大数据做基础的,而这些数据对于乱码问题基本都归咎于编码问题,于是会给出很多关于修改编码的答案,那我们知道这里其实就是指系统字体的原因。
对于能替代的事情,一般是一些重复的事情,比如工厂流水线操作,这些未来都将被机器人代替,而对于需要人去干预才能做好的事情,还是没法代替的。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。