一、绘制静态窗口
这是一个简陋的窗口
package Snake;
import javax.swing.*;
public class StartGames {
public static void main(String[] args) {
//绘制静态窗口
JFrame jFrame = new JFrame("初试 Java ");
//设置界面大小
jFrame.setBounds(10, 10, 1200, 700);
jFrame.setResizable(false);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setVisible(true);
}
}
二、绘制游戏面板
main
里面只有画板类,新功能往被显示的类里面加
找到图片资源(路径);将资源显示出来(paintIcon
)。
源码放到最后展示
三、画小蛇
3.1 静态的蛇
蛇头的方向;蛇的长度。
3.2 让小蛇动起来
定时器、键盘监听
蛇身体从后往前依次覆盖;加个蛇头随着键盘的输入改变方向。
四、吃东西
吃了后刷新下、判断下头撞身体
代码
1. StartGames
package Snake;
import javax.swing.*;
public class StartGames {
public static void main(String[] args) {
System.out.println(System.getProperty("java.class.path"));
//绘制静态窗口
JFrame jFrame = new JFrame("初试 Java 之贪吃蛇");
//设置界面大小
jFrame.setBounds(10, 10, 900, 700);
jFrame.setResizable(false);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//将画板加入到JFrame
//之后的操作放到画笔类里实现
jFrame.add(new GamePanel());
jFrame.setVisible(true);
}
}
2. GamePanel
package Snake;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
public class GamePanel extends JPanel implements KeyListener, ActionListener { //implements 一个类实现一个接口
int N = 1000;
int length;
boolean isStart = false;
int[] snake_X = new int[N], snake_Y = new int[N];
String fx;//RLUD
Timer timer = new Timer(100, this);
int foodx, foody;
Random random = new Random();
boolean isFile = false;
void init()
{
length = 3;
fx = "R";
snake_X[0] = snake_Y[0] = 200;
snake_X[1] = 175; snake_Y[1] = 200;
snake_X[2] = 150; snake_Y[2] = 200;
timer.start();
foodx = 50 + 25 * random.nextInt(32);
foody = 100 + 25 * random.nextInt(22);
}
GamePanel(){
init(); //创建的时候就调用init()
this.setFocusable(true); //键盘焦点
this.addKeyListener(this); //添加监听
}
//画板
@Override //@Override 注解 这里的意思是重写
protected void paintComponent(Graphics g) {
super.paintComponent(g); //清屏
this.setBackground(Color.white);
Data.header.paintIcon(this, g, 20, 20); //画布 笔 x y 画广告栏
g.fillRect(50, 100, 800, 550); //游戏区域
if(fx == "R") Data.right.paintIcon(this,g,snake_X[0],snake_Y[0]);
else if(fx == "L") Data.left.paintIcon(this,g,snake_X[0],snake_Y[0]);
else if(fx == "U") Data.up.paintIcon(this,g,snake_X[0],snake_Y[0]);
else Data.down.paintIcon(this,g,snake_X[0],snake_Y[0]);
for(int i = 1; i < length; ++ i)
Data.body.paintIcon(this,g,snake_X[i],snake_Y[i]);
Data.food.paintIcon(this,g,foodx,foody);
g.setColor(Color.white);
g.setFont(new Font("微软雅黑",Font.BOLD,20)); //字体
g.drawString("" + length,800,150);
//画完静态小蛇后提示用户开始游戏
if(isStart == false){
//画String
g.setColor(Color.red);
g.setFont(new Font("微软雅黑",Font.BOLD,40)); //字体
g.drawString("按下空格开始游戏或暂停游戏",200,300);
g.drawString("WSAD为方向",250,400);
}
if(isFile == true){
g.setColor(Color.red);
g.setFont(new Font("微软雅黑",Font.BOLD,40)); //字体
g.drawString("Game Over",200,300);
g.drawString("分数为" + length,250,400);
g.drawString("按下空格重新开始",300,500);
}
}
//监听键盘
@Override
public void keyPressed(KeyEvent e) { //按下 未释放
//获取按下的键盘是啥
int keyCode = e.getKeyCode();
if(keyCode == KeyEvent.VK_SPACE) {
if(isFile)
{
isFile = false;
init();
}
else{
isStart = !isStart;
}
repaint();//刷新
}
else if(keyCode == KeyEvent.VK_W){
fx = "U";
}
else if(keyCode == KeyEvent.VK_S){
fx = "D";
}
else if(keyCode == KeyEvent.VK_A){
fx = "L";
}
else if(keyCode == KeyEvent.VK_D){
fx = "R";
}
}
// 定时器
@Override
public void actionPerformed(ActionEvent e) {
if(isStart&& isFile == false){
for(int i = length - 1; i > 0; -- i)
{
snake_X[i] = snake_X[i - 1];
snake_Y[i] = snake_Y[i - 1];
}
//UDLR
if(fx == "U") snake_Y[0] -=25;
else if(fx == "D") snake_Y[0] += 25;
else if(fx == "L") snake_X[0] -= 25;
else snake_X[0] += 25;
if(snake_X[0] > 825) snake_X[0] = 50;
if(snake_X[0] < 50) snake_X[0] = 825;
if(snake_Y[0] > 625) snake_Y[0] = 100;
if(snake_Y[0] < 100) snake_Y[0] = 625;
//eat food
if(snake_X[0] == foodx && snake_Y[0] == foody)
{
length ++;
//重新生成食物
foodx = 50 + 25 * random.nextInt(32);
foody = 100 + 25 * random.nextInt(22);
}
//撞
for(int i = 1; i < length; ++ i)
if(snake_X[0] == snake_X[i] && snake_Y[0] == snake_Y[i])
isFile = true;
repaint();
}
//timer.start();
}
@Override
public void keyTyped(KeyEvent e) { //键盘按下、弹起
}
@Override
public void keyReleased(KeyEvent e) { //释放
}
}
3. Data
//用于存放外部数据
package Snake;
import javax.swing.*;
import java.net.URL;
//用URL获取图片的资源
//public static URL = Data.class.getResource("/Static/.png");
//public static ImageIcon = new ImageIcon();
public class Data {
//广告栏
public static URL headerURL = Data.class.getResource("/Static/header.png"); //通过地址找资源
public static ImageIcon header = new ImageIcon(headerURL); //把headerURL放进来
//头部
public static URL upURL = Data.class.getResource("/Static/up.png");
public static URL downURL = Data.class.getResource("/Static/down.png");
public static URL leftURL = Data.class.getResource("/Static/left.png");
public static URL rightURL = Data.class.getResource("/Static/right.png");
public static ImageIcon up = new ImageIcon(upURL);
public static ImageIcon down = new ImageIcon(downURL);
public static ImageIcon left = new ImageIcon(leftURL);
public static ImageIcon right = new ImageIcon(rightURL);
//身体
public static URL bodyURL = Data.class.getResource("/Static/body.png");
public static ImageIcon body = new ImageIcon(bodyURL);
//食物
public static URL foodURL = Data.class.getResource("/Static/food.png");
public static ImageIcon food = new ImageIcon(foodURL);
}