体验ChatGPT使用

news2024/11/17 21:39:22

ChatGPT是一种基于GPT(Generative Pre-train Transformer)模型的大型语言模型,由OpenAI公司开发。

交互时,有一定的技巧,可以快速准确的反馈正确答案。

一、开发贪吃蛇游戏

浏览器访问:https://chat.openai.com/auth/login 。账号登录之后就可以与它交互了。

借助它开发一个简单的贪吃蛇游戏。

1、开始交流

我问:你好 我不懂编程,你可以帮我开发一个贪吃蛇游戏吗

技巧:明确角色,描述理解上下文。
比如三段式提问:

  • 角色,范围和要求
  • 回忆,完善和要求

2、字数限制继续

由于 它在回答问题时有字数限制,可以让它继续。

在这里插入图片描述

技巧:继续,将入上下文的关键字继续都可以。我们在摸索中积累这类技巧。
可以在右上角点赞。

这里列举几个技巧:

继续|continue
go on next line
你刚因为回复长度限制问题中断了,我需要你继续回答
你接着 startButton.addEventListener 继续

3、基础版

我们将代码写到 html,浏览器打开,通过键盘上的方向键就可以玩了。

基础版代码如下:

<!DOCTYPE html>
<html>
  <head>
    <title>贪吃蛇游戏</title>
    <style>
      #game-board {
        width: 400px;
        height: 400px;
        background-color: #ddd;
        position: relative;
      }

      .snake {
        width: 20px;
        height: 20px;
        background-color: #333;
        position: absolute;
      }

      .food {
        width: 20px;
        height: 20px;
        background-color: #f00;
        position: absolute;
      }
    </style>
  </head>
  <body>
    <h1>贪吃蛇游戏</h1>
    <div id="game-board"></div>

    <script>
      // 游戏区域大小
      const BOARD_SIZE = 400;

      // 蛇和食物的大小
      const UNIT_SIZE = 20;

      // 初始化蛇的位置
      let snake = [
        { x: 4, y: 2 },
        { x: 3, y: 2 },
        { x: 2, y: 2 },
      ];

      // 初始化食物的位置
      let food = { x: 10, y: 10 };

      // 当前移动的方向
      let direction = "right";

      // 获取游戏区域元素
      const gameBoard = document.getElementById("game-board");

      // 绘制游戏区域
      function drawGameBoard() {
        gameBoard.innerHTML = "";

        // 绘制蛇
        snake.forEach(segment => {
          const snakeElement = document.createElement("div");
          snakeElement.style.left = segment.x * UNIT_SIZE + "px";
          snakeElement.style.top = segment.y * UNIT_SIZE + "px";
          snakeElement.classList.add("snake");
          gameBoard.appendChild(snakeElement);
        });

        // 绘制食物
        const foodElement = document.createElement("div");
        foodElement.style.left = food.x * UNIT_SIZE + "px";
        foodElement.style.top = food.y * UNIT_SIZE + "px";
        foodElement.classList.add("food");
        gameBoard.appendChild(foodElement);
      }

      // 更新游戏状态
      function updateGame() {
        // 移动蛇的身体
        const head = { x: snake[0].x, y: snake[0].y };

        if (direction === "up") head.y -= 1;
        if (direction === "down") head.y += 1;
        if (direction === "left") head.x -= 1;
        if (direction === "right") head.x += 1;

        snake.unshift(head);

                // 判断是否吃到食物
        if (head.x === food.x && head.y === food.y) {
          // 生成新的食物位置
          food.x = Math.floor(Math.random() * (BOARD_SIZE / UNIT_SIZE));
          food.y = Math.floor(Math.random() * (BOARD_SIZE / UNIT_SIZE));
        } else {
          // 移除蛇尾,保持蛇的长度不变
          snake.pop();
        }

        // 检查游戏是否结束
        if (
          head.x < 0 ||
          head.y < 0 ||
          head.x >= BOARD_SIZE / UNIT_SIZE ||
          head.y >= BOARD_SIZE / UNIT_SIZE ||
          checkCollision()
        ) {
          clearInterval(gameLoop);
          alert("游戏结束!");
        }

        drawGameBoard();
      }

      // 检查蛇是否与自己相撞
      function checkCollision() {
        const head = snake[0];
        for (let i = 1; i < snake.length; i++) {
          if (snake[i].x === head.x && snake[i].y === head.y) {
            return true;
          }
        }
        return false;
      }

      // 监听键盘事件,改变移动方向
      document.addEventListener("keydown", event => {
        if (event.key === "ArrowUp" && direction !== "down") {
          direction = "up";
        } else if (event.key === "ArrowDown" && direction !== "up") {
          direction = "down";
        } else if (event.key === "ArrowLeft" && direction !== "right") {
          direction = "left";
        } else if (event.key === "ArrowRight" && direction !== "left") {
          direction = "right";
        }
      });

      // 开始游戏循环
      const gameLoop = setInterval(updateGame, 100);
    </script>
  </body>
</html>

在这里插入图片描述

4、按钮版

上面 html文件一打开就开始游戏了,比较简单。我们让它继续添加一个开始按钮。

在这里插入图片描述

按钮版代码如下:

<!DOCTYPE html>
<html>
  <head>
    <title>贪吃蛇游戏</title>
    <style>
      #game-board {
        width: 400px;
        height: 400px;
        background-color: #ddd;
        position: relative;
      }

      .snake {
        width: 20px;
        height: 20px;
        background-color: #333;
        position: absolute;
      }

      .food {
        width: 20px;
        height: 20px;
        background-color: #f00;
        position: absolute;
      }
	  
	  #start-button {
        margin-top: 20px;
      }
    </style>
  </head>
  <body>
    <h1>贪吃蛇游戏</h1>
    <div id="game-board"></div>
	<button id="start-button">开始游戏</button>

    <script>
      // 游戏区域大小
      const BOARD_SIZE = 400;

      // 蛇和食物的大小
      const UNIT_SIZE = 20;

      // 初始化蛇的位置
      let snake = [
        { x: 4, y: 2 },
        { x: 3, y: 2 },
        { x: 2, y: 2 },
      ];

      // 初始化食物的位置
      let food = { x: 10, y: 10 };

      // 当前移动的方向
      let direction = "right";

      // 获取游戏区域元素
      const gameBoard = document.getElementById("game-board");

      // 绘制游戏区域
      function drawGameBoard() {
        gameBoard.innerHTML = "";

        // 绘制蛇
        snake.forEach(segment => {
          const snakeElement = document.createElement("div");
          snakeElement.style.left = segment.x * UNIT_SIZE + "px";
          snakeElement.style.top = segment.y * UNIT_SIZE + "px";
          snakeElement.classList.add("snake");
          gameBoard.appendChild(snakeElement);
        });

        // 绘制食物
        const foodElement = document.createElement("div");
        foodElement.style.left = food.x * UNIT_SIZE + "px";
        foodElement.style.top = food.y * UNIT_SIZE + "px";
        foodElement.classList.add("food");
        gameBoard.appendChild(foodElement);
      }

      // 更新游戏状态
      function updateGame() {
        // 移动蛇的身体
        const head = { x: snake[0].x, y: snake[0].y };

        if (direction === "up") head.y -= 1;
        if (direction === "down") head.y += 1;
        if (direction === "left") head.x -= 1;
        if (direction === "right") head.x += 1;

        snake.unshift(head);

                // 判断是否吃到食物
        if (head.x === food.x && head.y === food.y) {
          // 生成新的食物位置
          food.x = Math.floor(Math.random() * (BOARD_SIZE / UNIT_SIZE));
          food.y = Math.floor(Math.random() * (BOARD_SIZE / UNIT_SIZE));
        } else {
          // 移除蛇尾,保持蛇的长度不变
          snake.pop();
        }

        // 检查游戏是否结束
        if (
          head.x < 0 ||
          head.y < 0 ||
          head.x >= BOARD_SIZE / UNIT_SIZE ||
          head.y >= BOARD_SIZE / UNIT_SIZE ||
          checkCollision()
        ) {
          clearInterval(gameLoop);
          alert("游戏结束!");
        }

        drawGameBoard();
      }

      // 检查蛇是否与自己相撞
      function checkCollision() {
        const head = snake[0];
        for (let i = 1; i < snake.length; i++) {
          if (snake[i].x === head.x && snake[i].y === head.y) {
            return true;
          }
        }
        return false;
      }

      // 监听键盘事件,改变移动方向
      document.addEventListener("keydown", event => {
        if (event.key === "ArrowUp" && direction !== "down") {
          direction = "up";
        } else if (event.key === "ArrowDown" && direction !== "up") {
          direction = "down";
        } else if (event.key === "ArrowLeft" && direction !== "right") {
          direction = "left";
        } else if (event.key === "ArrowRight" && direction !== "left") {
          direction = "right";
        }
      });

      // 获取开始游戏按钮元素
      const startButton = document.getElementById("start-button");

      // 点击开始游戏按钮时开始游戏
      startButton.addEventListener("click", () => {
        startButton.disabled = true; // 禁用按钮
        gameLoop = setInterval(updateGame, 200); // 开始游戏循环
      });
    </script>
  </body>
</html>

在这里插入图片描述

如果过程中有什么问题或者报错,可以描述,让它分析给出解决方案。

在这里插入图片描述

4、难度级别版

接下来我们让它增加几个按钮来选择游戏难度,可以针对不同游戏玩家使用。

部分图片如下:

在这里插入图片描述

难度级别版代码如下:

<!DOCTYPE html>
<html>
  <head>
    <title>贪吃蛇游戏</title>
    <style>
      #game-board {
        display: grid;
        grid-template-columns: repeat(20, 20px);
        grid-template-rows: repeat(20, 20px);
        gap: 1px;
        background-color: #ddd;
        width: 420px;
        margin-bottom: 20px;
      }

      .unit {
        background-color: #fff;
        width: 20px;
        height: 20px;
      }

      .snake {
        background-color: #333;
      }

      .food {
        background-color: #f00;
      }

      #start-button {
        margin-top: 20px;
      }
    </style>
  </head>
  <body>
    <h1>贪吃蛇游戏</h1>
    <div id="game-board"></div>
    <button id="start-button">开始游戏</button>
    <h3>选择游戏难度:</h3>
    <div>
      <input type="radio" name="difficulty" id="beginner" value="200" checked />
      <label for="beginner">初级</label>
    </div>
    <div>
      <input type="radio" name="difficulty" id="intermediate" value="100" />
      <label for="intermediate">中级</label>
    </div>
    <div>
      <input type="radio" name="difficulty" id="advanced" value="50" />
      <label for="advanced">高级</label>
    </div>

    <script>
      const gameBoard = document.getElementById("game-board");
      const startButton = document.getElementById("start-button");

      const UNIT_SIZE = 20;
      const BOARD_SIZE = 400;

      let gameStarted = false;
      let selectedDifficulty = 200;
      let gameLoop = null;

      let snake = [
        { x: 10, y: 10 },
        { x: 10, y: 11 },
        { x: 10, y: 12 }
      ];
      let food = { x: 15, y: 10 };
      let direction = "right";

      function drawGameBoard() {
        let gameHTML = "";
        for (let y = 0; y < BOARD_SIZE / UNIT_SIZE; y++) {
          for (let x = 0; x < BOARD_SIZE / UNIT_SIZE; x++) {
            gameHTML += '<div class="unit"></div>';
          }
        }
        gameBoard.innerHTML = gameHTML;

        snake.forEach(segment => {
          const snakeElement = document.createElement("div");
          snakeElement.style.gridRowStart = segment.y + 1;
          snakeElement.style.gridColumnStart = segment.x + 1;
          snakeElement.classList.add("snake");
          gameBoard.appendChild(snakeElement);
        });

        const foodElement = document.createElement("div");
        foodElement.style.gridRowStart = food.y + 1;
        foodElement.style.gridColumnStart = food.x + 1;
        foodElement.classList.add("food");
        gameBoard.appendChild(foodElement);
      }

      function updateGame() {
        const head = { x: snake[0].x, y: snake[0].y };

                // 根据移动方向更新头部位置
        if (direction === "up") {
          head.y--;
        } else if (direction === "down") {
          head.y++;
        } else if (direction === "left") {
          head.x--;
        } else if (direction === "right") {
          head.x++;
        }

        // 检查是否吃到食物
        if (head.x === food.x && head.y === food.y) {
          // 生成新的食物位置
          food.x = Math.floor(Math.random() * (BOARD_SIZE / UNIT_SIZE));
          food.y = Math.floor(Math.random() * (BOARD_SIZE / UNIT_SIZE));

          // 增加蛇的长度
          snake.push({});
        } else {
          // 移除蛇尾,实现移动效果
          snake.pop();
        }

        // 检查游戏是否结束
        if (
          head.x < 0 ||
          head.x >= BOARD_SIZE / UNIT_SIZE ||
          head.y < 0 ||
          head.y >= BOARD_SIZE / UNIT_SIZE ||
          snake.some(segment => segment.x === head.x && segment.y === head.y)
        ) {
          // 游戏结束逻辑
          gameStarted = false;
          clearInterval(gameLoop);
          startButton.disabled = false; // 启用按钮
          alert("游戏结束!");
          return;
        }

        // 更新蛇的位置
        snake.unshift(head);

        // 绘制游戏区域
        drawGameBoard();
      }

      function setGameSpeed() {
        clearInterval(gameLoop);
        gameLoop = setInterval(updateGame, selectedDifficulty);
      }

      startButton.addEventListener("click", () => {
        if (!gameStarted) {
          gameStarted = true;
          startButton.disabled = true; // 禁用按钮
          setGameSpeed(); // 设置游戏速度
          updateGame(); // 开始游戏更新循环
        }
      });

      const difficultyInputs = document.querySelectorAll('input[name="difficulty"]');
      difficultyInputs.forEach(input => {
        input.addEventListener("change", () => {
          selectedDifficulty = parseInt(input.value);
          setGameSpeed();
        });
      });

      document.addEventListener("keydown", event => {
        // 根据按键调整移动方向
        if (event.key === "ArrowUp" && direction !== "down") {
          direction = "up";
        } else if (event.key === "ArrowDown" && direction !== "up") {
          direction = "down";
        } else if (event.key === "ArrowLeft" && direction !== "right") {
          direction = "left";
        } else if (event.key === "ArrowRight" && direction !== "left") {
          direction = "right";
        }
      });

      drawGameBoard(); // 初始绘制游戏区域
    </script>
  </body>
</html>

在这里插入图片描述

虽然里面还存在一些小问题,影响游戏体验,但是整体不影响。

技巧:由于网络或者服务响应中断时,可以编辑提交。

在这里插入图片描述

– 求知若饥,虚心若愚。

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

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

相关文章

taro使用小记 —— 持续更新

目录 1、在 taro 中使用 axios2、在 taro 中添加全局组件自动引入和方法自动引入3、在 taro 中使用 pinia 1、在 taro 中使用 axios taro 3.6 版本已经支持了网络请求库。 需安装插件 tarojs/plugin-http 使用和注意事项说明&#xff1a; https://www.npmjs.com/package/taroj…

【笔试强训选择题】Day22.习题(错题)解析

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;笔试强训选择题 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01; 文章目录 前言 一、…

mac电脑m1搭建java开发环境参考手册

1 背景介绍 开发人员经常会换电脑&#xff0c;或者换新电脑&#xff0c;意味着重新搭建开发环境&#xff0c;很麻烦。但新电脑到手里面了&#xff0c;不换又不好&#xff0c;此篇专门用来记录mac电脑m1搭建java开发环境的步骤。希望对读者有所帮助&#xff0c;一条龙服务。 后…

初探 transformer

大部分QA的问题都可以使用seq2seq来实现。或者说大多数的NLP问题都可以使用seq2seq模型来解决。 但是呢最好的办法还是对具体的问题作出特定的模型训练。 概述 Transformer就是一种seq2seq模型。 我们先看一下seq2seq这个模型的大体框架(其实就是一个编码器和一个解码器)&a…

OpenGL 光照贴图

1.简介 现实世界中的物体通常并不只包含有一种材质&#xff0c;而是由多种材质所组成。想想一辆汽车&#xff1a;它的外壳非常有光泽&#xff0c;车窗会部分反射周围的环境&#xff0c;轮胎不会那么有光泽&#xff0c;所以它没有镜面高光&#xff0c;轮毂非常闪亮。 2.漫反射…

Baumer工业相机堡盟工业相机如何使用BGAPISDK对两个万兆网相机进行触发同步(C#)

Baumer工业相机堡盟工业相机如何使用BGAPISDK对两个万兆网相机进行触发同步&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机BGAPISDK和触发同步的技术背景Baumer工业相机使用BGAPISDK进行双相机主从相机触发1.引用合适的类文件2.使用BGAPISDK设置主相机硬件触发从相机…

ReentrantLock 底层原理

目录 一、ReentrantLock入门 二、AQS原理 1、AQS介绍 2、自定义锁 三、ReentrantLock实现原理 1、非公平锁的实现 加锁流程 释放锁流程 2、可重入原理 3、可打断原理 4、公平锁原理 5、条件变量原理 await流程 signal流程 一、ReentrantLock入门 相对于synchron…

对测试外包的一些粗略看法

什么叫外包&#xff0c;外包最直接理解就是让别人做事&#xff1b;外包其中一项目的就是降低企业经营成本。 从外包的含义和目的来看&#xff0c;就是我们帮人做事、听人指挥&#xff0c;当企业经济不好的时候&#xff0c;我们就成为了降低成本的最佳方案。说这些是让大家比较…

高并发编程:线程池

一、概述 线程池首先有几个接口先了解第一个是Executor&#xff0c;第二个是ExecutorService&#xff0c;在后面才是线程池的一个使用ThreadPoolExecutor。 二、Executor Executor看它的名字也能理解&#xff0c;执行者&#xff0c;所以他有一个方法叫执行&#xff0c;那么执…

JVM原理:JVM垃圾回收算法(通俗易懂)

目录 前言正文垃圾标记算法引用类型强引用软引用弱引用虚引用 引用计数法循环引用问题 根可达性分析法虚拟机栈&#xff08;栈帧的局部变量表&#xff09;中的引用方法区中类静态属性引用方法区中常量引用本地方法栈&#xff08;Native方法&#xff09;引用 垃圾回收算法标记清…

Java语法进阶及常用技术(八)--线程池

初识线程池 什么是“池” ---- 软件中的“池”&#xff0c;可以理解为计划经济。 我们的资源是有限的&#xff0c;比如只有十个线程&#xff0c;我们创造十个线程的线程池&#xff0c;可能我们的任务非常多&#xff0c;如1000个任务&#xff0c;我们就把1000个任务放到我们十个…

shell脚本学习记录(流程控制)

前言&#xff1a; 在shell脚本中&#xff0c;()、{}、[]都是用来表示命令或者变量的范围或者属性。它们的具体区别如下&#xff1a; ()&#xff1a;表示命令在子shell中运行。括号中的命令会在一个子shell中运行&#xff0c;并且该子shell拥符有自己的环境变量和文件描述&#…

【youcans动手学模型】DenseNet 模型-CIFAR10图像分类

欢迎关注『youcans动手学模型』系列 本专栏内容和资源同步到 GitHub/youcans 【youcans动手学模型】DenseNet 模型-CIFAR10图像分类 1. DenseNet 神经网络模型1.1 模型简介1.2 论文介绍1.3 改进方法与后续工作1.4 分析与讨论 2. 在 PyTorch 中定义 DenseNet 模型类2.1 DenseBlo…

性能测试实战——登录接口的性能测试(超详细总结)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 在实际业务场景中…

python:六个模块,概括全书(上万字最详细版)

拍摄于——无锡南长街 文章目录 模块一&#xff1a;基础知识1、python语言2、常见数字类型3、字符串4、数字类型转换5、标识符命名6、常见关键字7、运算符与表达式&#xff08;1&#xff09;算术运算符&#xff08;2&#xff09;关系运算符&#xff08;3&#xff09;逻辑运算符…

循序渐进,搞懂什么是动态规划

循序渐进&#xff0c;搞懂什么是动态规划 写在前面 温馨提示&#xff0c;本文的篇幅很长&#xff0c;需要花很长的时间阅读。如果要完全理解所有内容&#xff0c;还需要花更多的时间学习。如果打算认真学习动态规划&#xff0c;又不能一次看完&#xff0c;建议您收藏本文以便后…

《深入理解计算机系统》(6)存储器层次结构

1、存储技术 随机访问存储器&#xff0c;分为两类&#xff1a; RAM&#xff0c;同时也是易失性存储器&#xff0c;也分为两类&#xff1a; - SRAM&#xff1a;静态随机访问存储器&#xff0c;速度快&#xff0c;价格高。多用来作为高速缓存存储器。 - DRAM&#xff1a;动态随机…

WinDbg安装入坑1(C#)

由于作者水平有限&#xff0c;如有写得不对的地方&#xff0c;请指正。 使用WinDbg的过程中&#xff0c;坑特别的多&#xff0c;对版本要求比较严格&#xff0c;如&#xff1a; 1 32位应用程序导出的Dump文件要用32位的WinDbg打开&#xff0c;想要没有那么多的问题&#xff…

chatgpt赋能python:Python删除内容:掌握三种删除方式

Python删除内容&#xff1a;掌握三种删除方式 删除变量中的值 删除变量中的值是Python编程中常见的操作。Python提供了del语句用于删除变量中的值&#xff1a; x "Hello World" del x上述代码中&#xff0c;del x语句将删除变量x中的值。如果我们在执行print(x)时…

从C语言到C++_18(stack和queue的常用函数+相关练习)力扣

目录 1. stack 1.1 栈的概念 1.2 stack 的介绍和使用 2. queue 2.1 队列的概念 2.2 queue 的介绍和使用 3. 栈和队列的相关选择题 答案&#xff1a; 4. 栈和队列的相关OJ题 155. 最小栈 - 力扣&#xff08;LeetCode&#xff09; 解析代码&#xff1a; 剑指 Offer 3…