赞
踩
首先创建一个MySnake类,用来当做主类,搭建出框架
效果如图:
首先创建一个MyPanel类,同时继承JPanel类(重写其中的paintComponent方法来绘制出各种组件)(paintComponent方法其实属于Panel的超类JComponent,不过因为添加到框架时要用到JPanel,故这里也可以理解为重写),同时在MySnake类中,创建一个MyPanel类的对象,添加到f中
然后构造类,将panel背景设置成白色
最后重写paintComponent类(目的是实现自定义的组件绘制逻辑。这对于创建具有特定外观和行为的自定义组件非常有用。)
首先导入贪吃蛇游戏的标题图像、蛇头图像(四个,因为有四个方向)、蛇身体图像、食物图像
注意:导入的图像放到与src同级的目录下,否则读取不到(还可以直接读取图像地址,不过比较麻烦)
导入之后分别创建这7个图像的ImageIcon对象(可以直接复制这几个图片)
(调用 super.paintComponent(g)
是一种常见的做法,主要用于执行一些基本的图形绘制处理,如清除旧的画面内容,确保组件的其他部分正确渲染,以及处理一些继承的绘图逻辑。不调用super.paintComponent(g)
可能导致前一次的绘制内容没有被清除,从而在新的绘制上留下旧的图像。这通常会导致画面出现拖影或重叠现象。)
运行主类,结果如下:
在paintComponent方法中调用Graphics的fillRect方法(25,75意思是左上角坐标为25,75),实现蛇的活动区域
实现效果如图
首先,确定蛇的初始长度,再定义两个整型数组来存放蛇的x,y坐标(都在MyPanel类中完成)
之后创建一个initSnake方法,用来初始化蛇的头坐标以及两个身体坐标
最后,在paintComponent方法中画出蛇头以及两个身体
效果如图
继续在paintComponent方法中实现,利用Graphics的drawString方法在画布中添加字符串。
为了区分活动区域和字体,利用setColor方法改变字体颜色,setFont方法是用来设置字符串样式的
以上都是对静态画面的绘制,键盘操作是不会有任何反应的,接下来处理动态的事件
在贪吃蛇游戏中,交互由键盘进行,故需要设置键盘监听
首先设置布尔变量isStarted,并初始化为false,在paintComponent方法中加入条件判断,从而区分开始页面和游戏进行页面
让MyPanel类实现KeyListener接口,这样MyPanel类自身可以处理键盘事件。(换句话说,当前对象将成为键盘事件的监听器,并负责处理该组件上的键盘事件)
继承后需要重写三个方法keyTyped keyPressed keyReleased(键入字符时适用第一个,键入特殊键如方向键,空格键适用后面两个)
这里我们重写keyPressed方法,此方法在每次特殊键被按下时会被自动调用
最后在构造器中进行前提设置,就完成了对空格键的监听
创建一个字符hdirect表示蛇的运动方向,初始化为向右
在keyPressed方法中实现对四个方向键的监听,并转换成对应字符
画出对应方向的蛇头
首先创建一个Timer对象,作为计时器(每次计时结束时自动调用listener对象),这里将listener作为自己,此时程序会要求实现ActionListener接口并重写actionPerformed方法
在构造器中加入timer.start,这样程序会在构建对象后自动执行
timer在每一次倒计时(前面设为了100毫秒)结束后会自动调用actionPerformed方法,也就是说每一步毫秒后程序会自动执行actionPerformed方法,由于我们要画出运动的蛇,这里就可以理解为动画以100ms/1帧刷新。
当isStarted==true时,游戏才可以运行,因此要在actionPerformed中加入条件判断
上述代码理解:当游戏启动后,将蛇的各个部分的坐标重新赋值,同时注意蛇头越界后会从另一端出现(后续也可以实现碰壁游戏结束)
赋完坐标值之后,对画面进行重绘(注意这也是在actionPerformed方法中),接着调用启动器,实现循环调用actionPerformed方法
效果如下:
创建整型变量foodx,foody来表示食物的坐标,用Random类生成随机值
在initSnake方法中进行初始化,然后在paintComponent方法中画出来
画完之后,要建立食物和蛇的互动,当蛇头坐标等于食物时,蛇的长度增加,由于长度增加这一事件属于活动,我们自然想到在actionPerformed方法中进行
注意这里将最后的新增body坐标设为了倒数第二个的,这是因为在接下来repaint后最后的body在默认情况下会被设置为(0,0)坐标,那么左上角会跳一帧,虽然问题不大,但是影响观感
(这个if语句也在isStarted的判断中)
实现效果如图:
当蛇头碰到身体或墙壁时,认为游戏结束
首先创建两个个布尔变量isFailed和wining
当结束时,打印字样(在paintComponent方法中):
当胜利时,打印字样(在paintComponent方法中):
实现失败和成功的动画(在actionPerformed方法中),这里蛇的活动被限制在启动后,未失败,未开始的状态
当蛇头与身体,蛇头与墙壁碰撞时,游戏失败(同时这里我们要清除上面的蛇可以越过墙壁的代码)
至于胜利标志,我们首先设置一个积分,当积分达到一定时游戏胜利
当蛇头每次和食物接触时,积分增加
这样,当游戏失败或者成功时,都会弹出字样提示,同时我们还需要有对应的措施重新开始游戏,
在initSnake方法中,我们进行如下初始化
在键盘监听方法中,按下空格来使游戏重新开始
为了在游戏中看到实时的积分画面,我们需要在paintComponent方法中画出积分
效果如图
到此,游戏基本已经结束,我们还有可以进行扩展。
1.当蛇的长度增加时,可以增加蛇的移动速度(可以通过剪短计时周期)
2.添加背景音乐
3.设置不同的食物,有的具有增益效果,有的具有负面效果,从而增加趣味性
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。