使用Swing写一个简单的贪吃蛇小游戏。
涉及到:键盘监听、定时器Timer、面板…
文件目录:src–liu(这是个包)–myphoto(这是放图片的)。说不明白,上图吧:
![结构](https://i-blog.csdnimg.cn/blog_migrate/38b542ba1e2666eb929d9c2667961b4b.png)
myphoto包里的图片有:![窗体图标](https://i-blog.csdnimg.cn/blog_migrate/fcb305958d4974cb7ec1ced1c7c57207.jpeg)
title.jpeg
![蛇头-向上](https://i-blog.csdnimg.cn/blog_migrate/9ed4bd6484e72ed75f7b8317e8255076.png)
![蛇头-向右](https://i-blog.csdnimg.cn/blog_migrate/70d3927a6212d7db7a2f1ee17dd10787.png)
![游戏标头](https://i-blog.csdnimg.cn/blog_migrate/f48d71d3aa3ca96f29546faed167c9e1.png)
![蛇头-向左](https://i-blog.csdnimg.cn/blog_migrate/d1e51a1eb396802b5ca54ca67768c497.png)
![食物](https://i-blog.csdnimg.cn/blog_migrate/540ca65bec8d1b426b40cea82dfb1573.png)
![蛇头-向下](https://i-blog.csdnimg.cn/blog_migrate/2c996c640b87e09a2ed1ba14d7a0c904.png)
![蛇身](https://i-blog.csdnimg.cn/blog_migrate/bc3dcf3c64d8518d075c28000ae6f431.png)
以上为所需的素材,这些素材的名字为:
![name](https://i-blog.csdnimg.cn/blog_migrate/803d52e34eb0456f4735ae6bf550fb4e.png)
GameMain.java代码如下:
package liu;
import javax.swing.*;
import java.net.URL;
public class GameMain {
public static void main(String[]args){
JFrame jf=new JFrame("贪吃蛇小游戏");
URL titleUrl = GameMain.class.getResource("myphoto/title.jpeg");
ImageIcon titleIc=new ImageIcon(titleUrl);
jf.setIconImage(titleIc.getImage());
jf.add(new GamePanel());
jf.setBounds(150,200,900,720);
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
jf.setVisible(true);
jf.setResizable(false);
}
}
GamePanel.java代码:
package liu;
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[]snakeX=new int[600];
private int[]snakeY=new int[500];
private int snakeLength;
private boolean isStart=false;
private Timer tm=new Timer(100,this);
private String fx;
private int foodX,foodY;
private Random foodSj=new Random();
private int userSources;
private boolean isFail=false;
public GamePanel(){
init();
this.setFocusable(true);
this.addKeyListener(this);
tm.start();
}
private void init(){
snakeLength=3;
snakeX[0]=100;snakeY[0]=100;
snakeX[1]=75;snakeY[1]=100;
snakeX[2]=50;snakeY[2]=100;
fx="R";
foodX=25+25*foodSj.nextInt(34);
foodY=75+25*foodSj.nextInt(24);
userSources=0;
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
this.setBackground(Color.WHITE);
GameData.headerIc.paintIcon(this,g,25,20);
g.fillRect(25,75,850,600);
GameData.foodIc.paintIcon(this,g,foodX,foodY);
g.setColor(Color.YELLOW);
g.setFont(new Font("微软雅黑",Font.BOLD,20));
g.drawString("小蛇长度:"+snakeLength,700,40);
g.drawString("用户得分:"+userSources,700,60);
if(fx.equals("R")){
GameData.rightIc.paintIcon(this,g,snakeX[0],snakeY[0]);
}else if(fx.equals("L")){
GameData.leftIc.paintIcon(this,g,snakeX[0],snakeY[0]);
}else if(fx.equals("U")){
GameData.upIc.paintIcon(this,g,snakeX[0],snakeY[0]);
}else if(fx.equals("D")){
GameData.downIc.paintIcon(this,g,snakeX[0],snakeY[0]);
}
for (int i = 1; i <snakeLength ; i++) {
GameData.bodyIc.paintIcon(this,g,snakeX[i],snakeY[i]);
}
if(!isStart){
g.setColor(Color.WHITE);
g.setFont(new Font("微软雅黑",Font.BOLD,40));
g.drawString("按下空格开始游戏",200,400);
}
if(isFail){
g.setColor(Color.RED);
g.setFont(new Font("微软雅黑",Font.BOLD,40));
g.drawString("游戏结束,按空格重新游戏",200,400);
}
}
@Override
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
if (keyCode==KeyEvent.VK_SPACE){
if(isFail){
isFail=false;
init();
}else{isStart=!isStart;}
}else if(keyCode==KeyEvent.VK_UP){
fx="U";
}else if(keyCode==KeyEvent.VK_DOWN){
fx="D";
}else if(keyCode==KeyEvent.VK_LEFT){
fx="L";
}else if(keyCode==KeyEvent.VK_RIGHT){
fx="R";
}
repaint();
}
@Override
public void actionPerformed(ActionEvent e) {
if(isStart && !isFail){
for (int i = 2; i <snakeLength ; i++) {
if(snakeX[0]==snakeX[i] && snakeY[0]==snakeY[i]){
isFail=true;
}
}
if(snakeX[0]==foodX && snakeY[0]==foodY){
snakeLength++;
userSources+=10;
foodX=25+25*foodSj.nextInt(34);
foodY=75+25*foodSj.nextInt(24);
}
for (int i = snakeLength-1; i >0 ; i--) {
snakeX[i]=snakeX[i-1];
snakeY[i]=snakeY[i-1];
}
if(fx.equals("R")){
snakeX[0]=snakeX[0]+25;
if(snakeX[0]>850){snakeX[0]=25;}
}else if(fx.equals("L")){
snakeX[0]-=25;
if(snakeX[0]<25){snakeX[0]=850;}
}else if(fx.equals("U")){
snakeY[0]-=25;
if(snakeY[0]<75){snakeY[0]=650;}
}else if(fx.equals("D")){
snakeY[0]+=25;
if(snakeY[0]>650){snakeY[0]=75;}
}
repaint();
}
tm.start();
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
}
}
GameData.java代码如下:
package liu;
import javax.swing.*;
import java.net.URL;
public class GameData {
private static URL headerUrl=GameData.class.getResource("myphoto/header.png");
public static ImageIcon headerIc=new ImageIcon(headerUrl);
private static URL upUrl=GameData.class.getResource("myphoto/up.png");
public static ImageIcon upIc=new ImageIcon(upUrl);
private static URL downUrl=GameData.class.getResource("myphoto/down.png");
public static ImageIcon downIc=new ImageIcon(downUrl);
private static URL leftUrl=GameData.class.getResource("myphoto/left.png");
public static ImageIcon leftIc=new ImageIcon(leftUrl);
private static URL rightUrl=GameData.class.getResource("myphoto/right.png");
public static ImageIcon rightIc=new ImageIcon(rightUrl);
private static URL bodyUrl=GameData.class.getResource("myphoto/body.png");
public static ImageIcon bodyIc=new ImageIcon(bodyUrl);
private static URL foodUrl=GameData.class.getResource("myphoto/food.png");
public static ImageIcon foodIc=new ImageIcon(foodUrl);
}
运行结果如下:
![结果图](https://i-blog.csdnimg.cn/blog_migrate/2678186ba68edc2d092d0640c279d3ad.png)
此demo打包的jar包已发布,需要的可去我资源找。
意外和惊喜你不知道哪个会先来,且行且珍惜!