同时向讯飞星火、文心一言和通义千问三个国产AI模型提个相同的问题:

“python 写一个贪吃蛇的游戏代码”

看哪一家AI写的程序直接能用,谁就胜出!

讯飞星火 

讯飞星火给出的代码:

import pygame

import sys

import random

# 初始化pygame

pygame.init()

# 设置屏幕大小

screen_size = (640, 480)

screen = pygame.display.set_mode(screen_size)

# 设置游戏标题

pygame.display.set_caption("贪吃蛇")

# 定义颜色

WHITE = (255, 255, 255)

GREEN = (0, 255, 0)

RED = (255, 0, 0)

# 蛇的初始位置

snake_pos = [[100, 100], [80, 100], [60, 100]]

# 食物的初始位置

food_pos = [300, 300]

# 蛇的初始速度

snake_speed = [20, 0]

# 主循环

while True:

# 处理游戏事件

for event in pygame.event.get():

if event.type == pygame.QUIT:

pygame.quit()

sys.exit()

elif event.type == pygame.KEYDOWN:

if event.key == pygame.K_UP:

snake_speed = [0, -20]

elif event.key == pygame.K_DOWN:

snake_speed = [0, 20]

elif event.key == pygame.K_LEFT:

snake_speed = [-20, 0]

elif event.key == pygame.K_RIGHT:

snake_speed = [20, 0]

# 更新蛇的位置

snake_pos.insert(0, [snake_pos[0][0] + snake_speed[0], snake_pos[0][1] + snake_speed[1]])

# 检查蛇头是否碰到食物

if snake_pos[0] == food_pos:

food_pos = [random.randrange(1, screen_size[0] // 20) * 20, random.randrange(1, screen_size[1] // 20) * 20]

else:

snake_pos.pop()

# 检查蛇头是否碰到墙壁或者蛇身

if snake_pos[0][0] < 0 or snake_pos[0][0] >= screen_size[0] or snake_pos[0][1] < 0 or snake_pos[0][1] >= screen_size[1] or snake_pos[0] in snake_pos[1:]:

pygame.quit()

sys.exit()

# 绘制游戏界面

screen.fill(WHITE)

for pos in snake_pos:

pygame.draw.rect(screen, GREEN, pygame.Rect(pos[0], pos[1], 20, 20))

pygame.draw.rect(screen, RED, pygame.Rect(food_pos[0], food_pos[1], 20, 20))

pygame.display.flip()

# 控制游戏速度

pygame.time.Clock().tick(10)

按F5执行,运行结果如下:

文心一言

文心一言给出的代码:

``` import pygame   import random      # 初始化pygame   pygame.init()      # 定义颜色   WHITE = (255, 255, 255)      # 定义屏幕大小   SCREEN_WIDTH = 400   SCREEN_HEIGHT = 400      # 创建屏幕   screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))      # 设置标题   pygame.display.set_caption("Snake Game")      # 创建时钟对象,用于控制游戏速度   clock = pygame.time.Clock()      # 创建蛇和食物的初始位置和大小   snake_parts = [[100, 50], [90, 50], [80, 50]]   snake_head = [70, 50]   food_x = random.randint(1, 19) * 20   food_y = random.randint(1, 19) * 20   snake_size = 20   food_size = 20      # 定义蛇和食物的运动方向和速度   snake_dir = [2, 0]   snake_speed = 10   food_speed = 5      # 定义游戏状态:进行中或结束   game_active = True      # 游戏循环   while game_active:       # 处理事件       for event in pygame.event.get():           if event.type == pygame.QUIT:               game_active = False           elif event.type == pygame.KEYDOWN:               if event.key == pygame.K_UP and snake_dir != [2, 0]: snake_dir = [0, -1]               elif event.key == pygame.K_DOWN and snake_dir != [2, 0]: snake_dir = [0, 1]               elif event.key == pygame.K_LEFT and snake_dir != [1, 0]: snake_dir = [-1, 0]               elif event.key == pygame.K_RIGHT and snake_dir != [3, 0]: snake_dir = [1, 0]          # 移动蛇头,如果碰到食物,则加长蛇身,并重新生成食物位置       snake_head[0] += snake_dir[0] * snake_speed       snake_head[1] += snake_dir[1] * snake_speed       if snake_head[0] == food_x and snake_head[1] == food_y:           food_x = random.randint(1, 19) * 20           food_y = random.randint(1, 19) * 20           snake_parts.insert(0, list(snake_head))       else:           snake_parts.pop()       # 如果蛇头超出屏幕边界,则游戏结束       if snake_head[0] < 0 or snake_head[0] >= SCREEN_WIDTH or snake_head[1] < 0 or snake_head[1] >= SCREEN_HEIGHT:           game_active = False       # 如果蛇头撞到自己的身体,则游戏结束       for part in snake_parts:           if part == list(snake_head): continue           if part[0] == snake_head[0] and part[1] == snake_head[1]:               game_active = False               break       # 将蛇身和食物绘制到屏幕上,刷新屏幕显示结果       screen.fill(WHITE)       for part in snake_parts:           pygame.draw.rect(screen, WHITE, pygame.Rect(part[0], part[1], snake_size, snake_size))       pygame.draw.rect(screen, WHITE, pygame.Rect(food_x, food_y, food_size, food_size))       pygame.display.flip()       # 控制游戏速度,避免程序运行过快导致游戏体验不佳,同时保证游戏运行流畅度,避免卡顿现象发生。       clock.tick(60)  # 每秒60帧,即每秒游戏画面更新60次。 ```

按F5执行,报以下错误:

pygame 2.5.0 (SDL 2.28.0, Python 3.11.0) Hello from the pygame community. https://www.pygame.org/contribute.html Traceback (most recent call last):   File "E:\.py\snake.py", line 59, in     snake_parts.pop() IndexError: pop from empty list

通义千问

通义千问给出的代码:

```python import pygame import sys import random

# 初始化 Pygame pygame.init()

# 设置屏幕大小和标题 screen = pygame.display.set_mode((400, 400)) pygame.display.set_caption('Snaky')

# 设置游戏速度 clock = pygame.time.Clock()

# 蛇体、食物的大小 cell_size = 10

# 蛇的初始位置、方向和长度 snake_x = 200 snake_y = 200 snake_direction = 'right' snake_length = 3

# 食物的初始位置 food_x = random.randint(0, 380 - cell_size) food_y = random.randint(0, 380 - cell_size)

# 蛇移动的方向向量 right = (1, 0) left = (-1, 0) up = (0, -1) down = (0, 1)

# 游戏是否结束 game_over = False

# 游戏主循环 while not game_over:     # 处理事件     for event in pygame.event.get():         if event.type == pygame.QUIT:             game_over = True         elif event.type == pygame.KEYDOWN:             if event.key == pygame.K_UP and snake_direction != 'down':                 snake_direction = 'up'             elif event.key == pygame.K_DOWN and snake_direction != 'up':                 snake_direction = 'down'             elif event.key == pygame.K_LEFT and snake_direction != 'right':                 snake_direction = 'left'             elif event.key == pygame.K_RIGHT and snake_direction != 'left':                 snake_direction = 'right'

    # 更新蛇的位置     if snake_direction == 'right':         snake_x += cell_size     elif snake_direction == 'left':         snake_x -= cell_size     elif snake_direction == 'up':         snake_y -= cell_size     elif snake_direction == 'down':         snake_y += cell_size          # 检查蛇是否碰到墙壁或自己的身体     if snake_x < 0 or snake_x >= 400 - cell_size or snake_y < 0 or snake_y >= 400 - cell_size:         game_over = True     for i in range(snake_length - 1, -1, -1):         if snake_x == snake_body[i][0] and snake_y == snake_body[i][1]:             game_over = True

    # 检查蛇是否吃到食物     if snake_x == food_x and snake_y == food_y:         food_x = random.randint(0, 380 - cell_size)         food_y = random.randint(0, 380 - cell_size)         snake_length += 1         snake_body.append((snake_x, snake_y))

    # 绘制蛇和食物     screen.fill((0, 0, 0))     for i in range(snake_length):         pygame.draw.rect(screen, (255, 255, 255), (snake_body[i][0], snake_body[i][1], cell_size, cell_size))     pygame.draw.rect(screen, (0, 255, 0), (food_x, food_y, cell_size, cell_size))

    # 更新屏幕     pygame.display.flip()     clock.tick(10)

# 退出 Pygame pygame.quit() sys.exit() ``` 按F5执行,报以下错误:

pygame 2.5.0 (SDL 2.28.0, Python 3.11.0) Hello from the pygame community. https://www.pygame.org/contribute.html Traceback (most recent call last):   File "E:\.py\snake.py", line 67, in     if snake_x == snake_body[i][0] and snake_y == snake_body[i][1]: NameError: name 'snake_body' is not defined. Did you mean: 'snake_y'?

讯飞星火胜出!

只有讯飞星火未做任何修改,代码直接拿来就能运行,胜出!

但只说明仅此一个问题的胜出,并非就说讯飞整体就比其它两家强哦!

代码改进

简单做了2个小的优化改进:

1. 代码细分为多个函数 init() repaint() quit_game() ......

2. 游戏界面增加了方格线,使用pygame.draw.lines(),快速布点是关键:

    # 定义线段端点坐标时,根据规律分别写x,y坐标的数据列表     x,y = (-1,640,640,-1)*16, []     for i in range(36):         for _ in range(2):             y.append(19+i*20)     # zip()整合x,y为坐标Pair     points = list(zip(x,y))

完成代码

import pygame

import sys

import random

# 定义颜色

WHITE = (255, 255, 255)

GREEN = (0, 255, 0)

RED = (255, 0, 0)

GREY = (211, 211, 211) # 淡灰色

def init():

global screen, screen_size

global snake_pos, food_pos, snake_speed

# 初始化pygame

pygame.init()

# 设置屏幕大小

screen_size = (640, 480)

screen = pygame.display.set_mode(screen_size)

# 设置游戏标题

pygame.display.set_caption("贪吃蛇")

# 蛇的初始位置

snake_pos = [[100, 100], [80, 100], [60, 100]]

# 食物的初始位置

food_pos = [300, 300]

# 蛇的初始速度

snake_speed = [20, 0]

def repaint():

# 绘制游戏界面

screen.fill(WHITE)

# 定义线段的端点坐标

x,y = (-1,640,640,-1)*16, []

for i in range(36):

for _ in range(2):

y.append(19+i*20)

# 使用pygame.draw.lines()函数绘制线段

points = list(zip(x,y))

pygame.draw.lines(screen, GREY, False, points, 1) # 线宽为1

points = list(zip(y,x))

pygame.draw.lines(screen, GREY, False, points, 1)

# 重画蛇和食物

for pos in snake_pos:

pygame.draw.rect(screen, GREEN, pygame.Rect(pos[0], pos[1], 20, 20))

pygame.draw.rect(screen, RED, pygame.Rect(food_pos[0], food_pos[1], 20, 20))

pygame.display.flip()

def game_quit():

pygame.quit()

sys.exit()

def main():

global screen, screen_size

global snake_pos, food_pos, snake_speed

# 主循环

while True:

# 处理游戏事件

for event in pygame.event.get():

if event.type == pygame.QUIT:

game_quit()

elif event.type == pygame.KEYDOWN:

if event.key == pygame.K_UP:

snake_speed = [0, -20]

elif event.key == pygame.K_DOWN:

snake_speed = [0, 20]

elif event.key == pygame.K_LEFT:

snake_speed = [-20, 0]

elif event.key == pygame.K_RIGHT:

snake_speed = [20, 0]

# 更新蛇的位置

snake_pos.insert(0, [snake_pos[0][0] + snake_speed[0], snake_pos[0][1] + snake_speed[1]])

# 检查蛇头是否碰到食物

if snake_pos[0] == food_pos:

food_pos = [random.randrange(1, screen_size[0] // 20) * 20, random.randrange(1, screen_size[1] // 20) * 20]

else:

snake_pos.pop()

# 检查蛇头是否碰到墙壁或者蛇身

if snake_pos[0][0] < 0 or snake_pos[0][0] >= screen_size[0] or snake_pos[0][1] < 0 or snake_pos[0][1] >= screen_size[1] or snake_pos[0] in snake_pos[1:]:

game_quit()

'''

此处可增加与用户的交互,如:

if askyesno('title','again?'):

init() # Yes to Play again

else:

game_quit() # No to Exit

'''

# 重画界面及蛇和食物

repaint()

# 控制游戏速度

pygame.time.Clock().tick(10)

if __name__ == "__main__":

init()

main()

更多改进思路:

增加游戏的生命值,比如初始有3条蛇,死完后提示用户“重来”还是“退出游戏”;

增加游戏的得分,比如每吃到一个食物,得分增加10分;结束时写入排行榜;

增加游戏背景音乐和声效,提高游戏可玩性……

擅长pygame编程的你,请继续

精彩文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: