贪吃蛇小游戏
使用IDEA开发工具,用java开发的贪吃蛇小游戏
效果图:
游戏主界面
import javax.swing.*;
import java.awt.*;
/** 贪吃蛇小游戏的开发
* @author Big_Small
* @version 2021-07-19
* @since jdk16
*/
public class StartGame extends JFrame {
public StartGame(){
setTitle("贪吃蛇游戏");
setBounds(10,10,900,720);
setResizable(false);
Container container=this.getContentPane();
container.add(new GamePanel());
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new StartGame();
}
}
游戏面板以及对事件的监听
import javax.swing.*;
import java.awt.*;
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 GamePanel extends JPanel implements KeyListener, ActionListener {
private int length; //蛇身体的长度
private int[] snakeX=new int[34]; //蛇的X坐标
private int[] snakeY=new int[24]; //蛇的Y坐标
private String direction; //初始方向
private int foodX; //食物的X坐标
private int foodY; //食物的Y坐标
private Random random=new Random();//随机数
private int score;//分数
private Timer timer=new Timer(100,this);//定时器,初始执行一次的时间为100ms
private boolean isStart=false; //游戏默认状态是没开始
private boolean isFail=false; //游戏失败状态,初始为没有失败
public GamePanel(){
init();//初始化游戏界面数据
this.setFocusable(true);//获取焦点事件开启
this.addKeyListener(this);//键盘事件监听
timer.start();//定时器开启
}
public void init(){
length=3; //初始化蛇长度为3
score=0; //初始分数为0
//蛇初始的位置
for (int i = 0; i < length; i++) {
snakeX[i]=100-i*25;
snakeY[i]=100;
}
//初始化头的方向向右
direction="R";
//初始化随机出食物的位置
foodX=25+25* random.nextInt(34);
foodY=75+25*random.nextInt(24);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);//清屏作用
Data.head.paintIcon(this,g,25,11); //画出游戏的头部广告位
g.setColor(Color.WHITE);
g.setFont(new Font("微软雅黑",Font.ITALIC,18));
g.drawString("长度:"+length,750,35); //显示蛇的当前长度
g.drawString("分数:"+score,750,50); //显示目前获得的分数
g.setColor(Color.BLACK);
g.fillRect(25,75,850,600);//游戏区域
Data.food.paintIcon(this,g,foodX,foodY);//画出食物的位置
//头如果未越界,画出头的位置
if(snakeX[0]>=25&&snakeX[0]<=850&&snakeY[0]>=75&&snakeY[0]<=650){
switch (direction){
case "R":
Data.right.paintIcon(this,g,snakeX[0],snakeY[0]);
break;
case "L":
Data.left.paintIcon(this,g,snakeX[0],snakeY[0]);
break;
case "U":
Data.up.paintIcon(this,g,snakeX[0],snakeY[0]);
break;
case "D":
Data.down.paintIcon(this,g,snakeX[0],snakeY[0]);
break;
}
}
//画出身体的位置
for (int i = 1; i < length; i++) {
Data.body.paintIcon(this,g,snakeX[i],snakeY[i]);
}
//判断游戏是否开始
if(!isStart){
g.setColor(Color.PINK);
g.setFont(new Font("微软雅黑",Font.BOLD,40));
g.drawString("按下空格键开始",300,300);//如何开始的提示
}
//判断游戏是否失败
if(isFail){
g.setColor(Color.RED);
g.setFont(new Font("微软雅黑",Font.BOLD,40));
g.drawString("游戏,失败按下空格键重新开始",200,300);//如何开始的提示
}
}
@Override
public void keyPressed(KeyEvent e) {
int keyCode=e.getKeyCode();//获得按下的键值
if(keyCode==KeyEvent.VK_SPACE){//按下空格键,先判断游戏是否失败,没有则游戏状态取反,实现游戏的开始和暂停
if(isFail){
isFail=false; //失败后,重置失败状态
init(); //初始化游戏
}else{
isStart=!isStart;
}
repaint(); //重绘游戏界面
}
//上下左右键控制蛇的方向(按下相反方向时,蛇方向不做改变)
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 e) {}
@Override
public void keyTyped(KeyEvent e) {}
@Override
public void actionPerformed(ActionEvent e) {
if(isStart&&!isFail){//游戏是开始状态
if(snakeX[0]==foodX&&snakeY[0]==foodY){//判断蛇是否吃到食物
length++;//蛇身体长度加1
score+=10;//分数加10
//再次随机生成食物
foodX=25+25* random.nextInt(34);
foodY=75+25* random.nextInt(24);
}
//移动
for (int i = length; i > 0; i--) {
snakeX[i]=snakeX[i-1];
snakeY[i]=snakeY[i-1];
}
//头的方向移动
if(direction.equals("R")){
snakeX[0]=snakeX[0]+25;
}else if(direction.equals("L")){
snakeX[0]=snakeX[0]-25;
}else if(direction.equals("U")){
snakeY[0]=snakeY[0]-25;
}else if(direction.equals("D")){
snakeY[0]=snakeY[0]+25;
}
if(snakeX[0]>850||snakeX[0]<25||snakeY[0]<75||snakeY[0]>650){//判断蛇是否出界
isFail=true;
}
for (int i = 1; i < length; i++) {//判断蛇是否吃到自身
if(snakeX[0]==snakeX[i]&&snakeY[0]==snakeY[i]){
isFail=true;
}
}
repaint();//重绘贪吃蛇的位置
}
timer.start();//定时器开启
}
}
用于存取图片
import javax.swing.*;
import java.net.URL;
//放置游戏用到的图片
public class Data {
private static URL headURL=Data.class.getResource("/Image/img.png");
private static URL bodyURL=Data.class.getResource("/Image/body.png");
private static URL downURL=Data.class.getResource("/Image/down.png");
private static URL upURL=Data.class.getResource("/Image/up.png");
private static URL leftURL=Data.class.getResource("/Image/left.png");
private static URL rightURL=Data.class.getResource("/Image/right.png");
private static URL foodURL=Data.class.getResource("/Image/food.png");
public static ImageIcon head=new ImageIcon(headURL);
public static ImageIcon body=new ImageIcon(bodyURL);
public static ImageIcon down=new ImageIcon(downURL);
public static ImageIcon up=new ImageIcon(upURL);
public static ImageIcon left=new ImageIcon(leftURL);
public static ImageIcon right=new ImageIcon(rightURL);
public static ImageIcon food=new ImageIcon(foodURL);
}
注:在src文件夹下创建Image文件夹用来放置图片素材,注意图片的命名要跟Data类中相同








浙公网安备 33010602011771号