《ChatGPT协作开发实录:编程新手的试验探索》

点击蓝字 关注我们

张刚老师在《ChatGPT结对编程实录:提升生产力,还是被代替?》一文中,在没有编写任何一行代码的情况下自己指导ChatGPT实现了俄罗斯方块这个游戏。在看完整篇文章后我们深刻感受到了ChatGPT在其中体现的代码生成的能力,于是抱着下面的一些疑问也开始了我们关于ChatGPT结对编程的探索:

1、如果是对于完全没有开发俄罗斯方块游戏经验的人来说,ChatGPT真的可以提供端到端的开发帮助吗?

2、如果ChatGPT有这么强大的开发能力,那么对于程序员我们如何更好的利用ChatGPT去辅助我们的开发呢?

在这次探索中,我们一共进行了三种试验,这三种试验使用的都是GPT-4,并且全程人工没有写一行代码,只是将GPT生成的代码拷贝到编译器中。

前两种试验是在没有看文章思路的情况下,由一位完全没有俄罗斯方块开发经验的学生全程借助ChatGPT,自己尝试去复现这个游戏产生的两种实现思路。第三种试验是按照文章中的思路去实现这个游戏,下面是我们整个探索的过程。

第一种试验:逐类实现

第一步:创建游戏框架

在最开始,ChatGPT给出了具体实现游戏的步骤,和整体的游戏框架。

b92471eb0661352bf65d4c8fcce999a4.png

6dc3281ae512762402dab4e977994741.png

0de96c8c477eebd18039af821b4b7481.png

86fe45509af18847a50e582796a56b2c.png

第二步:实现Board类

按照ChatGPT在第一步给出的步骤,首先让其实现Board类。

ae8001510f064f0b87a9dd528e26974e.png

97411170e17a1fb5aa8a38f61559b7ba.png

fc04885aa8ae6d982bea17bac4f1b5c0.png

第三步:实现Tetriminos类

526007b853d0d3219aa4b8e38f49fd3e.png

18cf15d802898abd3ae54cd3ff578630.png

d034b349b556dd86f13b914ece4c72e1.png

17b7ac371ba350eee9ed2f5cba900ca1.png

第四步:实现GameWindow类

b8a184a8703f702fca13863b9d29af03.png

d8e0171a9cc7a46eb92e8749db88023a.png

bf5315a1898bc475e4487867578e0a06.png

第五步:实现游戏循环和控制

最后完善GameWindow类,实现游戏的循环控制,例如方块的下落、用户的输入响应等。

b65abf720e697fcaebceabd6c8d8de3e.png

097adf98d25871a415b2ee0260f3645e.png

018d8ef5fcb4036220446607056d40cb.png

在最开始的试验中,我们按照第零个提问——“你能一步一步指导我编写java代码去实现这个游戏吗?”所给出的回答,让ChatGPT逐步地帮我们把每个类全部实现,将这些代码运行后我们得到了下面的结果:

be736e735ef80039ff584c8b381bdae4.png

可以看到这是一个完全静止的面板,一个方块都没有显示在这上面,于是我们又尝试将得到的代码给ChatGPT让它帮我们找出原因,但是修改过的代码运行后仍然是同样的静态面板。

第二种试验:逐feature实现

在得到这样不理想的结果后,我们进行了一些思考——在平常的项目开发中我们会用这样的逐类生成的方式去进行开发吗?对于俄罗斯方块来说,这是一个业务需求很明确的项目,或许尝试把整个要实现的游戏拆解成一个一个要实现的feature,然后去逐feature实现,这样的方式会更好一些,于是我们有了第二种试验:

第一步:创建游戏框架

和第一种试验思路一样,在最开始,让ChatGPT给出了具体实现游戏的步骤,和整体的游戏框架。

f51e284c3cda12350203a55f2d21bcf7.png

第二步:实现方块自动下落

4c274c8391fd96da12cd8c4e86ae4e36.png

0887ca217b4188e0e26ba8d1b9b22348.png

第三步:实现图形化界面

游戏没有图形化的界面,我们继续提出要求,让其生成图形化的界面。

fed074a435b8975cd19654fb621af525.png

7d162c2a674568b382218687d155a2cd.png

c3ff8c65b2083feccfa10598d7d80dfa.png

第四步:实现方块在底部的沉积

f07134c01f778efd1719576fae8fef5f.png

d3b036148b311ac7aaf29287d32b2547.png

第五步:实现方块之间的碰撞检测

接下来我们增加一个碰撞检测机制,这个机制需要检测方块是否即将与底部方块接触。

5a1180f8335d5ee9c91a0060a8e6db1e.png

第六步:增加方块样式

目前展示的方块都是单个正方形方块,我们让方块形式丰富起来

ff0c011fd9ca7b2b702398244c014c57.png

d973683169d7c0e5747fe5d37d7de71b.png

有一些报错,我们直接交给ChatGPT解决。

9cbb0b2fe5d02338223c30eb69a71138.png

在增加方块形式后,发现了方块沉积到底部后不显示的问题,同样也交给ChatGPT去解决。

8fe19212657c5526c7b5d2f8c55336ee.png

第七步:检测游戏结束

dd15d5d412fb1b1f4f155df9375047ad.png

同样有一些报错,交给ChatGPT去解决。

d5c3ca0d5cbd4637496b6d2171ab9af0.png

4e9b928333257d17592e26fd691aeb37.png

第八步:实现方块的左右移动

1c3b7f8e18b261a59c4e528b3169f574.png

0fbec3df539ed59147af53e1462320a1.png

第九步:实现方块的旋转

5d797e63161b6fafe31aae45ac90d58d.png

3091937be2406969d3b33928c7bc4b7a.png

第十步:实现整行消除和计分

78567428cfdef54806b0bfed9ed71d51.png

e511e243bac1815c50ee2a40bd813f8c.png

c25cfc9e005f20f5ac44e856b3b228b2.png

第十一步:让方块随机出现

目前每次出现的方块是固定形状的,我们让它变得随机

8cae9add5b5a4f42abffb55c27cef6c9.png

在这样逐feature向ChatGPT提问实现后的结果如下所示:

可以看到最终实现了一个简易的俄罗斯方块游戏,这要比之前逐类实现的尝试效果好很多。但是在进行的过程中产生错误代码的情况也比较多,需要不断地去尝试生成新代码,或者将错误代码重新给ChatGPT进行修改,整体来说也花费了不少时间。

第三种试验:按有过开发经验程序员的思路

第一步:创建游戏框架

dc0a49020d2a22f7abc78df2ed358d7f.png

第二步:创建游戏游戏窗口

eeb4b19079cc46122eab7afd5a28430d.png

第三步:在GUI上显示一个L形方块

82b46364c2f16bcbc4a014012061c6e5.png

97d272c872b5087cbd1232a31014a13e.png

第四步:可以移动方块并且进行碰撞检测

d062dc5f0f6d84c962fbaef6b45d1cbc.png

f00778470cad5b31ed4453f9375251ef.png

35aa0196b8d22916c8f775d70a89e421.png

55b4982cb873da0faa8829b11014ad07.png

96eb800884e878f39d3e04d9b0af5717.png

f1c8d68dcbb5f65339b5ca27bfbda495.png

第五步:可以旋转方块

a61a4a53527ad39dfcadd9e0ded68b44.png

966d97ca93358e7582f1f121e3afdac9.png

第六步:可以落下方块并且创建一个新的方块

23f0720ed3bed8ffd86a7cebb6d2ff7d.png

790e56a70a6633f041d22ba166f8fe78.png

第七步:可以检测游戏结束

c7bbebd80fc0630a44e1d1f8d4a821f3.png

第八步:增加整行消除和计分

fcfa3b0ae7352e171d7d055f35779d18.png

40e1d1feb8701e7e7771009e741b6bd0.png

b62b73632f4cf25f865ee558f2d6433e.png

39fe2f853d2eb7fdb83e0182506b1461.png

文章中的思路和第二种试验类似,也是逐feature去进行实现。按照文章中的思路实现的结果如下面的视频所示:

可以看到同样也实现出来了一个简易的俄罗斯方块游戏。但是在进行尝试时,我们明显感受到按照文章中的思路整体要顺畅一些,ChatGPT生成的代码正确率更高,少了很多需要重复生成和错误修改的步骤。

02815f4a0eaee78a6bb16eaca002b21c.png

总结与体会

相对于单看张刚老师在文章中的分享,经过这次探索后,我们更加深刻感受到了ChatGPT在实际代码生成设计上的能力。并且这三种试验的不同结果也给我们带来了新的思考和体会:

一、对项目进行feature分离

首先逐类实现这种试验的失败让我们觉得,在实际的软件开发中借助ChatGPT进行代码生成时,或许将要实现项目去细化成逐个的feature,再向ChatGPT提出,ChatGPT能够给出更加准确的代码。

二、细粒度的feature和合理的实现顺序

而我们的第二种试验和文章中进行的试验唯一的差别体现在实现这些feature的粒度和顺序上,而这样的不同或许正是导致了第二种方法在生成代码的正确率上要低于文章中的方法,从而导致整体复现的顺畅程度要低一些。第二种试验实现的顺序是:

1、实现方块自动下落的功能

2、方块到达最底部的时候能够沉积在底部

3、方块之间的相互碰撞

4、游戏结束的功能

5、实现方块左右移动的功能

6、增加方块的旋转功能

7、整行消除的功能

而文章中的实现顺序是:

1、先显示一个静态的L形方块

2、实现方块的左右移动

3、实现方块的碰撞检测、边界检测

4、旋转方块

5、按下键可以下落方块、沉积底部后创建新的方块

6、可以检测游戏结束

7、整行消除的功能

可以看到文章中的思路首先实现的是一个静态的L形方块的展示,再逐一在L型方块上增加feature。而我们自己的尝试中,首先去实现了方块自动下落这一feature,明显来说文章中的思路在进行提问的时候粒度更加的细。并且在顺序上,由于自动下落涉及到其余方法中的渲染和更新,所以相对来说,这样的feature在整个拓扑排序中不是优先级最高的,而如果将这样的feature放在前面先去实现,可能会导致ChatGPT在后续的feature实现时生成的代码正确率降低。所以更细粒度的划分和更合理的实现顺序或许会让ChatGPT生成正确代码的概率更高。

而这三种试验方法的不同思路或许也体现了人们在使用ChatGPT时的差异,在没有太多开发经验的情况下,人们或许会更加倾向于按照ChatGPT给出的最初回答,按照一个一个类去进行生成。而在有开发经验和先验知识的情况下,人们或许会更加清楚以逐个feature的形式向ChatGPT进行提问并且按照合适的顺序去实现会得到更好的效果。

总的来说,ChatGPT生成代码的能力是有目共睹的,但如何更好地使用ChatGPT,也紧密取决于使用者本身对于开发项目的理解和开发设计规划。在对项目有合理规划,并且对项目整体进行细粒度feature的拆解,甚至按照合理的顺序去逐步实现的情况下,ChatGPT能够发挥出更强的能力。

全部的代码已经放在:https://github.com/FudanSELab/TetrisGame.git

作者:王瀚林

编辑:孙婕

审核:娄一翎、刘名威

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值