环境:jdk1.8,IDEA
实现步骤:
- 1.创建Snake类
public class Snake extends JPanel implements KeyListener, ActionListener {
int length; //蛇长度
int[] snakeX =new int[600]; //蛇每一节X轴坐标
int[] snakeY =new int[500]; //蛇每一节Y轴坐标
int foodX=0; //食物每一节X坐标
int foodY=0; //食物每一节X坐标
String fx; //蛇初始方向
boolean isStart =false; //是否开始游戏
boolean isFail = false; //是否游戏失败
Timer timer =new Timer(100,this); //定时器
public static void main(String[] args){}
//初始化
public void init();
//构造方法
public Snake();
//画板,自动调用
@Override
public void paintComponent(Graphics g);
//事件监听器
@Override
public void actionPerformed(ActionEvent e);
//键盘监听器
@Override
public void keyPressed(KeyEvent e);
//用不到
@Override
public void keyTyped(KeyEvent e) {
}
//用不到
@Override
public void keyReleased(KeyEvent e) {
}
}
- 2.初始化
//初始化
public void init(){
length = 3;
snakeX[0] = 440;snakeY[0] = 360; //蛇头
snakeX[1] = 440;snakeY[1] = 380;
snakeX[2] = 440;snakeY[2] = 400;
fx = "U"; //方向up
foodX = new Random().nextInt(42)*20+20; //食物初始位置
foodY = new Random().nextInt(35)*20+20;
}
- 3.画地图
public static void main(String[] args) {
JFrame frame = new JFrame(); //画地图
frame.setBounds(10,10,880,720);
frame.setResizable(false);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.add(new Snake()); //加入蛇
frame.setVisible(true);
}
- 4.画蛇,画界面,画食物
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
this.setBackground(Color.WHITE); //背景白色
g.setColor(Color.BLACK); //设置填充
g.fillRect(0,0,885,700);
g.setColor(Color.WHITE); //画头
g.drawString("ʘ",snakeX[0],snakeY[0]);
for (int i =1;i<length;i++){ //画身
g.setColor(Color.WHITE);
g.drawString("⚪",snakeX[i],snakeY[i]);
}
//游戏未开始主界面
if (!isFail){ //游戏未失败
if (!isStart){ //游戏未开始
g.setFont(new Font("微软雅黑",Font.BOLD,40));
g.setColor(Color.WHITE);
g.drawString("按下空格 开始游戏",280,300);
g.drawString("按下P键 暂停游戏",280,340);
}else { //游戏开始后画食物
g.setColor(Color.WHITE);
g.drawString("❁", foodX, foodY);
g.setColor(Color.WHITE);
g.drawString("得分:" + (length - 3) * 10, 800, 20);
}
}else { //游戏失败
g.setColor(Color.BLACK); //设置填充
g.fillRect(0,0,885,700);
g.setFont(new Font("微软雅黑", Font.BOLD, 40));
g.setColor(Color.WHITE);
g.drawString("游戏结束 得分:"+(length*10-30), 280, 300);
g.drawString("按下空格 重新游戏", 280, 340);
timer.stop(); //游戏暂停
}
- 5.事件监听器
//事件监听器
/**
* 蛇移动事件
* 蛇撞墙事件
* 蛇吃自己事件
* 蛇吃食物事件
*
*/
@Override
public void actionPerformed(ActionEvent e) {
//蛇移动和撞墙事件
for (int i = length -1; i>0;i--){ //身体后一节移动到前一节
snakeX[i] =snakeX[i-1];
snakeY[i] =snakeY[i-1];
}
if (!fx.equals("R")) { //判断蛇的方向不等于R就等于其他方向
if (fx.equals("D")){
snakeY[0]=snakeY[0]+20;
if (snakeY[0]>700){
isFail=true;
}
}else if (fx.equals("L")){
snakeX[0]=snakeX[0]-20;
if (snakeX[0]<0){
isFail=true;
}
}else if (fx.equals("U")){
snakeY[0]=snakeY[0]-20;
if (snakeY[0]<0){
isFail=true;
}
}
} else { //蛇方向等于R
snakeX[0]=snakeX[0]+20; //向R方向移动
if (snakeX[0]>870){ //判断是否撞墙,撞墙游戏结束
isFail=true;
}
}
//蛇吃食物事件
if (snakeX[0] == foodX && snakeY[0] == foodY){ //如果蛇吃了食物,食物重新生成并蛇长长一节,并重新生成食物
foodX = new Random().nextInt(40)*20+20;
foodY = new Random().nextInt(30)*20+20;
length+=1;
snakeX[length-1]=snakeX[length-2];
snakeY[length-1]=snakeY[length-2];
}
//蛇咬自己事件
for (int i = 1; i < length; i++) { //判断是否咬了自己
if (snakeX[0] == snakeX[i] && snakeY[0] == snakeY[i]) { //咬了自己游戏结束
isFail = true;
break;
}
}
repaint(); //重画,根据定时器,让蛇动起来
}
- 6.键盘监听器
//键盘监听器
@Override
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode(); //按键代码
if (key ==KeyEvent.VK_SPACE){ //判断是否为空格
if(isFail){ //判断是否游戏失败,如果游戏失败初始化,
isFail =false;
init();
}
isStart=true; //空格开始游戏
timer.start();
}else if (key ==KeyEvent.VK_P){ //判断是否为P键,P键暂停。
isStart=false;
timer.stop(); //定时器暂停
paintComponent(this.getGraphics());//调用画板,画暂停界面
}
if (isStart){ //当游戏开始时控制上下左右键控制蛇方向
if (key ==KeyEvent.VK_UP){
if (!fx.equals("D"))
fx="U";
}else if (key ==KeyEvent.VK_DOWN){
if (!fx.equals("U"))
fx="D";
}else if (key ==KeyEvent.VK_LEFT){
if (!fx.equals("R"))
fx="L";
}else if (key ==KeyEvent.VK_RIGHT){
if (!fx.equals("L"))
fx="R";
}
}
}
- 8.完整代码
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;
/**
* Java贪吃蛇小游戏
*/
//Snake类继承画板,监听器
public class Snake extends JPanel implements KeyListener, ActionListener {
int length; //蛇长度
int[] snakeX =new int[600]; //蛇每一节X轴坐标
int[] snakeY =new int[500]; //蛇每一节Y轴坐标
int foodX=0; //食物每一节X坐标
int foodY=0; //食物每一节X坐标
String fx; //蛇初始方向
boolean isStart =false; //是否开始游戏
boolean isFail = false; //是否游戏失败
Timer timer =new Timer(100,this); //定时器
public static void main(String[] args) {
JFrame frame = new JFrame(); //画地图
frame.setBounds(10,10,880,720);
frame.setResizable(false);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.add(new Snake()); //加入蛇
frame.setVisible(true);
}
//初始化
public void init(){
length = 3;
snakeX[0] = 440;snakeY[0] = 360; //蛇头
snakeX[1] = 440;snakeY[1] = 380;
snakeX[2] = 440;snakeY[2] = 400;
fx = "U"; //方向up
foodX = new Random().nextInt(42)*20+20; //食物初始位置
foodY = new Random().nextInt(35)*20+20;
}
//构造方法
public Snake(){
init();
this.setFocusable(true); //获得焦点
this.addKeyListener(this); //获得事件
}
//画板,自动调用
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
this.setBackground(Color.WHITE); //背景白色
g.setColor(Color.BLACK); //设置填充
g.fillRect(0,0,885,700);
g.setColor(Color.WHITE); //画头
g.drawString("ʘ",snakeX[0],snakeY[0]);
for (int i =1;i<length;i++){ //画身
g.setColor(Color.WHITE);
g.drawString("⚪",snakeX[i],snakeY[i]);
}
//游戏未开始主界面
if (!isFail){ //游戏未失败
if (!isStart){ //游戏未开始
g.setFont(new Font("微软雅黑",Font.BOLD,40));
g.setColor(Color.WHITE);
g.drawString("按下空格 开始游戏",280,300);
g.drawString("按下P键 暂停游戏",280,340);
}else { //游戏开始后画食物
g.setColor(Color.WHITE);
g.drawString("❁", foodX, foodY);
g.setColor(Color.WHITE);
g.drawString("得分:" + (length - 3) * 10, 800, 20);
}
}else { //游戏失败
g.setColor(Color.BLACK); //设置填充
g.fillRect(0,0,885,700);
g.setFont(new Font("微软雅黑", Font.BOLD, 40));
g.setColor(Color.WHITE);
g.drawString("游戏结束 得分:"+(length*10-30), 280, 300);
g.drawString("按下空格 重新游戏", 280, 340);
timer.stop(); //游戏暂停
}
}
//事件监听器
/**
* 蛇移动事件
* 蛇撞墙事件
* 蛇吃自己事件
* 蛇吃食物事件
*
*/
@Override
public void actionPerformed(ActionEvent e) {
//蛇移动和撞墙事件
for (int i = length -1; i>0;i--){ //身体后一节移动到前一节
snakeX[i] =snakeX[i-1];
snakeY[i] =snakeY[i-1];
}
if (!fx.equals("R")) { //判断蛇的方向不等于R就等于其他方向
if (fx.equals("D")){
snakeY[0]=snakeY[0]+20;
if (snakeY[0]>700){
isFail=true;
}
}else if (fx.equals("L")){
snakeX[0]=snakeX[0]-20;
if (snakeX[0]<0){
isFail=true;
}
}else if (fx.equals("U")){
snakeY[0]=snakeY[0]-20;
if (snakeY[0]<0){
isFail=true;
}
}
} else { //蛇方向等于R
snakeX[0]=snakeX[0]+20; //向R方向移动
if (snakeX[0]>870){ //判断是否撞墙,撞墙游戏结束
isFail=true;
}
}
//蛇吃食物事件
if (snakeX[0] == foodX && snakeY[0] == foodY){ //如果蛇吃了食物,食物重新生成并蛇长长一节,并重新生成食物
foodX = new Random().nextInt(40)*20+20;
foodY = new Random().nextInt(30)*20+20;
length+=1;
snakeX[length-1]=snakeX[length-2];
snakeY[length-1]=snakeY[length-2];
}
//蛇咬自己事件
for (int i = 1; i < length; i++) { //判断是否咬了自己
if (snakeX[0] == snakeX[i] && snakeY[0] == snakeY[i]) { //咬了自己游戏结束
isFail = true;
break;
}
}
repaint(); //重画,根据定时器,让蛇动起来
}
//键盘监听器
@Override
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode(); //按键代码
if (key ==KeyEvent.VK_SPACE){ //判断是否为空格
if(isFail){ //判断是否游戏失败,如果游戏失败初始化,
isFail =false;
init();
}
isStart=true; //空格开始游戏
timer.start();
}else if (key ==KeyEvent.VK_P){ //判断是否为P键,P键暂停。
isStart=false;
timer.stop(); //定时器暂停
paintComponent(this.getGraphics());//调用画板,画暂停界面
}
if (isStart){ //当游戏开始时控制上下左右键控制蛇方向
if (key ==KeyEvent.VK_UP){
if (!fx.equals("D"))
fx="U";
}else if (key ==KeyEvent.VK_DOWN){
if (!fx.equals("U"))
fx="D";
}else if (key ==KeyEvent.VK_LEFT){
if (!fx.equals("R"))
fx="L";
}else if (key ==KeyEvent.VK_RIGHT){
if (!fx.equals("L"))
fx="R";
}
}
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
}
}
- 9.运行
1.复制代码保存文件名Snake.java
2.javac -encoding utf-8 Snake.java
3.java Snake