Java项目:贪吃蛇游戏(java+swing)
功能简介:
贪吃蛇游戏
大嘴鱼类:
package fish;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Timer;
/**
* 大嘴鱼类<br>
* 此类继承AcitonListener,实现AcitonPerformed方法,练习ActionListener的另一种实现方法<br>
* 此类还练习定时器Timer的使用<br>
* 此类还练习图形类Graphics的使用<br>
*/
public class BigMouthFish implements ActionListener{
/** 大嘴鱼嘴的方向:0-上 */
public static int UP = 0;
/** 大嘴鱼嘴的方向:1-右 */
public static int RIGHT = 1;
/** 大嘴鱼嘴的方向:2-下 */
public static int DOWN = 2;
/** 大嘴鱼嘴的方向:3-左 */
public static int LEFT = 3;
/** 大嘴鱼的身体大小,以size为半径画圆 */
public int size = 50;
/** 大嘴鱼现在的方向(以嘴的方向为基准) */
public int direction = RIGHT;
/** 大嘴鱼身体的颜色 */
private Color color = Color.CYAN;
/** 大嘴鱼的位置x */
public int posx = 80;
/** 大嘴鱼的位置y */
public int posy = 80;
/** 大嘴鱼的速度,鱼每次前进的像素 */
public int speed = 4;
/** 大嘴鱼眼睛的大小 */
private int eyesize = size/5;
/** 大嘴鱼眼睛的位置x */
private int eyeposx = posx+size/2;
/** 大嘴鱼眼睛的位置y */
private int eyeposy = posy+size/5;
/** 大嘴鱼眼睛的颜色 */
private Color eyecolor = Color.RED;
/** 大嘴鱼嘴的最大角度的一半 */
private int maxMonth = 30;
/** 大嘴鱼现在嘴角的角度 */
private int monthsize = 30;
/** 大嘴鱼的嘴是否张开 */
private boolean isOpen = true;
private Timer time = null;
/**
* 大嘴鱼缺省构造函数.<br>
* 创建一个位置为(200,200),大小为50,方向为右,颜色为Color.CYAN,速度为10的大嘴鱼
*/
public BigMouthFish() {
//this的使用。
this(200,200,50,RIGHT,Color.CYAN,4);
}
/**
* 根据位置、大小、方向、颜色、速度构造一个大嘴鱼。
* @param posx 大嘴鱼的位置x。
* @param posy 大嘴鱼的位置y。
* @param size 大嘴鱼的大小。
* @param direction 大嘴鱼的方向:0-上;1-右;2-下;3-左。出入错误时,默认改为1。
* @param color 大嘴鱼的颜色。
* @param speed 大嘴鱼的速度。
*/
public BigMouthFish(int posx,int posy,int size,int direction,Color color,int speed) {
this.posx = posx;
this.posy = posy;
this.size = size;
if(direction==1 || direction==2 || direction==3 || direction==4)
this.direction = direction;
this.color = color;
this.speed = speed;
eyesize = size/7;
initEye();
time = new Timer(FishPool.reTime,this);
time.start();
}
/**
* 大嘴鱼移动。根据鱼的方向移动鱼。
*/
public void move(){
switch (direction) {
case 0:
posy--;
break;
case 1:
posx++;
break;
case 2:
posy++;
break;
case 3:
posx--;
break;
default:
break;
}
}
/**
* 改变大嘴鱼身体的颜色。
* @param color 欲改变大嘴鱼身体的颜色
*/
public void changeColor(Color color){
this.color = color;
}
/**
* 改变大嘴鱼的方向
* @param direction 欲改变大嘴鱼的方向
*/
public void changeDir(int direction){
this.direction = direction;
}
/**
* 使用画笔绘画大嘴鱼.大嘴鱼的头像:一个扇形的是鱼脸,上面有一个小圆是眼睛<br>
* 1.保存画笔颜色<br>
* 2.绘制大嘴鱼的脸<br>
* 3.绘制大嘴鱼的眼睛<br>
* 4.恢复画笔颜色<br>
* @param g 画笔
*/
public void paint(Graphics g){
//保存画笔的颜色
Color c = g.getColor();
//绘制鱼脸
g.setColor(color);
//从(posx,posy)点开始,绘制宽为size,高为size,开始角度为(direction%2==0?(direction+1):(direction-1))*90+monthsize,弧度为360-2*maxMonth的弧形
g.fillArc(posx, posy, size, size, (direction%2==0?(direction+1):(direction-1))*90+monthsize, 360-2*monthsize);
//绘制鱼眼
initEye();
g.setColor(eyecolor);
g.fillOval(eyeposx, eyeposy, eyesize, eyesize);
//恢复画笔颜色
g.setColor(c);
}
/**
* 大嘴鱼张嘴闭嘴事件<br>
* 此处只负责鱼的角度的变化,不负责鱼的重绘。
* 重绘在鱼池中实现。<br>
* 这样的好处:保证鱼的绘制和步伐分开。显示层和逻辑层单独处理。(面向对象的责任问题)。
* @param e 事件对象
*/
public void actionPerformed(ActionEvent e) {
if(isOpen){
monthsize -= 2;
if(monthsize<=0)
isOpen = false;
}else{
monthsize += 2;
if(monthsize>=maxMonth)
isOpen = true;
}
}
/**
* 方向改变时,眼睛的改变。
*/
private void initEye(){
switch (direction) {
case 0:
eyeposx = posx+size/7;
eyeposy = posy+size/2-eyesize;
break;
case 1:
eyeposx = posx+size/2;
eyeposy = posy+size/7;
break;
case 2:
eyeposx = posx+size*5/7;
eyeposy = posy+size/2;
break;
case 3:
eyeposx = posx+size/2-eyesize;
eyeposy = posy+size/7;
break;
default:
break;
}
}
}
豆豆类:
package fish;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Timer;
/**
* 豆豆类
*/
public class FishBean implements ActionListener{
/** 小鱼的位置x */
public int posx = 190;
/** 小鱼的位置y */
public int posy = 190;
/** 小鱼的大小,以size为半径画豆豆(圆)。 */
public int size = 10;
/** 小鱼的当前颜色 */
private Color color = Color.MAGENTA;
/** 小鱼的新颜色 */
private Color newColor = Color.MAGENTA;
/** 小鱼的旧颜色 */
private Color oldColor = Color.GRAY;
/** 小鱼消失时的闪烁时间 */
public static int flickerTime = 350;
/** 小鱼消失时的闪烁次数 */
public static int filckerNum = 8;
private int hasFileckedNum = 0;
/** 小鱼消失时闪烁的定时器 */
private Timer timer = null;
/**
* 缺省构造函数。按位置(40,40),大小15,颜色Color.MAGENTA构造一个豆豆。
*/
public FishBean() {
this(190,190,10,Color.MAGENTA,Color.GRAY);
}
/**
* 按照位置、大小、颜色构造一个豆豆类。
* @param posx 豆豆的水平坐标x。
* @param posy 豆豆的垂直坐标y。
* @param size 豆豆的大小。
* @param newColor 豆豆的颜色。
* @param oldColor 豆豆的旧颜色
*/
public FishBean(int posx,int posy,int size,Color newColor,Color oldColor) {
this.posx = posx;
this.posy = posy;
this.size = size;
this.newColor = newColor;
this.oldColor = oldColor;
this.color = newColor;
timer = new Timer(flickerTime,this);
}
/**
* 移动豆豆到新的位置。
* @param posx 豆豆的新水平坐标x。
* @param posy 豆豆的新垂直坐标y。
*/
public void newPos(int posx,int posy){
this.posx = posx;
this.posy = posy;
}
/**
* 绘制豆豆。
* @param g 画笔
*/
public void paint(Graphics g){
Color c = g.getColor();
g.setColor(color);
g.fillOval(posx, posy, size, size);
g.setColor(c);
}
/**
* 停止Timer。
*/
public void stopTimer(){
color = newColor;
timer.stop();
hasFileckedNum = 0;
}
/**
* 启动Timer。
*/
public void runTimer(){
timer.start();
}
/**
* 定时器事件。
*/
public void actionPerformed(ActionEvent e) {
hasFileckedNum++;
if(color.equals(newColor) || color==newColor)
color = oldColor;
else
color = newColor;
//定时器运行的次数完成时,停止定时器。
if(hasFileckedNum==filckerNum && timer.isRunning()){
stopTimer();
}
}
/**
* Timer定时器是否运行中。
* @return 返回Timer是否运行中。
*/
public boolean timerIsRunning(){
return timer.isRunning();
}
}
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
二维码