Java 编写 贪吃蛇游戏的 大体思路是什么?

 我来答
匿名用户
2013-06-14
展开全部
要代码和jar包我这有,思路我就大概讲一下:首先是要在画布上画上一个块,这就是蛇头,但是蛇是会变长的,所以需要用一个东西来存蛇,那就可以用数组、ArrayList、LinkedList、等等(我比较喜欢用LinkedList),这里虽然说的是蛇,其实是一个块的x、y坐标,蛇是画好了,但蛇是会动的,这就要用一个线程和一个move()方法了,让它不停的动,蛇是动了,但是没有方向,这时需要一个方法让它有方向,但要注意的是相反的方向不能改变方向(也就是按了上,按下就不能用了),蛇有方向又能动,但到边上了就不行了,这时就要让它出界结束游戏,接下来就是要出现食物了,食物这个好办,用一个随机数搞定它,注意食物不能在界外,食物有了,蛇就要去吃它了,这时就要用一个方法去吃食物了,吃到了让蛇长一个块,食物重新出现,蛇是长大了,但是它可以碰到自己的身体,那么你就要做了方法让它碰到后结束游戏,就这样最初步的思路搞定了。接下来的就是一些细节了,这就不说了。
匿名用户
2013-06-14
展开全部
这个比较轻松,首先考虑的是,它是贪食蛇,所以,这个得有蛇类,蛇会吃所有的物体(因为它贪吃)。因此还会有物体类蛇所吃的所有的物体都应该可以画在界面上,那么这些类基本都应该实现一个自定义的超级接口IDraw(随便取名)。既然可以画出来给人看,又可以被蛇吃掉。那么这个接口应该定义。画(Graphics g);和 被吃(蛇对象)的方法游戏里面蛇是由多段的身体组成,比如一个蛇头,多块蛇身(多块是为了增加蛇的机动性),一个蛇尾。把蛇分成多个段,比如一条蛇初始值为5段,,第一段为蛇头,最后一段为蛇尾,其他中间位蛇身。因此蛇是由Body类组成,body实现IDraw接口,实现将自己画出来的方法。包含的属性描述自己的坐标,方向,还有属于蛇头,蛇尾还是蛇体。 被吃的方法,传入蛇对象,将蛇对象的属性蛇尾死亡。其他的实现idraw接口的物体,比如苹果类,同样要实现画出自己,和被吃的方法。传入蛇参数,调用蛇的成长方法,让蛇长大。蛇类,应该由一个list的Body组成,内部肯定有一个List<Body>属性,是否死亡等等。通常会实现移动,吃(Idraw),成长,还有IDraw接口。成长方法让自己增加一段蛇身。draw方法基本上就是遍历调用List<Body>的draw方法。吃方法,实现遍历所有的可以在界面上画出来的物体(也就是所有的实现了IDraw接口的对象),如果这些对象和自己碰撞了,就调用该对象的 被吃 方法,将作为参数自己传入,然后由该物体决定,蛇是死亡还是成长。所有实现了IDraw接口的对象会由Game类传入。Game类来维护整个游戏,负责响应用户操作,初始化并保存界面上的所有实现IDraw接口的实体类。蛇的移动方法的参数也将需要用到Game类所维护的用户输入来确定移动方向。蛇每移动一步,就应该画出自己,蛇的移动轨迹很好算,只需要按照用户输入的方向来判断,蛇头新的方向和坐标,然后蛇身和蛇尾相继获取前一个Body的状态和坐标。比如所,蛇头body向上移动一格,蛇头有了新坐标,那么第二个蛇身的坐标就是原来蛇头的坐标,第三个蛇身则是第二个蛇身的坐标和方向。依此类推。大体上就是这样。还算简单,如果还不理解的话可以在问。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
推荐于2018-04-17
展开全部
楼主没有看到蛇移动的本质,蛇虽然是分成很多块,但他们还是一个整体,每一块的移动都和上一块有关,所以不需要对每一块都进行判断。
原理:
把蛇身体的每一块看成一个对象(对象存储该块的坐标和相关信息),作为节点存储在线性链表中,再设置一个变量标志蛇的方向(通过按键可以改变)。一般人都是让每一个节点等于他指向的下一个节点,并让头节点改变位置来实现转弯和移动,这个算法复杂度太高(O(n)),实际上只要做两步操作,插入一个头节点,删除一个尾节点就可以了,新插入的头节点位置根据蛇当前的方向决定 用一个数组将蛇头的行径记录下来,然后第二段的下一个方格设置为蛇头走过的方格,这样子蛇走过的路径都是前一段走过的,最后将跟着蛇头走了,比如
蛇身的路径
for(int i=snakeLength-1;i>0;i--){
rows[i]=rows[i-1];//依次将蛇前面一段走过行的路段赋值给蛇的下一段
cols[i]=cols[i-1];//依次将蛇前面一段走过列的路段赋值给蛇的下一段
}
for(int i=1;i<snakeLength;i++){
gamePanel[rows[i]][cols[i]].setBackground(Color.red);//将整个面板上蛇身走过的行和列设置为不同的颜色,当然可以用图片来设置
}
蛇头走过的行和列(rows[0],cols[i])要根据不同的方向加减1来将面板设置成不同的颜色
如gamePanel[rows[i]-1][cols[i]+1].setBackground(Color.red)
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
张寒节畴
2019-08-14 · TA获得超过3849个赞
知道大有可为答主
回答量:3174
采纳率:26%
帮助的人:181万
展开全部
加入一个全局变量,表示当前的状态,线程中改变坐标的时候加入判断,如果当前状态为暂停那坐标不要改变,这样你只要给空格键加入事件,事件中改变这个全局变量,相应的可以决定坐标是否改变,坐标不改变也就意味着游戏暂停
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
程序爱源源
2020-12-26
知道答主
回答量:18
采纳率:0%
帮助的人:9911
展开全部

这是我专科二年级第一学期的Java课程设计,贪吃蛇是很多人知晓的游戏,但是我做了创新,主要有移动障碍物、穿越节点、创建关卡、AI,其中移动障碍物,穿越节点丰富游戏玩法,AI用到了BFS算法,用了IO流保存地图数据

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式