訊飛星火、文心一言和通義千問同時編“貪吃蛇”游戲,誰會勝出?

同時向訊飛星火、文心一言和通義千問三個國產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 <module>
? ? 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 <module>
? ? 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_sizeglobal snake_pos, food_pos, snake_speed# 初始化pygamepygame.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) # 線寬為1points = 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_sizeglobal 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 againelse:game_quit() # No to Exit'''# 重畫界面及蛇和食物repaint()# 控制游戲速度pygame.time.Clock().tick(10)if __name__ == "__main__":init()main()

更多改進思路:

增加游戲的生命值,比如初始有3條蛇,死完后提示用戶“重來”還是“退出游戲”;

增加游戲的得分,比如每吃到一個食物,得分增加10分;結束時寫入排行榜;

增加游戲背景音樂和聲效,提高游戲可玩性……


擅長pygame編程的你,請繼續

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/40766.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/40766.shtml
英文地址,請注明出處:http://en.pswp.cn/news/40766.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android 13 開啟關閉飛行模式

一.背景 由于客戶定制的Settings里面需要開啟和關閉飛行模式,所以需要實現此功能。 二.前提條件 首先應用肯定要是系統應用,并且導入framework.jar包,具體可以參考: Android 應用自動開啟輔助(無障礙)功能并使用輔助(無障礙)功能_android 自動開啟無障礙服務_龔禮鵬的博客…

步入React正殿 - React組件設計模式

目錄 擴展學習資料 高階組件 /src/components/hoc/withTooltip.js /src/components/hoc/itemA.jsx /src/components/hoc/itemB.jsx /src/App.js 函數作為子組件【Render pprops】 函數作為子組件 /src/components/rp/itemC.jsx【父組件】 /src/components/rp/withToo…

C#調用C++ DLL傳參byte[]數組字節值大于127時會變為0x3f的問題解決

最近做了一個網絡編程的DLL給C#調用&#xff0c;DLL中封裝了一個TCP Client的函數接口&#xff0c;如下所示 //C TCP報文發送接口 int TcpClient_send(unsigned char* buffSend, unsigned int nLen) {unsigned char buff[1024];int len StringToHex(buffSend, buff);int nRet…

stable diffusion安裝包和超火使用文檔,數字人制作網址

一&#xff1a;文生圖、圖生圖 1&#xff1a;stable diffusion&#xff1a;對喜歡二次元、美女小姐姐、大眼萌妹的人及其友好哈哈(o^^o) 1&#xff09;&#xff1a;秋葉大神安裝包和模型包&#xff1a; 鏈接&#xff1a;https://pan.baidu.com/s/11_kguofh76gwhTBPUipepw 提…

機器學習 | Python實現GBDT梯度提升樹模型設計

機器學習 | Python實現GBDT梯度提升樹模型設計 目錄 機器學習 | Python實現GBDT梯度提升樹模型設計基本介紹模型描述模型使用參考資料基本介紹 機器學習 | Python實現GBDT梯度提升樹模型設計。梯度提升樹(Grandient Boosting)是提升樹(Boosting Tree)的一種改進算法,GBDT也…

Java System.arraycopy() 對比 C++ memcpy()

System.arraycopy() java.lang.System類為標準輸入和輸出、加載文件和庫或訪問外部定義的屬性提供了有用的方法。 java.lang.System.arraycopy&#xff08;&#xff09;方法將源數組從特定的起始位置復制到上述位置的目標數組。要復制的參數的數量由一個參數決定。 source_Pos…

前端文件下載通用方法

zip文件和xlsx文件 import axios from axios import { getToken } from /utils/authconst mimeMap {xlsx: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,zip: application/zip }const baseUrl process.env.VUE_APP_BASE_API // zip下載 export functi…

214、仿真-基于51單片機溫度甲醛一氧化碳(co)電機凈化報警Proteus仿真設計(程序+Proteus仿真+配套資料等)

畢設幫助、開題指導、技術解答(有償)見文未 目錄 一、硬件設計 二、設計功能 三、Proteus仿真圖 四、程序源碼 資料包括&#xff1a; 需要完整的資料可以點擊下面的名片加下我&#xff0c;找我要資源壓縮包的百度網盤下載地址及提取碼。 方案選擇 單片機的選擇 方案一&a…

It‘s likely that neither a Result Type nor a Result Map was specified.

問題&#xff1a; org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.executor.ExecutorException: A query was run and no Result Maps were 原因&#xff1a; 由于傳遞參數給 mapper 映射文件&#xff0c;所以必須要指定參數數據格式 如…

Qt+Pyhton實現麒麟V10系統下word文檔讀寫功能

目錄 前言1.C調用python1.1 安裝Python開發環境1.2 修改Qt工程配置1.3 初始化Python環境1.4 C 調用Python 函數1.5 常用的Python接口 2.python虛擬環境2.1Python虛擬環境簡介2.2 virtualenv 安裝及使用2.3 在C程序中配置virtualenv 虛擬環境 3.python-docx庫的應用4.總結 前言 …

神經網絡基礎-神經網絡補充概念-23-神經網絡的梯度下降法

概念 神經網絡的梯度下降法是訓練神經網絡的核心優化算法之一。它通過調整神經網絡的權重和偏差&#xff0c;以最小化損失函數&#xff0c;從而使神經網絡能夠逐漸逼近目標函數的最優值。 步驟 1損失函數&#xff08;Loss Function&#xff09;&#xff1a; 首先&#xff0c…

Springboot多路數據源

1、多路數據源配置 &#xff08;1&#xff09;SpringBootMyBatis-PlusOracle實現多數據源配置 https://blog.csdn.net/weixin_44812604/article/details/127386828 &#xff08;2&#xff09;SpringBootMybatis搭建Oracle多數據源配置簡述 https://blog.csdn.net/HJW_233/arti…

網絡安全 Day29-運維安全項目-iptables防火墻

iptables防火墻 1. 防火墻概述2. 防火墻2.1 防火墻種類及使用說明2.2 必須熟悉的名詞2.3 iptables 執行過程※※※※※2.4 表與鏈※※※※※2.4.1 簡介2.4.2 每個表說明2.4.2.1 filter表 :star::star::star::star::star:2.4.2.2 nat表 2.5 環境準備及命令2.6 案例01&#xff1a…

神經網絡基礎-神經網絡補充概念-31-參數與超參數

概念 參數&#xff08;Parameters&#xff09;&#xff1a; 參數是模型內部學習的變量&#xff0c;它們通過訓練過程自動調整以最小化損失函數。在神經網絡中&#xff0c;參數通常是連接權重&#xff08;weights&#xff09;和偏置&#xff08;biases&#xff09;&#xff0c;…

ChatGLM2-6B安裝部署(詳盡版)

1、環境部署 安裝Anaconda3 安裝GIT 安裝GUDA 11.8 安裝NVIDIA 圖形化驅動 522.25版本&#xff0c;如果電腦本身是更高版本則不用更新 1.1、檢查CUDA 運行cmd或者Anaconda&#xff0c;運行以下命令 nvidia-smi CUDA Version是版本信息&#xff0c;Dricer Version是圖形化…

LeetCode 160.相交鏈表

文章目錄 &#x1f4a1;題目分析&#x1f4a1;解題思路&#x1f6a9;步驟一&#xff1a;找尾節點&#x1f6a9;步驟二&#xff1a;判斷尾節點是否相等&#x1f6a9;步驟三&#xff1a;找交點&#x1f344;思路1&#x1f344;思路2 &#x1f514;接口源碼 題目鏈接&#x1f449;…

Ubuntu下mysql安裝及遠程連接支持配置

1.安裝 下載mysql-server&#xff08;必須加sudo&#xff09; sudo apt update sudo apt install mysql-server 查看mysql的狀態 sudo service mysql status 通過如下命令開啟mysql sudo service mysql start 2.配置 第一次安裝mysql后&#xff0c;為root設置一個密碼 …

Linux -- 進階 Autofs應用 : 光驅自動掛載 操作詳解

服務端自動掛載光驅 第一步 &#xff1a; 關閉安全軟件&#xff0c;安裝自動掛載軟件 [rootserver ~]# setenforce 0 [rootserver ~]# systemctl stop firewalld [rootserver ~]# yum install autofs -y 第二步 &#xff1a; 修改 autofs 主配置文件&#xff0c; 計劃掛載光…

C++之map的emplace與pair插入鍵值對用例(一百七十四)

簡介&#xff1a; CSDN博客專家&#xff0c;專注Android/Linux系統&#xff0c;分享多mic語音方案、音視頻、編解碼等技術&#xff0c;與大家一起成長&#xff01; 優質專欄&#xff1a;Audio工程師進階系列【原創干貨持續更新中……】&#x1f680; 人生格言&#xff1a; 人生…

213、仿真-基于51單片機智能電表電能表用電量電費報警Proteus仿真設計(程序+Proteus仿真+原理圖+配套資料等)

畢設幫助、開題指導、技術解答(有償)見文未 目錄 一、硬件設計 二、設計功能 三、Proteus仿真圖 四、原理圖 五、程序源碼 資料包括&#xff1a; 需要完整的資料可以點擊下面的名片加下我&#xff0c;找我要資源壓縮包的百度網盤下載地址及提取碼。 方案選擇 單片機的選…