贪吃蛇小游戏(团队)
贪吃蛇小游戏
成员介绍
成员 | 任务分配 | 职务 |
---|---|---|
郑伊杰 | Git的提交和上传,蛇的移动和边界处理,蛇吃食物,添加蛇的长度显示分数 | 组长 |
曾纪 | 游戏界面的设计,所需要的图片制作,博客的编写 | 组员 |
安省龙 | 显示分数,重新开始,游戏结束,添加音乐 | 组员 |
gitee地址
https://gitee.com/zheng-yijie/java_-snake/tree/master
前期调查
图片来源于网络,侵删
贪吃蛇由蛇头,蛇身构成,然后需要在画布上随机生成食物,每吃掉一个就要生成新的食物,并且蛇的长度会+1
参考项目
https://blog.csdn.net/doubututou/article/details/112800349?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-3&spm=1001.2101.3001.4242
https://blog.csdn.net/wtfsb/article/details/103044241?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_baidulandingword-3&spm=1001.2101.3001.4242
功能框架图
1.思维导图
2.流程图
面对对象设计
包-类图
UML
项目运行截图
1.开始
2.游戏进行中
3.游戏结束
项目代码
1.Snakewindow
public class Snakewindows {
public static void main(String[] args) {
// TODO Auto-generated method stub
JFrame frame =new JFrame();
frame.setBounds(400,200,900,720);
frame.setResizable(false);//设置游戏窗口不可拖动
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭后同时关闭窗口
SnakePanel panel=new SnakePanel();
new Play("MT1990 - 点星(Point The Star).mp3").start();//播放背景音乐
frame.add(panel);
frame.setVisible(true);//显示该窗体
}
}
2.SnakePanel
public class SnakePanel extends JPanel implements KeyListener,ActionListener{
ImageIcon back =new ImageIcon("back.png");
ImageIcon body =new ImageIcon("body.png");
ImageIcon down =new ImageIcon("down.png");
ImageIcon food =new ImageIcon("food.png");
ImageIcon left =new ImageIcon("left.png");
ImageIcon right =new ImageIcon("right.png");
ImageIcon up =new ImageIcon("up.png");
//导入所有要使用的图片
int[]snakex =new int [750];//蛇的横坐标
int[]snakey =new int [750];//蛇的纵坐标
int len=3;//蛇的长度设计
String direction ="R";//R为右L为左U为上D为下
Random r=new Random();
int foodx=r.nextInt(34)*25+25;
int foody=r.nextInt(24)*25+75;//食物坐标
boolean isStarted=false;//判断游戏是否开始
boolean isFaild=false;
Timer timer= new Timer(100,this);//蛇的速度 监听
public SnakePanel() {
this.setFocusable(true);
initSnake();
this.addKeyListener(this);
timer.start();
}
int score=0;//添加分数数值
public void initSnake() {
isStarted=false;
isFaild=false;
len=3;
score=0;
direction="R";
snakex[0]=100;
snakey[0]=100;
snakex[1]=75;
snakey[1]=100;
snakex[2]=50;
snakey[2]=100;//加载蛇的位置数据和加载蛇的出现
}
/* (non-Javadoc)
* @see javax.swing.JComponent#paint(java.awt.Graphics)
*/
public void paint(Graphics g) {
// TODO Auto-generated method stub
this.setBackground(Color.BLACK);
g.fillRect(25, 75, 850, 600);
back.paintIcon(this,g,25,11);
if(direction.equals("R")) {
right.paintIcon(this, g, snakex[0], snakey[0]);
}else if(direction.equals("L")) {
left.paintIcon(this, g, snakex[0], snakey[0]);
}else if(direction.equals("U")) {
up.paintIcon(this, g, snakex[0], snakey[0]);
}else if(direction.equals("D")) {
down.paintIcon(this, g, snakex[0], snakey[0]);
}//蛇头制作
for (int i = 1; i < len; i++) {
body.paintIcon(this, g, snakex[i], snakey[i]);
}
if(!isStarted) {
g.setColor(Color.BLACK);
g.setFont(new Font("arial",Font.BOLD,30));
g.drawString("Press Space to PLAY/PAUSE Game", 210, 350);
}//空格键提示语
if(isFaild) {
g.setColor(Color.RED);
g.setFont(new Font("arial",Font.BOLD,30));
g.drawString("GAME OVER", 350, 350);
}
food.paintIcon(this, g, foodx, foody);
g.setColor(Color.BLACK);
g.setFont(new Font("arial",Font.BOLD,15));
g.drawString("Score:"+score, 750, 40);
g.drawString("Length:"+len, 750, 60);
}
@Override
public void keyPressed(KeyEvent e) {
int keyCode=e.getKeyCode();
if(keyCode==KeyEvent.VK_SPACE) {
if(isFaild) {
initSnake();
}else {
isStarted=!isStarted;//实现空格键可按动
}
repaint();
}else if(keyCode== KeyEvent.VK_RIGHT && !direction.equals("L")) {
direction="R";
}else if(keyCode==KeyEvent.VK_LEFT && !direction.equals("R")) {
direction="L";
}else if(keyCode==KeyEvent.VK_UP &&!direction.equals("D")) {
direction="U";
}else if(keyCode==KeyEvent.VK_DOWN && !direction.equals("U")) {
direction="D";
}
}
@Override
public void keyReleased(KeyEvent arg0) {
// TODO 自动生成的方法存根
}
@Override
public void keyTyped(KeyEvent arg0) {
// TODO 自动生成的方法存根
}
@Override
public void actionPerformed(ActionEvent arg0) {
timer.start();
if(isStarted && !isFaild) {//判断 如果开始
for(int i=len;i>0;i--) {
snakex[i]=snakex[i-1];
snakey[i]=snakey[i-1];
}//身体移动的代码
if(direction.equals("R")) {
//横坐标+25
snakex[0] = snakex[0]+25;
if(snakex[0]>850) snakex[0] = 25;
}else if(direction.equals("L")) {
snakex[0] = snakex[0]-25;
if(snakex[0]<25) snakex[0] = 850;
}else if(direction.equals("U")) {
snakey[0] = snakey[0]-25;
if(snakey[0]<75) snakey[0] = 650;
}else if(direction.equals("D")) {
snakey[0] = snakey[0]+25;
if(snakey[0]>650) snakey[0] = 75;//边界传送设置
}
}
if(snakex[0] == foodx && snakey[0] == foody) {
len++;
score++;
////////////////////////////得分显示
/////////////////////////蛇吃食物并且长大,蛇与食物重合
foodx = r.nextInt(34)*25+25;
foody = r.nextInt(24)*25+75;
}//到食物增加长度的逻辑
for(int i=1;i<len;i++) {//判断游戏失败
if(snakex[0] == snakex[i] && snakey[0] == snakey[i]) {
isFaild = true;
}
}
repaint();
}
}
3.Play
class Play extends Thread{
Player player;
String music;
public Play(String file) {
this.music = file;
}
public void run() {
try {
play();
} catch (FileNotFoundException | JavaLayerException e) {
e.printStackTrace();//在命令行打印异常信息在程序中出错的位置及原因
}
}
public void play() throws FileNotFoundException, JavaLayerException {
BufferedInputStream buffer = new BufferedInputStream(new FileInputStream(music));
player = new Player(buffer);
player.play();
}
}
代码扫描
项目总结
1.有想要添加的功能,但也是由于上述原因未能实现,比如添加会导致游戏结束的炸弹,蛇的移动速度随着长度的增加变快或是变慢,随着游戏时间的增加让画布上的食物越来越多等。
2.背景音乐只能实现一打开游戏就播放,音量也是跟随系统音量并不能改变,不能实现暂停或者切换下一首等音乐器的基本操作