当前位置: 首页 > news >正文

GPT和Copilot联手,AI编程进入新纪元

❤️作者主页:小虚竹

❤️作者简介:大家好,我是小虚竹。2022年度博客之星🏆,Java领域优质创作者🏆,CSDN博客专家🏆,华为云享专家🏆,掘金年度人气作者🏆,阿里云专家博主🏆,51CTO专家博主🏆

❤️技术活,该赏

❤️点赞 👍 收藏 ⭐再看,养成习惯

文末有提供贪吃蛇游戏的最终源码~

文章目录

  • 一、Code Copilot AI编程大模型
    • 操作指导
    • 用Java编写一个二分查找的代码,添加中文注释。
    • 生成一个java实战课程设计:做一个贪吃蛇游戏
      • 升级改进
    • 提供源码
  • 三、感受

一、Code Copilot AI编程大模型

操作指导

ChatGPT 4o国内直接访问地址:https://share.xuzhugpt.cloud/
在这里插入图片描述
上plus的车
在这里插入图片描述
输入购买的授权码即可。
默认就是 gpt-4o大模型
在这里插入图片描述
探索GPT–>编程–》选择Code Copilot
在这里插入图片描述
开始聊天。
在这里插入图片描述
进入聊天界面。
在这里插入图片描述

用Java编写一个二分查找的代码,添加中文注释。

输入:

用Java编写一个二分查找的代码,添加中文注释。

在这里插入图片描述
在这里插入图片描述

给出了完整的Java代码类,代码中也包含了完善的注释。并给出了很清晰的解析和进一步优化建议。
把代码拷到idea里运行。验证下结果:
在这里插入图片描述
结果是正确的。
在这里插入图片描述

生成一个java实战课程设计:做一个贪吃蛇游戏

输入:

你是一位java技术专家,游戏开发高手,请用java开发一个贪吃蛇游戏,添加中文注释,有个开始按钮和暂停按钮。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

给了两个类的完整代码。还给了改进建议,我们先去idea运行看看。
把代码复制进来。

运行代码。结果:
在这里插入图片描述
在这里插入图片描述
程序有点小问题,蛇吃不到食物。如图。蛇跟食物会重叠一部分
在这里插入图片描述
让 Code Copilot 帮我解决这个问题。
直接把出问题的截图给它。
在这里插入图片描述
重新生成的代码复制到idea中。
运行结果,可以正常吃到蛇了。
在这里插入图片描述
初步的贪吃蛇游戏就做成功了。

升级改进

在这里插入图片描述
给了改进建议思路,虚竹哥是听人劝,吃饱饭。改~
输入:

再添加计分系统,显示玩家的得分列表。

在这里插入图片描述
把生成的代码复制到idea中运行;
在这里插入图片描述
玩两把。
在这里插入图片描述
得分列表有了,但感觉没啥特点。再加点需求
输入:

得分列表按分数降序,每个得分旁边增加一列:游戏结束时间。

在这里插入图片描述
代码复制到idea中。运行。
再玩两把。嗯,效果可以。
在这里插入图片描述

提供源码

有需要自取。
ScoreManager.java - 管理分数的类

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;public class ScoreManager {private List<ScoreEntry> scores;public ScoreManager() {scores = new ArrayList<>();}public void addScore(int score) {scores.add(new ScoreEntry(score, new Date()));// 按分数降序排列Collections.sort(scores, new Comparator<ScoreEntry>() {@Overridepublic int compare(ScoreEntry s1, ScoreEntry s2) {return Integer.compare(s2.getScore(), s1.getScore());}});}public List<ScoreEntry> getScores() {return scores;}public static class ScoreEntry {private int score;private Date date;public ScoreEntry(int score, Date date) {this.score = score;this.date = date;}public int getScore() {return score;}public String getDate() {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");return sdf.format(date);}}
}

SnakeGame.java - 主类

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;public class SnakeGame extends JFrame {private GamePanel gamePanel;private JButton startButton;private JButton pauseButton;private JButton scoreButton;private JLabel scoreLabel;private ScoreManager scoreManager;public SnakeGame() {setTitle("贪吃蛇游戏");setSize(600, 600);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setLocationRelativeTo(null);scoreManager = new ScoreManager();gamePanel = new GamePanel(scoreManager);startButton = new JButton("开始");pauseButton = new JButton("暂停");scoreButton = new JButton("显示得分");scoreLabel = new JLabel("得分: 0");// 开始按钮的功能:开始游戏startButton.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {gamePanel.startGame();gamePanel.requestFocusInWindow(); // 使游戏面板获得键盘焦点}});// 暂停按钮的功能:暂停游戏pauseButton.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {gamePanel.pauseGame();}});// 显示得分按钮的功能:显示玩家得分列表scoreButton.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {showScoreList();}});// 控制面板包含开始、暂停按钮和得分显示JPanel controlPanel = new JPanel();controlPanel.add(startButton);controlPanel.add(pauseButton);controlPanel.add(scoreButton);controlPanel.add(scoreLabel);add(gamePanel, BorderLayout.CENTER);add(controlPanel, BorderLayout.SOUTH);// 注册游戏面板的得分更新监听器gamePanel.setScoreListener(new GamePanel.ScoreListener() {@Overridepublic void scoreUpdated(int score) {scoreLabel.setText("得分: " + score);}});}// 显示得分列表private void showScoreList() {StringBuilder scoresText = new StringBuilder("玩家得分列表:\n");for (ScoreManager.ScoreEntry scoreEntry : scoreManager.getScores()) {scoresText.append("得分: ").append(scoreEntry.getScore()).append(" 时间: ").append(scoreEntry.getDate()).append("\n");}JOptionPane.showMessageDialog(this, scoresText.toString(), "得分列表", JOptionPane.INFORMATION_MESSAGE);}public static void main(String[] args) {EventQueue.invokeLater(new Runnable() {public void run() {SnakeGame game = new SnakeGame();game.setVisible(true);}});}
}

GamePanel.java - 游戏面板类

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.Random;public class GamePanel extends JPanel implements ActionListener {private final int TILE_SIZE = 20; // 每个格子的大小private final int WIDTH = 600;    // 游戏面板的宽度private final int HEIGHT = 600;   // 游戏面板的高度private final int ALL_TILES = (WIDTH * HEIGHT) / (TILE_SIZE * TILE_SIZE); // 总格子数private final int[] x = new int[ALL_TILES]; // 贪吃蛇的x坐标private final int[] y = new int[ALL_TILES]; // 贪吃蛇的y坐标private int snakeLength; // 贪吃蛇的长度private int foodX;       // 食物的x坐标private int foodY;       // 食物的y坐标private int score;       // 玩家得分private boolean running = false; // 游戏是否在进行中private boolean paused = false;  // 游戏是否暂停private Timer timer;     // 定时器控制游戏速度private char direction = 'R'; // 贪吃蛇的初始方向private ScoreListener scoreListener;private ScoreManager scoreManager;public GamePanel(ScoreManager scoreManager) {this.scoreManager = scoreManager;setBackground(Color.BLACK);setFocusable(true);setPreferredSize(new Dimension(WIDTH, HEIGHT));addKeyListener(new SnakeKeyAdapter());initGame();}public void setScoreListener(ScoreListener listener) {this.scoreListener = listener;}// 初始化游戏状态private void initGame() {snakeLength = 3;for (int i = 0; i < snakeLength; i++) {x[i] = 100 - i * TILE_SIZE;y[i] = 100;}placeFood();score = 0;if (scoreListener != null) {scoreListener.scoreUpdated(score);}timer = new Timer(140, this);}// 开始游戏public void startGame() {if (!running) {running = true;paused = false;initGame(); // 重新初始化游戏状态timer.start();} else if (paused) {paused = false;timer.start();}}// 暂停游戏public void pauseGame() {if (running) {paused = true;timer.stop();}}// 绘制游戏内容@Overrideprotected void paintComponent(Graphics g) {super.paintComponent(g);if (running) {draw(g);} else {showGameOver(g);}}// 绘制贪吃蛇和食物private void draw(Graphics g) {g.setColor(Color.RED);g.fillRect(foodX, foodY, TILE_SIZE, TILE_SIZE);for (int i = 0; i < snakeLength; i++) {if (i == 0) {g.setColor(Color.GREEN);} else {g.setColor(Color.ORANGE);}g.fillRect(x[i], y[i], TILE_SIZE, TILE_SIZE);}}// 显示游戏结束信息private void showGameOver(Graphics g) {String msg = "游戏结束。得分: " + score;Font font = new Font("Helvetica", Font.BOLD, 40);FontMetrics metrics = getFontMetrics(font);g.setColor(Color.RED);g.setFont(font);g.drawString(msg, (WIDTH - metrics.stringWidth(msg)) / 2, HEIGHT / 2);// 显示继续游戏的选项msg = "按空格键继续游戏";font = new Font("Helvetica", Font.BOLD, 20);metrics = getFontMetrics(font);g.setFont(font);g.setColor(Color.WHITE);g.drawString(msg, (WIDTH - metrics.stringWidth(msg)) / 2, HEIGHT / 2 + 40);// 保存当前得分到得分列表scoreManager.addScore(score);}// 检查贪吃蛇是否吃到食物private void checkFoodCollision() {if ((x[0] == foodX) && (y[0] == foodY)) {snakeLength++;score++;if (scoreListener != null) {scoreListener.scoreUpdated(score);}placeFood();}}// 移动贪吃蛇private void move() {for (int i = snakeLength; i > 0; i--) {x[i] = x[(i - 1)];y[i] = y[(i - 1)];}switch (direction) {case 'U':y[0] -= TILE_SIZE;break;case 'D':y[0] += TILE_SIZE;break;case 'L':x[0] -= TILE_SIZE;break;case 'R':x[0] += TILE_SIZE;break;}}// 检查贪吃蛇是否碰到自己或边界private void checkCollision() {for (int i = snakeLength; i > 0; i--) {if ((x[0] == x[i]) && (y[0] == y[i])) {running = false;}}if (x[0] < 0 || x[0] >= WIDTH || y[0] < 0 || y[0] >= HEIGHT) {running = false;}if (!running) {timer.stop();}}// 随机放置食物,并确保食物不与蛇重叠private void placeFood() {boolean valid;do {valid = true;int r = (int) (Math.random() * (WIDTH / TILE_SIZE));foodX = ((r * TILE_SIZE));r = (int) (Math.random() * (HEIGHT / TILE_SIZE));foodY = ((r * TILE_SIZE));for (int i = 0; i < snakeLength; i++) {if (x[i] == foodX && y[i] == foodY) {valid = false;break;}}} while (!valid);}// 每次定时器触发时调用@Overridepublic void actionPerformed(ActionEvent e) {if (running && !paused) {checkFoodCollision();checkCollision();move();}repaint();}// 键盘事件处理,控制贪吃蛇的方向和重新开始游戏private class SnakeKeyAdapter extends KeyAdapter {@Overridepublic void keyPressed(KeyEvent e) {int key = e.getKeyCode();if (key == KeyEvent.VK_SPACE && !running) {startGame();}if ((key == KeyEvent.VK_LEFT) && (direction != 'R')) {direction = 'L';}if ((key == KeyEvent.VK_RIGHT) && (direction != 'L')) {direction = 'R';}if ((key == KeyEvent.VK_UP) && (direction != 'D')) {direction = 'U';}if ((key == KeyEvent.VK_DOWN) && (direction != 'U')) {direction = 'D';}}}// 定义得分监听器接口public interface ScoreListener {void scoreUpdated(int score);}
}

三、感受

好用的功能太多太多,我就不在这个一一列举了,有兴趣的可以自行尝试。

有提供免费的授权码可体验~

有提供免费的授权码可体验~

有提供免费的授权码可体验~

私信虚竹哥,获取体验码~
国内可直接使用~
在这里插入图片描述


http://www.mrgr.cn/news/34797.html

相关文章:

  • 前端框架对比及选择:React、Vue、Angular的深度剖析
  • 银行业数据科学家的 6 条经验教训
  • 详解常见排序
  • hbase之布隆过滤器
  • 【自动驾驶】基于车辆几何模型的横向控制算法 | Pure Pursuit 纯跟踪算法详解与编程实现
  • RPA + 生成式AI
  • 搜索二叉树
  • 【GitLab】安装和使用
  • 【高性能内存池】基本框架 + 固定长度内存池实现 1
  • 一篇讲透:Wi-Fi定位、基站定位!
  • ①大缓存ModbusRTU485数据集中采集器寄存器线圈重映射从站并发采集Modbus 串口RS485 转 RS485
  • C# 路径算法之Floyd-Warshall算法
  • C++存储数据单位转换输出字符串
  • 【STM32开发笔记】移植AI框架TensorFlow到STM32单片机【上篇】
  • 【小米手机无法连接电脑】一般问题和驱动MTP问题的结局ue
  • 职场人生之面试避雷
  • 软考高级:软件系统经济可行性-开发成本、运营成本、有形收益、无形收益区分
  • 跨域问题、同源策略、CORS机制、Nginx解决跨域问题(AI问答,仅供参考)
  • 15年408-数据结构
  • 软考高级:中台相关知识 AI 解读