Java贪吃蛇感想
暑假敲代码的效率真的不高呀,一个这种小游戏从最开始构思到最后实施代码,从最开始的Demo版本到最后的第四版本,花了一个星期了。本想再更新一个版本,加入双人对战模式,还想写个AI版,可是我估计按照现在我这种效率又要画上好多时间了。想想还是等以后有时间再写吧。。。虽然这游戏写起来看似不难,可是对现在的我来说,还是有点考验的。中途也遇到了不少问题,遇到了不少知识盲区。我发现设计游戏有时候比敲代码还要头疼,你从最开始基本没有什么头绪的状态到后来逐步开始思考游戏的玩法,怎么去实现,制定游戏规则,敲代码,调试代码,测试游戏,发现bug,寻找bug产生原因,调试,寻求方法修复,一步一步,还是需要思考挺多东西的。还有,程序写多了,代码到了一定数量级就会发现,程序的结构也是很重要的,各功能模块怎么抽象出来,怎么实现接口,怎么调用,怎么做到尽可能精简代码,可是值得考虑的。后来调整程序结构,把整个程序分到几个源文件中,又得重新思考怎么实现,数据怎么共享。怎么用一种数据结构来表示一种现实实体也是很重要的。比如我之前写过的一个2048小游戏,用什么来表示那一个个方块呢?那时候我还没用过Java画图函数,但是那段时间在学Java GUI ,所以我自然想到用一个Button来表示一个方块,其实现在我去重新写那个游戏,我自然不会用button了,因为用button表示方块时无法在移动中出现动画效果,移动效果十分不自然,闪现的感觉。但是我当时想到那种方式能实现移动我觉得很不错了。再比如这次的蛇身体怎么表示呢,由于我最初的Demo版本蛇身体是用画图的形式实现的,所以我只需要每次记录下每个身体节点的坐标就可以实现每次重绘身体节点的时候产生移动的效果,于是我写了一个类,把横坐标和纵坐标封装进去了。后来发现这个类给我带来了很多好处,有些是我最开始都没想到的。比如后来产生食物的时候食物也需要一个坐标,等等。后来重新用图片表示身体时又在想怎么实现移动效果,发现只需要每次重新设置label的坐标即可。只不过要在重新开始前移除所有的这些label然后重新添加,重新设置坐标。再后来加入障碍物时,也就是加入很多堵墙,在想怎么表示这些墙呢,最初的墙我想只沿着网格线画一根比较粗的线条即可,后来我发现这种方式我无法实现判断蛇头撞墙,于是我改用了之前实现蛇身体的方式,该用了图片,这样一堵墙就是一个坐标数组,这样我就抽象出了墙这种实体,然后写了一个类,多堵墙就是这个类的一个数组。。。再到最后实现那个喷火功能时也思考了很久,遇到了一些bug,慢慢调试,耐心寻找原因,好在最后的效果还算满意。
我估计自己再敲完最后几个Java程序就不会再用Java了,倒不是说永远不用,至少大学剩下两年估计不会再用了。Java确实很棒,有一点C语言或者C++基础再稍微学习一下可以很快上手的,最重要的是,Java能很快让你学会它的GUI,有了GUI就可以写很多东西了,虽然窗体程序技术含量不一定比得上C++几百行代码,但是,敲点GUI的小程序还是成就感十足的。以前敲C++时,总是在黑色的控制台输入一个东西,然后程序给你返回一个东西,感觉很无聊。有了GUI确实有趣多了,但是也会花你很多时间去关注那些不属于程序核心的东西,有时候会为了一个界面布局的美观在那里调来调去很长时间,最后才发现这不是主要的活呀。我现在还是觉得功能的实现与完善是最要的,虽然我也很关注GUI,但让我去写这东西,还是感觉很烦的。Java把很多东西给你封装好了,用起来很简单也很方便,我用Java一学期,最大的印象就是用什么就new什么,甚至可以直接new ...();连变量名都用不上了,还有用Java的时候函数参数传递都没怎么用了,很多方法的返回值都可以直接写成void了,也没了指针,引用也很少用了,这些我以前用C++时每天要接触的东西一下子感觉陌生了,而且调试都用的少了,有些时候加上一句输出就可以判断问题出在哪。可是,我愈发有种感觉,虽然Java代码一个学期的量就比之前写过的C和C++加起来还要多的多,但是总感觉没有以前写程序的那种感觉了,总有种感觉是在把别人已经实现好的东西组合起来的感觉,确实Java里很多东西我只会用,不了解太深的原理,甚至有些语法我都不是很熟悉,但是只要你有一定基础,写程序时逻辑清晰,能够用程序把你的逻辑表达出来就可以了,这不如我学习C++时候的感觉,C++的一些语法我可能一下子都看不懂,要思考很久,但是感觉看懂了就很有收获,虽然没写过太多程序,但是感觉能力在提升。于是我打算重新回到C++了,我怕我再接着用Java最后C++会忘很多,学好了C++确实其他语言上手很快。
以上只是一个菜鸡的一己之见,忘园里大神勿喷。
最后附上我写的这个贪吃蛇最后一个版本的截图
Java贪吃蛇感想的更多相关文章
- java贪吃蛇
这个贪吃蛇有很多功能没有实现,比如说穿墙(本来可以实现,但是穿墙后,就会出现坐标混乱,吃不到食物了),还有碰到自己的身体死亡的情况也没有实现,现在我知道如何判断是否碰到身体,但是,我不知道,如何处理碰 ...
- Java贪吃蛇游戏
package snake.game; import java.awt.CardLayout; import java.awt.Color; import java.awt.Graphics; i ...
- Java贪吃蛇小游戏
贪吃蛇 思路 首先构思游戏布局,计算合理的坐标系. 绘制静态数据(广告.初始小蛇.提示信息.棋盘) 添加键盘监听事件,改变游戏状态以及小蛇运动方向 添加定时器,让小蛇在一段时间内移动一定的距离 随机产 ...
- java贪吃蛇小游戏详解
https://blog.csdn.net/u011622021/article/details/81162083
- Java经典小游戏——贪吃蛇简单实现(附源码)
一.使用知识 Jframe GUI 双向链表 线程 二.使用工具 IntelliJ IDEA jdk 1.8 三.开发过程 3.1素材准备 首先在开发之前应该准备一些素材,已备用,我主要找了一个图片以 ...
- 关于用Java写的贪吃蛇游戏的一些感想
学习Java有那么一个月了,兴趣还是挺高的.然而最近老师布置的一个迷宫问题,着实让我头疼了一两个礼拜,以至于身心疲惫,困扰不安.无奈,暂且先放下这个迷宫问题,写个简单点的贪吃蛇程序,以此来提高低落的情 ...
- 贪吃蛇的java代码分析(一)
自我审视 最近自己学习java已经有了一个多月的时间,从一开始对变量常量的概念一无所知,到现在能勉强写几个小程序玩玩,已经有了长足的进步.今天没有去学习,学校里要进行毕业答辩和拍毕业照了,于是请了几天 ...
- 贪吃蛇的java代码分析(二)
代码剖析 贪吃蛇是一款十分经典的小游戏,对初入coding的朋友来说,拿贪吃蛇这样一个案例来练手十分合适,并不高的难度和成功后的成就感都是学习所必须的.下面我将依照我当时的思路,来逐步分析实现的整个过 ...
- 贪吃蛇的java代码分析(三)
代码剖析 在上一篇文章中,我们完成了贪吃蛇部分代码的构造.回头审视我们写的代码与思路,会发现我们遗漏了一个重要的地方,那就是:贪吃蛇的自身移动.想必大家都知道,贪吃蛇自身是会自己移动的,并且会跟随你的 ...
随机推荐
- Codeforces Round #436 (Div. 2)
http://codeforces.com/contest/864 第一次打cf的月赛-- A 题意:给你一个数列,问你能不能保证里面只有两种数且个数相等.2<=n<=100,1<= ...
- Activit各个网关使用简单介绍
一.排他网关 Exclusive Gateway 排他网关又叫互斥网关,条件计算为true的顺序流会被选择继续流程,有且只有一条出口,如果出现多个条件为true,则会默认选择第一条true来执行,如果 ...
- Jarvis OJ - [XMAN]level3 - Writeup——ret2libc尝试
这次除了elf程序还附带一个动态链接库 先看一下,很一般的保护 思路分析 在ida中查看,可以确定通过read函数输入buf进行溢出,但是并没有看到合适的目标函数 但是用ida打开附带的链接库,可以看 ...
- Mysql的管理及使用
第1章 Mysql的管理 1.1 连接管理mysql mysql[options] #Linux或UNIX shell提示符(终端窗口) mysql --help #查看帮助信息 mysql --ve ...
- java学习笔记之集合家族1
集合 集合介绍: 由于数组中存放对象,对对象操作起来不方便.java中有一类容器,专门用来存储对象. 集合与数组的区别: 1.数组的长度固定的,而集合长度时可变的 2.数组只能储存同一类型的元素,而且 ...
- Linux中MySQL5.6编译安装与MySQL5.7二进制安装步骤
首先,介绍一下MySQL的几种安装方式 1.RPM.Yum 的安装方式:安装方便.安装速度快,无法定制 2.二进制:不需要安装,解压即可使用,不能定制功能 3.编译安装:可定制,安装慢. 编译安装中需 ...
- this的指向问题
在 ES5 中,其实 this 的指向,始终坚持一个原理:this 永远指向最后调用它的那个对象. 例 1: var name = "windowsName"; function ...
- ASP.NET Core 指定环境发布(hosting environment)
ASP.NET Core 应用程序发布命令: dotnet publish [<PROJECT>] [-f|--framework] [-r|--runtime] [-o|--output ...
- python 列表解析
列表解析,主要用于动态创建列表 本篇主要说一下,lambda.map().和filter()同列表解析语句之间结合的用法 列表解析的基本语法为:[expr for iter_var in iterab ...
- Java加密与解密笔记(三) 非对称加密
非对称的特点是加密和解密时使用的是不同的钥匙.密钥分为公钥和私钥,用公钥加密的数据只能用私钥进行解密,反之亦然. 另外,密钥还可以用于数字签名.数字签名跟上文说的消息摘要是一个道理,通过一定方法对数据 ...