用亚马逊AI代码开发助手Amazon Q Developer开发小游戏(中篇)

news2024/12/23 19:47:07

快用人工智能帮程序员写代码、开发游戏!今天小李哥就来介绍亚马逊推出的国际前沿人工智能AI代码开发助手Amazon Q Developer。目前该代码助手在Hugging Face代码生成权威测试集SWE-bench中排名第一,可以根据我们的需求生成整个代码项目,并可以帮助我们解释代码、提供架构设计方案、编写代码测试案例、提供漏洞扫描和修复建议、基于我们GitHub代码库中的历史代码生成新的代码段。

在本篇我们将进行代码实操,用AI开发助手开发一个猜词小游戏,该猜词小游戏的游戏截图如下图。玩家在游戏中有五次猜词机会,目标是猜测一个六个字母的单词。每次猜测后,玩家在游戏界面中会收到单词位置对应的+ ? X 占位符反馈信息。其中+ 字符表示该位置的字母正确,? 字符表示字母在单词中但位置错误,X 字符表示字母不在单词中。通过不断的反馈和尝试,最终猜测出正确的单词。

方案所需基础知识

什么是Amazon Q Developer?

Amazon Q Developer 是一款由亚马逊云科技推出的AI驱动的软件开发助手,用于帮助开发者重新构想整个软件开发生命周期的体验,使得在亚马逊云科技或其他平台上构建、保护、管理和优化代码的过程变得更加快捷。其中比较亮点的功能是Amazon Q Developer Agent,它一个特性开发代理,该代理可以在集成到VSCode等开发环境(IDE)中,通过该工具开发者只需要通过自然语言输入,就可以自动生成定制化代码项目、修复代码bug和漏洞以及单元测试。当开发者输入特定代码需求后,软件开发代理会分析开发者的代码库并制定实现代码计划。开发者可以接受该计划,或者要求代理对其进行迭代优化之前的项目版本。在计划被确认接受后,代理会自动生成基于开发者需求的代码更改。

Amazon Q Developer 通过生成式人工智能(AI)为所有开发者提供目前性能最佳的代码生成工具,目前Amazon Q Developer在SWE-bench排行榜上名列第一。SWE-bench是一个测试系统自动解决GitHub代码问题的开发工具评估数据集。接下来小李哥就会介绍如何开始使用软件开发代理开发游戏、概述代理的工作原理等。

本实践包括的内容

1. 分享生成式AI猜词小游戏Java源代码

2. 利用Amazon Q为猜词小游戏源代码进行解释、构建、Debug

本实践包括的内容

Amazon Q代码助手插件安装

1. 确认已经在VS Code IDE运行环境中安装了进行实操实验的必要依赖项

  • Amamzon CLI
  • Visual Studio Code 的 Amazon Q 扩展
  • Git
  • Java - Amazon Corretto -- 版本 8 和17
  • Maven

2. 导航到 VS Code IDE 左侧窗格中的扩展图标

3. 在搜索栏中,输入 Amazon Q 并点击 Install

登录亚马逊云科技开发者账户使用Amazon Q Developer

4. 在 Visual Studio Code 的 Amazon Q 扩展中,选择上方的”Use For Free“,并选择Continue继续。

5. 出现提示是否要使用代码打开外部网站,选择打开。

6. 将打开浏览器选项卡并显示登录开发者账户Builder ID页面,输入账户信息登录。

7. 登录成功后我们就可以看到左侧的Amazon Q Developer对话界面,我们输入测试问题”What is your name?“可以得到Amazon Q Developer的介绍

小游戏源代码项目

8. 小李哥在这里将分享部分源代码,其中游戏控制器代码如下:

package com.example.qwords.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;

import com.example.qwords.model.Word;
import com.example.qwords.model.GameStatus;
import com.example.qwords.service.WordSelectionService;

import io.micrometer.core.lang.Nullable;
import lombok.extern.log4j.Log4j2;

@Controller
@Log4j2
public class GameController {

    private WordSelectionService wordBank;
    private String selected;
    private Word word;

    @GetMapping("/game")
    public String index(@RequestParam String user, Model model) {

        wordBank = new WordSelectionService();
        selected = wordBank.getWord();
        word = new Word(selected);

        log.info(user);

        int attempts = getAttempts(model);

        String result = "";

        //Set View Attributes
        model.addAttribute("word", word.getWord());
        model.addAttribute("message", "Make your first guess!");
        model.addAttribute("attempts", attempts);
        model.addAttribute("result", result);
        model.addAttribute("status", GameStatus.INPROGRESS);

        return "game";
    }

    @PostMapping("/game")
    public String makeGuess(String guess, int attempts, Model model) {

        String result = word.getInfo(guess);
        attempts = addAttempt(attempts);
        
        model.addAttribute("result", result);
        model.addAttribute("attempts", attempts);
        model.addAttribute("guess", guess);

        if (word.isCorrect(guess.toCharArray())) {
            model.addAttribute("message", "Congratulations! You guessed correctly");
            model.addAttribute("status", GameStatus.SUCCESS);
        } else {

            if (attempts >= 5) {
                model.addAttribute("message", "Sorry, you've reached the maximum number of attempts.");
                model.addAttribute("status", GameStatus.FAILED);
            } else {
                model.addAttribute("message", "Try again. Your next guess:");
                model.addAttribute("status", GameStatus.INPROGRESS);
            }
        }

        return "game";
    }

    private int getAttempts(Model model) {
        Integer attempts = (Integer) model.getAttribute
        ("attempts");
        return (attempts != null) ? attempts : 0;
    }

    private int addAttempt(@Nullable Integer attempt) {
        return attempt + 1;
    }

}

 单词选择服务源代码如下:

package com.example.qwords.service;

import com.example.qwords.repository.WordList;

public class WordSelectionService {

    private WordList wordlist;
    private String selectedWord;

    public WordSelectionService() {

        this.wordlist = new WordList();
        this.selectedWord = wordlist.getRandomWord();
    }

    public String getWord() {
        return this.selectedWord;
    }
}

利用Amazon Q为源代码开发增效

9. 我们通过以下命令编译、运行该Java项目

mvn verify
java -jar target/QWordsService-0.0.1.jar

10. 运行结束后会将游戏进程绑定到8090端口,并弹出窗口询问是否要在浏览器中打开应用程序。选择 Open in Browser,就可以弹出以下游戏界面。

11. 目前源代码中存在一个小Bug,就是每次被猜测的词是固定的,让游戏没有挑战性,我们想让这个被猜测的词是随机的。接下来我们一步步通过Amazon Q的AI能力解决这个Bug。首先我们选中我们在第8步分享的游戏控制器代码,然后右键单击“Send to Amazon Q > Send to prompt”,将 源代码发送到 Q。。

12. 接下来在Amazon Q聊天框中对选中代码解释,输入以下内容获得具体解释。

How is the word selected for the game?

代码解释如下:

13. 接下来我们重复同样的操作,将步骤9中的单词选择服务源代码导入到Q中,并提问以下问题对代码进行解释。

How does the WordSelectionService select and return a word for the GameController?

得到的解释如下:在该回复中,Q理解出单词随机选择的逻辑是调用了WordList.getRandomWord 函数,我们需要修改该函数内的代码逻辑实现随机单词生成。

14. 我们将该函数的源代码导入到Q中,并输入以下问题,让Q帮我们生成修改后的正确代码。

My words are not selected in a random fashion. Can you troubleshoot and fix the code?

得到以下回复,回复中可以看到Amazon Q建议使用Math.random() 实现随机单词的生成。在 Amazon Q聊天框的回复中,有一个在光标处插入(insert at cursor)选项,单击此选项可以直接将原项目中的源代码一键替换掉,更高效的对代码进行修改。

15. 我们再进入到WordList.getRandomWord 函数源代码中,可以看到代码已经被替换掉了

package com.example.qwords.repository;
import java.util.ArrayList;
import java.lang.Math;

public class WordList {

    private ArrayList<String> wordlist;


    public WordList() {
        this.wordlist = new ArrayList<String>();
        this.wordlist.add("animal");
        this.wordlist.add("bakery");
        this.wordlist.add("cracks");

    }
    
    public String getRandomWord() {
        int randomIndex = (int) (Math.random() * wordlist.size());
        return this.wordlist.get(randomIndex);
    }


}

16. 我们运行如下命令,对小游戏项目进行重新构建和启动

mvn -U clean verify
java -jar target/QWordsService-0.0.1.jar

17. 再次打开游戏页面,输入猜测的单词,我们发现被猜的单词已经不是固定单词了,通过这种方式让游戏更有乐趣。

 

以上就是利用亚马逊AI代码开发/生成工具-Amazon Q Developer开发猜词小游戏的中篇内容。欢迎大家关注小李哥的亚马逊云科技AI服务深入调研系列,关注小李哥未来不要错过更多国际前沿的AWS云开发/云架构方案。 

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

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

相关文章

(待更)数据结构与算法:字符串和KMP算法原理(附有leetcode344、541、151、459题解)

字符串交换相关 leetcode344.反转字符串 注意&#xff1a;这里的s是str数组 class Solution(object):def reverseString(self, s):""":type s: List[str]:rtype: None Do not return anything, modify s in-place instead."""n len(s)i 0j …

【C++】容器list常用接口详解

目录 一.基本介绍 二.list的使用 1.构造函数 2.迭代器 3.遍历方式 4.容量相关操作 5.增删改查 三.list迭代器失效问题 四.算法库函数和list关系 一.基本介绍 list是一个带头双向循环链表由于是链表&#xff0c;物理空间不连续&#xff0c;不支持随机访问数据&#xff0…

《机器学习》周志华-CH6(支持向量机)

6.1间隔与支持向量 给定训练样本 D { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x m , y m ) } , y i ∈ { − 1 , 1 } D\{(x_1,y_1),(x_2,y_2),...,(x_m,y_m)\},y_i\in\{-1,1\} D{(x1​,y1​),(x2​,y2​),...,(xm​,ym​)},yi​∈{−1,1}分类学习最基本的想法是基于训练集…

SQL优化神器 SQLAdvisor

简介 SQLAdvisor是一款开源的SQL优化工具&#xff0c;由美团点评公司的技术工程部DBA团队开发与维护。作为一个分析SQL语句并提出索引优化建议的工具&#xff0c;它基于MySQL原生词法解析&#xff0c;结合SQL中的where条件、字段选择度、聚合条件、多表Join关系等&#xff0c;…

爆改YOLOv8|利用yolov10的C2fCIB改进yolov8-高效涨点

1&#xff0c;本文介绍 本文介绍了一种改进机制&#xff0c;通过引入 YOLOv10 的 C2fCIB 模块来提升 YOLOv8 的性能。C2fCIB 模块中的 CIB&#xff08;Compact Inverted Bottleneck&#xff09;结构采用了高效的深度卷积进行空间特征混合&#xff0c;并使用点卷积进行通道特征…

PLM系统在企业数字化转型中的关键作用 三品PLM在制造业转型实例分析

在当今数字化时代&#xff0c;企业面临着日益激烈的市场竞争和快速变化的客户需求。为了保持竞争力并实现可持续发展&#xff0c;企业纷纷进行数字化转型。而PLM产品生命周期管理系统作为数字化转型的关键组成部分&#xff0c;其在企业中的应用显得尤为重要。本文将探讨PLM系统…

AAA原理与配置

定义 AAA是Authentication&#xff08;认证&#xff09;、Authorization&#xff08;授权&#xff09;和Accounting&#xff08;计费&#xff09;的简称&#xff0c;是网络安全的一种管理机制&#xff0c;提供了认证、授权、计费三种安全功能。 这三种安全功能的具体作用如下…

Java如何计算一个数的阶乘末尾有多少个零?

文章有点长&#xff0c;请耐心看完~~~ 这个问题涉及到阶乘&#xff08;factorial&#xff09;的一个有趣特性&#xff0c;即阶乘结果末尾零的数量。要理解这一点&#xff0c;我们首先要知道什么情况下一个数的末尾会产生零。 什么情况下一个数的末尾会产生零 在十进制数制中…

代码随想录训练营day35|46. 携带研究材料,416. 分割等和子集

46. 携带研究材料 思路&#xff1a;用一个数组来记录&#xff1f;dp[i]带i件物品的最大价值 好吧&#xff0c;这里用的是一个二维数组dp[i][j]&#xff0c;表示从[0&#xff0c;i]的物间任选武平&#xff0c;能用容量为j的背包装下的最大价值 重量 价值 物品0 1 15 物品1 3 2…

AI绘画|Stable Diffusion高质量提示词收集(附提示词手册以及提示词插件)

使用平台:comfyui 模型:AlbedoBase-XL 图片尺寸:768x1280 提示词万字手册&#xff0c;可以扫描下方&#xff0c;免费获取 图1 提示词 an attractive rough cyborg woman with a serious look in her eyes, messy conceptual felt-tip pen (drawing:1.3) by (Yoji Shinkawa:…

“三年级英语”暴增5亿搜索量?需求来了!附2个极品AI吸粉玩法!

家人们&#xff01;在英语细分领域&#xff0c;一直都是付费知识中的风口黄金大赛道。 而这两天“英语”这个关键词&#xff0c;在微信指数上的日搜索量突然猛增到5个亿。 这两天全网热词“三年级英语”&#xff0c;日环比搜索指数更是486.2%增长率&#xff0c;一天时间内就增…

vsftpd的安装和配置

目录 vsftpd的下载与配置 下载vsftpd vsftpd的配置 测试服务的功能 vsftpd的下载与配置 下载vsftpd rpm -qc vsftpd&#xff0c;检查vsftpd安装包是否存在&#xff0c;存在则不需要安装。 yum install -y vsftpd&#xff0c;不存在则yum安装vsftpd。 安装成功 vsftpd的…

早上醒来嗓子干、喉咙痛、咳嗽……快用这个润养好物,给嗓子做个spa,让身体润起来~

进入秋季&#xff0c;很多人出现了眼睛干涩、大便干燥、嘴唇干裂、咽喉疼痛等症状&#xff0c;虽说这些还能够忍受&#xff0c;但它却影响了正常的饮食和休息。 秋季气候干燥&#xff0c;外界燥邪侵犯肺部&#xff0c;易伤津液&#xff0c;肺失滋润&#xff0c;清肃失司&#x…

宣布 Vue 3.5 版发布

宣布 Vue 3.5 版发布 今天我们很高兴地宣布 Vue 3.5 版“天元突破红莲螺岩”正式发布&#xff01; 这一小版本发布没有破坏性更改&#xff0c;包括内部改进和一些有用的新特性。我们将在这篇博客中介绍一些亮点 - 详细的更改和新特性请查阅 GitHub 上的完整变更日志。 响应式…

单片机上搭配的SPI NOR FLASH容量告急!扩容新选择

文章目录 前言&#xff1a;正文&#xff1a; 为便于理解并省去容量单位转换的麻烦&#xff0c;以下容量单位均使用Byte单位&#xff08;128Mbit16MByte&#xff09; 前言&#xff1a; NOR FLASH 是市场上两种主要的非易失闪存技术之一。Intel于1988年首先开发出NOR Flash 技术…

代码审计总结

代码审计总结 概述 一、代码审计 1.1什么是代码审计&#xff1f; 1.2为什么要执行代码审核&#xff1f; 1.3代码审计的好处 二、代码审计流程 2.1代码检查方法 2.2代码检查项目 2.3编码规范 2.4代码检查规范 2.5缺陷检查表 2.6代码审计复查 2.7代码审计结果总结 三…

由一个 SwiftData “诡异”运行时崩溃而引发的钩深索隐(一)

概述 从 WWDC 23 开始&#xff0c;苹果推出了全新的数据库框架 SwiftData。它借助于 Swift 语言简洁而富有表现力的特点&#xff0c;抛弃了以往数据库所有的额外配置文件&#xff0c;只靠纯代码描述就可以干脆利索的让数据库的创建和增删改查&#xff08;CRUD&#xff09;一气…

10分钟了解OPPO中间件容器化实践

背景 OPPO是一家全球化的科技公司&#xff0c;随着公司的快速发展&#xff0c;业务方向越来越多&#xff0c;对中间件的依赖也越来越紧密&#xff0c;中间件的集群的数量成倍数增长&#xff0c;在中间件的部署&#xff0c;使用&#xff0c;以及运维出现各种问题。 1.中间件与业…

CAD图纸防泄密有哪些方法?五个防泄密方法分享

CAD图纸作为工程设计的重要资料&#xff0c;其防泄密工作至关重要。以下将分享五个有效的CAD图纸防泄密方法&#xff0c;旨在确保图纸的安全性和机密性。 1. 使用CAD软件自带的加密功能 大多数CAD软件&#xff0c;如AutoCAD&#xff0c;都内置了加密功能。在保存CAD图纸时&am…

MySQL主从复制(Linux篇)

1.概述 MySQL的主从复制&#xff08;Master-Slave Replication&#xff09;是一种数据复制解决方案&#xff0c;将主数据库的DDL和DML操作通过二进制日志传到从库服务器中&#xff0c;然后在从库上对这些日志重新执行&#xff08;也叫重做&#xff09;&#xff0c;从而是的从库…