一、游戏背景
1976年,Gremlin平台推出了一款经典街机游戏Blockade。游戏中,两名玩家分别控制一个角色在屏幕上移动,所经之处砌起围栏。角色只能向左、右方向90度转弯,游戏目标保证让对方先撞上屏幕或围栏。
二、功能实现
目前使用intellij idea。
创建游戏项目game。src下创建一个包。包中包含其中Direction为枚举类型
在MySnake中代码
package dem;
import javax.swing.*;
public class MySnake {
public static void main(String[] args) {
//创建一个窗口
JFrame frame = new JFrame();
//指定窗口xy的位置以及窗口宽度和高度的值
frame.setBounds(600,100,700,900);
//不允许拖拽改变大小
frame.setResizable(false);
//奠基窗口关闭按钮,执行操作退出
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//添加画布
frame.add(new MyPanel());
//展示出来
frame.setVisible(true);
}
}
MyPanel中代码
package dem;
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 MyPanel extends JPanel implements KeyListener, ActionListener {
//声明蛇头和身体图片
ImageIcon right = new ImageIcon("image/right.png");
ImageIcon body = new ImageIcon("image/body.png");
//声明上下左蛇头图片
ImageIcon top = new ImageIcon("image/top.png");
ImageIcon left = new ImageIcon("image/left.png");
ImageIcon bottom = new ImageIcon("image/bottom.png");
//声明一个初始值,表示蛇的长度
int len = 3;
//声明两个数组分别存放x和y的位置
int[] snakeX = new int[1008];
int[] snakeY = new int[1008];
//枚举
Direction direction = Direction.right;
//添加一个判断开始游戏true
boolean isStart = false;
//创建定时器
Timer timer = new Timer(100,this);
//声明食物的两个坐标
int foodX;
int foodY;
//声明随机变量random
Random random = new Random();
//声明食物图片
ImageIcon food = new ImageIcon("image/food.png");
public MyPanel(){
//设定蛇的头和身体的起始位置
snakeX[0] = 100;
snakeY[0] = 100;
snakeX[1] = 75;
snakeY[1] = 100;
snakeX[2] = 50;
snakeY[2] = 100;
//获取键盘事件
this.setFocusable(true);
//添加监听
this.addKeyListener(this);
//启动定时器
timer.start();
//生成食物坐标
foodX = 25+25*random.nextInt(20);
foodY = 25+25*random.nextInt(20);
}
//重写画组件方法
@Override
protected void paintComponent(Graphics g) {
//调用父类方法做一些基本工作
super.paintComponent(g);
//设置背景颜色
this.setBackground(Color.red);
//在画布添加游戏区域
g.fillRect(0,0,700,900);
//添加右侧蛇头
//right.paintIcon(this,g,snakeX[0],snakeY[0]);
//根据枚举变量的方向值进行判断
switch(direction){
case top:
top.paintIcon(this,g,snakeX[0],snakeY[0]);
break;
case left:
left.paintIcon(this,g,snakeX[0],snakeY[0]);
break;
case right:
right.paintIcon(this,g,snakeX[0],snakeY[0]);
break;
case bottom:
bottom.paintIcon(this,g,snakeX[0],snakeY[0]);
break;
}
//两个身体
for(int i = 1; i 0;i--){
snakeX[i] = snakeX[i - 1];
snakeY[i] = snakeY[i - 1];
}
//通过方向键进行判断控制蛇头
switch (direction){
case top:
snakeY[0] -= 25;
if (snakeY[0] <=0) {
snakeY[0] = 900;
}
break;
case bottom:
//假如蛇水平向右,则蛇头值+25
snakeY[0] += 25;
//超出700像素x从0
if (snakeY[0] >= 900) {
snakeY[0] = 0;
}
break;
case right:
//假如蛇水平向右,则蛇头值+25
snakeX[0] += 25;
//超出700像素x从0
if (snakeX[0] >= 700) {
snakeX[0] = 0;
}
break;
case left:
//假如蛇水平向右,则蛇头值+25
snakeX[0] -= 25;
//超出700像素x从0
if (snakeX[0] <=0) {
snakeX[0] = 700;
}
break;
}
//判断当蛇头的X坐标和Y坐标与食物一致时长度+1随机生成食物
if (snakeY[0]==foodY && snakeX[0]==foodX){
//蛇长度+1
len++;
//重新生成food
foodX=25+25*random.nextInt(20);
foodY=25+25*random.nextInt(20);
}
//重写画组件
repaint();
//重新启动定时器
timer.start();
}
}
}
Direction
package dem;
public enum Direction {//定义一个枚举方向
top,left,right,bottom;
}
三、效果展示
按下空格键开始,再按空格键暂停。方向键控制蛇头移动,当蛇头穿过窗口从另一面通过。
吃掉食物长度加一,食物随机生成
在Game文件夹下添加image文件夹文件夹保存png文件
图片大小为25*25
游戏结束设定 大家可以随意发挥



