Java做一个贪吃蛇小游戏
包名snakegame
第一个类 Snake
package snakegame;
import javax.swing.JFrame;
public class Snake {
/**
* @param args
*/
/*运行框大小900*720,沙盘大小850*600*/
public static void main(String[] args) {
// TODO Auto-generated method stub
JFrame frame = new JFrame();
frame.setBounds(200, 80, 900, 720);//设置边框坐标
frame.setResizable(false);//设置边框为不可改变的大小
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE );//设置默认退出时自动关闭程序,没有设置的话,默认点关闭时只是隐藏窗体,在后台进程中还可以看到
Snake_Panel panel1 = new Snake_Panel();
frame.add(panel1);//将panel视图添加到边框上
frame.setVisible(true);//使视图可见
}
}
第二个类 Snake_Panel
package snakegame;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.ImageIcon;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
public class Snake_Panel extends JPanel implements KeyListener,ActionListener {//KeyListener监听键盘,
//ActionListener监听事件
//创建图像对象
ImageIcon title = new ImageIcon("pic/title.jpg");
ImageIcon body = new ImageIcon("pic/body.png");
ImageIcon food = new ImageIcon("pic/food.png");
ImageIcon up = new ImageIcon("pic/up.png");
ImageIcon down = new ImageIcon("pic/down.png");
ImageIcon left = new ImageIcon("pic/left.png");
ImageIcon right = new ImageIcon("pic/right.png");
int snake_x[] = new int[100];//存放蛇的横坐标
int snake_y[] = new int[100];//存放蛇的纵坐标
int snake_lenth;//存放蛇的长度
String direction = "right";//存放蛇头的方向
boolean isStarted = false; //记录游戏的暂停开始状态
Timer timer = new Timer(200,this);//每当过Nms,触发监听事件
Random r = new Random();
int food_x = r.nextInt(34)*25+25;
int food_y = r.nextInt(24)*25+75;
public Snake_Panel()
{
this.setFocusable(true);//使画布可被选中,因为需要输入上下左右
initSnake();//初始化蛇,即放置一个静态蛇
this.addKeyListener(this);//添加键盘监听接口
timer.start();
}
public void initSnake()//初始化蛇
{
snake_lenth=3;
direction = "right";
snake_x[0]=100;//数组的第一个代表蛇头,蛇身每+1,数组长度+1
snake_y[0]=100;
snake_x[1]=75;
snake_y[1]=100;
snake_x[2]=50;
snake_y[2]=100;
}
public void paint(Graphics g)
{
this.setBackground(Color.black);//设置背景颜色
g.fillRect(25,75, 850, 600);//填充颜色区域,沙盘的大小为850*600
title.paintIcon(this, g, 25,21);
// body.paintIcon(this, g, 75, 100);
// body.paintIcon(this, g, 50, 100);
// right.paintIcon(this, g, 100, 100);
//画蛇头
if(direction.equals("right"))
{
right.paintIcon(this, g, snake_x[0],snake_y[0]);
}
else if(direction.equals("left"))
{
left.paintIcon(this, g, snake_x[0],snake_y[0]);
}
else if(direction.equals("up"))
{
up.paintIcon(this, g, snake_x[0],snake_y[0]);
}
else if(direction.equals("down"))
{
down.paintIcon(this, g, snake_x[0],snake_y[0]);
}
//画蛇身
for(int i=1;i<snake_lenth;i++)
{
body.paintIcon(this, g, snake_x[i], snake_y[i]);
}
if(!isStarted)
{
//当按下暂停键后,使屏幕上显示一行提示文字
g.setColor(Color.white);
g.setFont(new Font("arial",Font.BOLD,30));
g.drawString("Press Space to Start/Pause", 250, 300);
}
//画食物
food.paintIcon(this, g,food_x,food_y);
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
int keyCode = e.getKeyCode(); //获取从键盘输入的值
if(keyCode == KeyEvent.VK_SPACE)
{
isStarted = !isStarted;
repaint();//每当状态改变时,都应该repaint一下,根据此时的状态进行paint,实现动态视觉效果
}
else if(keyCode == KeyEvent.VK_UP&&direction!="down")
{
direction ="up";
}
else if(keyCode == KeyEvent.VK_DOWN&&direction!="up")
{
direction ="down";
}
else if(keyCode == KeyEvent.VK_LEFT&&direction!="right")
{
direction ="left";
}
else if(keyCode == KeyEvent.VK_RIGHT&&direction!="left")
{
direction ="right";
}
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
//对应监听事件的方法,每过Nms(自己设置的,执行一次该方法)
if(isStarted)
{
for(int i=snake_lenth-1;i>0;i--)
{
snake_x[i]=snake_x[i-1];
snake_y[i]=snake_y[i-1];
}
if(direction.equals("right"))
{
snake_x[0]+=25;
if (snake_x[0]>850)
{
snake_x[0]=25;
}
}
else if(direction.equals("left"))
{
snake_x[0]-=25;
if(snake_x[0]<25)
{
snake_x[0]=850;
}
}
else if(direction.equals("up"))
{
snake_y[0]-=25;
if (snake_y[0]<75)
{
snake_y[0]=650;
}
}
else if(direction.equals("down"))
{
snake_y[0]+=25;
if (snake_y[0]>650)
{
snake_y[0]=75;
}
}
repaint();
}
//实现吃食物的逻辑
if(snake_x[0]== food_x&&snake_y[0]== food_y)
{
snake_lenth++;
food_x = r.nextInt(34)*25+25;
food_y = r.nextInt(24)*25+75;
}
}
}
IDE为Eclipse
素材:
运行后效果图: