【gpt实践】同时让chatgpt和claude开发俄罗斯方块

最近chatgpt和claude都在使用,其实大部分日常使用场景表现都没有相差太多,想搞一个有趣的小实验,如果同时让chatgpt和claude开发俄罗斯方块谁会表现的更好呢,说干就干!

prompt

我选择了用英文描述,毕竟英文数据库更丰富,而且claude封禁比较严格,语言上也是小心翼翼

prompt:I have few development experience, and I want to develope the game 'Tetris' totally basing on html5, css and javascript. I have a few requests: 1, we need a start button, 2, a scoreboard recording score 3, pop up gameover 4, full functionality of a complete Tetris game, their movement, collision detection, scoring, and clearing lines give me all the codes, that can run the game in the browse.

我的开发经验不多,我想开发一款完全基于 html5、css 和 javascript 的 "俄罗斯方块 "游戏。我有几个要求: 1、我们需要一个开始按钮;2、一个记录得分的记分板;3、弹出式游戏结束界面;4、一个完整俄罗斯方块游戏的全部功能,包括移动、碰撞检测、得分和清线。

chatgpt回答

// Define variables and constants
const canvas = document.getElementById('gameCanvas');
const ctx = canvas.getContext('2d');
const startButton = document.getElementById('startButton');
const scoreboard = document.getElementById('score');
const gameOver = document.getElementById('gameOver');
let score = 0;
let gameInterval;
let gameOverFlag = false;// Define Tetris pieces and their colors
const pieces = [[[1, 1, 1, 1]], // I[[1, 1, 1], [0, 1, 0]], // T[[1, 1, 0], [0, 1, 1]], // Z[[0, 1, 1], [1, 1, 0]], // S[[1, 1, 1], [0, 1, 0]], // L[[1, 1, 1], [1, 0, 0]], // J[[1, 1], [1, 1]], // O
];const colors = ['#00FFFF', '#FF00FF', '#FFA500', '#FFFF00', '#00FF00', '#0000FF', '#FF0000'];// Define functions for game logic (e.g., draw, move, rotate, check collision, etc.)// Implement game logic// Implement startGame function// Implement gameOver function// Implement key event listeners for controlling the game (e.g., arrow keys for movement)// Implement the main game loop// Implement functions for clearing lines, updating score, etc.// Implement collision detection and game over check// Implement rendering functions (e.g., drawPiece, drawBoard, etc.)// Implement functions for moving and rotating pieces// Implement functions for handling user input (e.g., start game, pause, resume, etc.)// Start the game when the start button is clicked
startButton.addEventListener('click', startGame);

考虑篇幅关系,忽略了html和css部分截图,文章最后会给出源码!!!

可以看出chatgpt的做了一些方法定义,但是并没有实现。

claude回答
const canvas = document.getElementById('game-canvas');
const ctx = canvas.getContext('2d');
const scoreDisplay = document.getElementById('score');
const startButton = document.getElementById('start-button');
const gameOverMessage = document.getElementById('game-over-message');// Game constants
const ROWS = 20;
const COLS = 10;
const BLOCK_SIZE = 20;
const LINE_CLEAR_POINTS = 100;// Game state
let board = [];
let piece = null;
let isGameOver = false;
let isPlaying = false;
let score = 0;// Tetromino shapes
const shapes = [[[0, 0, 0, 0],[1, 1, 1, 1],[0, 0, 0, 0],[0, 0, 0, 0]],[[1, 0, 0],[1, 1, 1],[0, 0, 0]],[[0, 0, 1],[1, 1, 1],[0, 0, 0]],[[1, 1, 0],[0, 1, 1],[0, 0, 0]],[[0, 1, 1],[1, 1, 0],[0, 0, 0]],[[1, 1],[1, 1]],[[0, 1, 0],[1, 1, 1],[0, 0, 0]]
];// Helper functions
function drawBoard() {ctx.clearRect(0, 0, canvas.width, canvas.height);for (let row = 0; row < ROWS; row++) {for (let col = 0; col < COLS; col++) {if (board[row][col]) {ctx.fillStyle = 'yellow';ctx.fillRect(col * BLOCK_SIZE, row * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE);}}}if (piece) {drawPiece(piece.shape, piece.x, piece.y);}
}function drawPiece(shape, x, y) {ctx.fillStyle = 'red';for (let row = 0; row < shape.length; row++) {for (let col = 0; col < shape[row].length; col++) {if (shape[row][col]) {ctx.fillRect((x + col) * BLOCK_SIZE, (y + row) * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE);}}}
}function resetBoard() {board = Array.from({ length: ROWS }, () => Array(COLS).fill(0));
}function randomPiece() {const randomIndex = Math.floor(Math.random() * shapes.length);return {shape: shapes[randomIndex],x: 3,y: 0};
}function movePiece(direction) {if (!piece) return;const newX = piece.x + (direction === 'left' ? -1 : direction === 'right' ? 1 : 0);const newY = piece.y + (direction === 'down' ? 1 : 0);if (canMove(piece.shape, newX, newY)) {piece.x = newX;piece.y = newY;} else if (direction === 'down') {placePiece();clearLines();if (!isGameOver) {piece = randomPiece();}}drawBoard();
}function canMove(shape, x, y) {for (let row = 0; row < shape.length; row++) {for (let col = 0; col < shape[row].length; col++) {if (shape[row][col]) {const newX = x + col;const newY = y + row;if (newX < 0 ||newX >= COLS ||newY >= ROWS ||(newY >= 0 && board[newY][newX])) {return false;}}}}return true;
}function placePiece() {if (!piece) return;for (let row = 0; row < piece.shape.length; row++) {for (let col = 0; col < piece.shape[row].length; col++) {if (piece.shape[row][col]) {board[piece.y + row][piece.x + col] = 1;}}}
}function clearLines() {let linesCleared = 0;for (let row = ROWS - 1; row >= 0; row--) {let isFull = true;for (let col = 0; col < COLS; col++) {if (!board[row][col]) {isFull = false;break;}}if (isFull) {linesCleared++;for (let r = row; r > 0; r--) {for (let c = 0; c < COLS; c++) {board[r][c] = board[r - 1][c];}}for (let c = 0; c < COLS; c++) {board[0][c] = 0;}}}score += linesCleared * LINE_CLEAR_POINTS;scoreDisplay.textContent = `Score: ${score}`;
}function rotatePiece() {if (!piece) return;const newShape = Array.from({ length: piece.shape[0].length }, () =>Array(piece.shape.length).fill(0));for (let row = 0; row < piece.shape.length; row++) {for (let col = 0; col < piece.shape[row].length; col++) {newShape[col][piece.shape.length - 1 - row] = piece.shape[row][col];}}if (canMove(newShape, piece.x, piece.y)) {piece.shape = newShape;}drawBoard();
}function isGameOverCheck() {for (let col = 0; col < COLS; col++) {if (board[0][col]) {isGameOver = true;gameOverMessage.classList.remove('hidden');break;}}
}// Event listeners
document.addEventListener('keydown', (event) => {if (!isPlaying) return;switch (event.code) {case 'ArrowLeft':movePiece('left');break;case 'ArrowRight':movePiece('right');break;case 'ArrowDown':movePiece('down');break;case 'ArrowUp':rotatePiece();break;}
});startButton.addEventListener('click', () => {if (isPlaying) {isPlaying = false;startButton.textContent = 'Start';gameOverMessage.classList.add('hidden');} else {isPlaying = true;startButton.textContent = 'Pause';isGameOver = false;score = 0;scoreDisplay.textContent = `Score: ${score}`;resetBoard();piece = randomPiece();drawBoard();}
});// Game loop
function gameLoop() {if (!isPlaying) return;movePiece('down');isGameOverCheck();if (!isGameOver) {requestAnimationFrame(gameLoop);}
}// Start the game
resetBoard();
piece = randomPiece();
drawBoard();
gameLoop();

同样只贴出js部分的代码。可以看到claude给出了相对完善的js逻辑,所以我们直接选择用claude回答的代码进行调试,看看是否能正常在浏览器中运行。

贴出代码:

浏览器打开tetris运行效果:

可以看到,点击开始后方块不会自动下落,需要手动按下,继续反馈优化:

反馈完善功能

prompt:I mean when the game starts without pressing the down button, the cube falls at a constant speed

即当游戏开始时,方块保持匀速下落。

const canvas = document.getElementById('game-canvas');
const ctx = canvas.getContext('2d');
const scoreDisplay = document.getElementById('score');
const startButton = document.getElementById('start-button');
const gameOverMessage = document.getElementById('game-over-message');// Game constants
const ROWS = 20;
const COLS = 10;
const BLOCK_SIZE = 20;
const LINE_CLEAR_POINTS = 100;
const FALL_SPEED = 500; // Adjust this value to control the falling speed (in milliseconds)// Game state
let board = [];
let piece = null;
let isGameOver = false;
let isPlaying = false;
let score = 0;
let lastTime = 0;
let fallInterval = null;// Tetromino shapes
// ... (shapes array remains the same)// Helper functions
// ... (drawBoard, drawPiece, resetBoard, randomPiece, movePiece, canMove, placePiece, clearLines, rotatePiece, isGameOverCheck functions remain the same)// Event listeners
document.addEventListener('keydown', (event) => {if (!isPlaying) return;switch (event.code) {case 'ArrowLeft':movePiece('left');break;case 'ArrowRight':movePiece('right');break;case 'ArrowUp':rotatePiece();break;}
});startButton.addEventListener('click', () => {if (isPlaying) {isPlaying = false;startButton.textContent = 'Start';gameOverMessage.classList.add('hidden');clearInterval(fallInterval); // Stop the automatic falling} else {isPlaying = true;startButton.textContent = 'Pause';isGameOver = false;score = 0;scoreDisplay.textContent = `Score: ${score}`;resetBoard();piece = randomPiece();drawBoard();lastTime = performance.now(); // Get the current timefallInterval = setInterval(gameLoop, FALL_SPEED); // Start the automatic falling}
});// Game loop
function gameLoop() {if (!isPlaying) return;const currentTime = performance.now();const deltaTime = currentTime - lastTime;if (deltaTime >= FALL_SPEED) {movePiece('down');isGameOverCheck();lastTime = currentTime;}if (!isGameOver) {requestAnimationFrame(gameLoop);} else {clearInterval(fallInterval); // Stop the automatic falling when the game is over}
}// Start the game
resetBoard();
piece = randomPiece();
drawBoard();

可以看到claude会的的js代码里增加了方块下落的逻辑。点击开始后方块就能匀速下落

当然后面还有几个小问题,比如按下键没有加速下落,方块无法移动到最右端,这些都通过反馈cluade得到了解决,最终能正常运行记分,效果如下:

源码及claude导出文件

https://github.com/JiangSanJie/gpt-practice/

总结:

claude稳定账号获取

在本次俄罗斯方块的开发prompt中,claude回答相对完善,通过少量的反馈即可完成开发。当然其实chatgpt也能完成,但是需要prompt更加细致,可能针对回答的反馈会繁琐一些,这个感兴趣的读者可以去实验。我相信好的prompt会提高回答满意率!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/742827.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《如何使用C语言去下三子棋?》

目录 一、环境配置 二、功能模块 1.打印菜单 2.初始化并打印棋盘 3、行棋 3.1玩家行棋 3.2电脑行棋 4、判断是否和棋 5.判赢 三、代码实现 1、test.c文件 2、game.c文件 3、game.h文件 一、环境配置 本游戏用到三个文件&#xff0c;分别是两个源文件test.c game.c 和…

cad转shp再转3dtiles生成白模

1、准备CAD数据 2、arcgis中添加cad数据 添加面 cad中的标高字段是能带进arcgis中的&#xff0c;如果这个数据是建筑高度&#xff0c;可以直接用了 3、转shp 4、shp转3dtiles白模 cesiumlab中shp转3dtiles白模效果一

Spring Cloud Alibaba微服务从入门到进阶(三)

Spring Cloud Alibaba是spring Cloud的子项目 Spring Cloud Alibaba的主要组件&#xff08;红框内是开源的&#xff09; Spring Cloud是快速构建分布式系统的工具集&#xff0c; Spring Cloud提供了很多分布式功能 Spring Cloud常用子项目 项目整合 Spring Cloud Alibaba …

搭建项目后台系统基础架构

任务描述 1、了解搭建民航后端框架 2、使用IDEA创建基于SpringBoot、MyBatis、MySQL、Redis的Java项目 3、以原项目为参照搭建项目所涉及到的各个业务和底层服务 4、以原项目为例&#xff0c;具体介绍各个目录情况并参照创建相关文件夹 1、创建项目后端 BigData-KongGuan …

海豚调度系列之:任务类型——SQL节点

海豚调度系列之&#xff1a;任务类型——SQL节点 一、SQL节点二、创建任务三、任务参数四、任务样例五、运行该任务成功之后在hive中查询结果六、使用前置sql和后置sql示例 一、SQL节点 SQL任务类型&#xff0c;用于连接数据库并执行相应SQL。 二、创建任务 点击项目管理-项…

清廉机关建设宣传稿件怎样联系媒体投稿发表?

在推进清廉机关建设的伟大征程中,我们深知信息宣传的重要性。如何将清廉机关建设的成果和理念广泛传播,让更多人了解并参与到这一伟大事业中来,成为我们面临的重要课题。 过去,我们或许曾经历过联系媒体投稿的种种心酸。一家家媒体的联系,一次次的等待与回复,其中的艰辛与不易…

春风吹又生的开源项目「GitHub 热点速览」

随着上周知名 Switch 开源模拟器 Yuzu&#xff08;柚子&#xff09;被任天堂起诉&#xff0c;该项目作者就删库了&#xff0c;但还是要赔偿任天堂数百万美元。此事还在 GitHub 上掀起了一波 Yuzu fork 项目的小浪潮&#xff0c;正所谓野火烧不尽&#xff0c;春风吹又生。 很多读…

Unity使用Addressable热更新

先看热更新的gif: Addressable是Unity推出的打ab包方案。不需要手动写AB打包脚手架了&#xff0c;不需要关心依赖&#xff0c;这也简化了ab热更新的流程。Addressable打包需要先将资源放入group中&#xff0c;按group来打包&#xff0c;每个group对应一个ScriptableObject的配置…

大模型学习笔记(一):部署ChatGLM模型以及stable-diffusion模型

大模型学习笔记&#xff08;一&#xff09;&#xff1a;部署ChatGLM模型以及stable-diffusion模型 注册算力平台&#xff08;驱动云平台&#xff09;1.平台注册2.查看算力3.进入平台中心 部署ChatGLM3-6B模型1.创建项目2.配置环境设置镜像源、克隆项目修改requirements 3.修改w…

【git报错】【重置代理】Failed to connect to github.com port 443: Connection refused

重置代理 git config --global --unset http.proxy git config --global --unset https.proxy

VC-旅游系统-213-(代码+说明)

转载地址: http://www.3q2008.com/soft/search.asp?keyword旅游系统 旅游信息管理系统开题报告 一、研究目的 旅游信息管理系统能帮助旅行社在游客的市场开拓、游客的信息管理、客户服务等方面进行综合处理。使旅行社能够准确的掌握客户的市场动态&#xff0c;充分了解对客户…

嵌入式学习day37 数据结构

1.sqlite3_open int sqlite3_open( const char *filename, /* Database filename (UTF-8) */ sqlite3 **ppDb /* OUT: SQLite db handle */ ); 功能: 打开数据库文件(创建一个数据库连接) 参数: filename:数据库文…

华为配置OSPF的Stub区域示例

配置OSPF的Stub区域示例 组网图形 图1 配置OSPF Stub区域组网图 Stub区域简介配置注意事项组网需求配置思路操作步骤配置文件 Stub区域简介 Stub区域的ABR不传播它们接收到的自治系统外部路由&#xff0c;在Stub区域中路由器的路由表规模以及路由信息传递的数量都会大大减少…

有来团队后台项目-解析7

sass 安装 因为在使用vite 创建项目的时候&#xff0c;已经安装了sass&#xff0c;所以不需要安装。 如果要安装&#xff0c;那么就执行 npm i -D sass 创建文件 src 目录下创建文件 目录结构如图所示&#xff1a; reset.scss *, ::before, ::after {box-sizing: border-…

使用CrossOver 在Mac 运行Windows 软件|D3DMetal是什么技术,

CrossOver Mac 使用特点 • 免费试用 14 天&#xff0c;可使用 CrossOver Mac 全部功能&#xff0c;• 试用过期会保留之前安装的 Windows 软件• 使 Mac 运行 Windows 程序 使用CrossOver在Mac上运行Windows软件是一个方便且无需安装完整Windows操作系统的解决方案。CrossOve…

macOS安装maven

官网下载maven https://maven.apache.org/download.cgi如下图所示&#xff1a; 1.解压并复制到指定的目录中2.配置环境变量 vim ~/.bash_profile进行文件的修改 export M2_HOME/Users/fanfan/company/apache-maven-3.9.6 export PATH$PATH:$M2_HOME/bin3.终端中输入source ~…

如何从笔记本电脑恢复已删除的照片

人们相信照片是回忆一生中最难忘事件的最佳媒介。人们在计算机上收集超过 5 GB 的照片是很常见的。然而&#xff0c;在笔记本电脑上保存照片并不安全&#xff0c;因为您可能会因以下原因有意或无意地删除笔记本电脑上的照片&#xff1a; 您的笔记本电脑存储空间几乎已满。您必…

【Vite+Ts】自动按需引入Element-Plus

安装插件 cnpm i -D unplugin-vue-components unplugin-auto-import unplugin-element-plus修改vite.config.ts // vite.config.ts import AutoImport from "unplugin-auto-import/vite"; import Components from "unplugin-vue-components/vite"; impor…

WWW2024 | PromptMM:Prompt-Tuning增强的知识蒸馏助力多模态推荐系统

论文&#xff1a;https://arxiv.org/html/2402.17188v1 代码&#xff1a;https://github.com/HKUDS/PromptMM 研究动机 多模态推荐系统极大的便利了人们的生活,比如亚马逊和Netflix都是基于多模态内容进行推荐的。对于研究,人们也遵循工业界的趋势,进行modality-aware的用户…

智能化工厂大屏监控

通过采集和整合工厂各个环节的数据&#xff0c;包括设备状态、生产进度、质量指标、能源消耗等&#xff0c;并将这些数据以图表、动画、报表等形式展示在大屏上。 智能化工厂大屏监控可以提供以下优势&#xff1a; 实时监控&#xff1a;通过大屏幕展示工厂各项数据&#xff0c…