snake类
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Random;
import java.io.*;
import java.net.URL;
public class Snake extends JFrame implements KeyListener, ActionListener, MouseListener {
int slong = 3;//蛇当前长度
//蛇坐标
int[] Snakex = new int[100];
int[] Snakey = new int[100];
int fx = 1;//蛇的方向 0-左 1-右 2-上 3-下
Timer timer = new Timer(100, this);//设置定时器,每100毫秒一次
//食物位置
int foodx;
int foodx1;
int foodx2;
int foody;
int foody1;
int foody2;
Random random = new Random();//随机数,随机位置生成食物
int started = 0;//游戏信息 0-未开始 1-开始 2-结束
private JTextArea ruleText = new JTextArea();
//---------------------------------------------------------------------------------------------------------------------
//窗体
public void myJFrame() {
this.setTitle("贪吃蛇"); //标题
this.setSize(800, 600); //窗口大小
this.setResizable(false); //窗口是否可以改变大小=否
this.setDefaultCloseOperation(Snake.EXIT_ON_CLOSE); //窗口关闭方式为关闭窗口同时结束程序
int width = Toolkit.getDefaultToolkit().getScreenSize().width; //获取屏幕宽度
int height = Toolkit.getDefaultToolkit().getScreenSize().height; //获取屏幕高度
this.setLocation((width - 800) / 2, (height - 600) / 2); //设置窗口默认位置以屏幕居中
this.setFocusable(true);
this.addKeyListener(this);
this.setVisible(true);
// 蛇的初识位置
Snakex[0] = 60;
Snakey[0] = 100;
Snakex[1] = 40;
Snakey[1] = 100;
Snakex[2] = 20;
Snakey[2] = 100;
// 随机食物的初识位置
foodx = random.nextInt(39);
foody = random.nextInt(22);
foodx = foodx * 20;
foody = foody * 20 + 80;
foodx1 = random.nextInt(39);
foody1 = random.nextInt(22);
foodx1 = foodx1 * 20;
foody1 = foody1 * 20 + 80;
foodx2 = random.nextInt(39);
foody2 = random.nextInt(22);
foodx2 = foodx;
foody2 = foody + 220;
}
//覆写paint方法,绘制界面
public void paint(Graphics g) {
//绘制背景
g.setColor(Color.gray);
g.fillRect(0, 0, 800, 600);
//绘制游戏区域
g.setColor(Color.white);
g.fillRect(0, 80, 800, 520);
//绘制蛇
for (int i = 0; i < slong; i++) {
if (i == 0) {
g.setColor(Color.red);
g.fillRect(Snakex[i], Snakey[i], 20, 20);
} else {
g.setColor(Color.blue);
g.fillRect(Snakex[i], Snakey[i], 20, 20);
}
}
// 绘制食物
g.setColor(Color.yellow);
g.fillOval(foodx, foody, 20, 20);
g.setColor(Color.RED);
g.fillOval(foodx1, foody1, 20, 20);
g.setColor(Color.black);
g.fillOval(foodx2, foody2, 10, 10);
if (started == 0) {
g.setColor(Color.BLACK);//设置画笔颜色
g.setFont(new Font("微软雅黑", 10, 15)); //设置字体
g.drawString("吃到黄球加一分,吃到红球加两分,吃到黑球减三分,得分到达50分的时候获胜", 100, 50); //绘制字符
g.drawString("按下“回车键”开始游戏", 300, 65); //绘制字符
} else if (started == 1) {
g.setColor(Color.BLACK);//设置画笔颜色
g.setFont(new Font("微软雅黑", 10, 20)); //设置字体
g.drawString("当前分数为:", 300, 65); //绘制字符
g.drawString(String.valueOf(slong - 3), 420, 65); //绘制字符
} else if (started == 2) {
g.setColor(Color.BLACK);//设置画笔颜色
g.setFont(new Font("微软雅黑", 10, 20)); //设置字体
g.drawString("游戏结束-", 250, 65); //绘制字符
g.drawString("最终分数为:", 350, 65); //绘制字符
g.drawString(String.valueOf(slong - 3), 470, 65); //绘制字符
} else if (started ==3) {
g.setColor(Color.BLACK);//设置画笔颜色
g.setFont(new Font("微软雅黑", 10, 20)); //设置字体
g.drawString("游戏结束-", 250, 65); //绘制字符
g.drawString("恭喜您获得了胜利", 350, 65); //绘制字符
}
}
// 操作监听——控制蛇的不断移动
@Override
public void actionPerformed(ActionEvent e) {
//判断游戏是否开始
if (started == 1) {
//通过循环控制蛇移动
for (int i = slong - 1; i > 0; i--) {
Snakex[i] = Snakex[i - 1];
Snakey[i] = Snakey[i - 1];
}
//判断蛇移动的方向
if (fx == 0) {
Snakex[0] = Snakex[0] - 20;
} else if (fx == 1) {
Snakex[0] = Snakex[0] + 20;
} else if (fx == 2) {
Snakey[0] = Snakey[0] - 20;
} else if (fx == 3) {
Snakey[0] = Snakey[0] + 20;
}
if (slong <= 0) {
started = 2;
}
if(slong>=53){
started = 3;
}
//判断蛇是否撞到墙外
if (Snakex[0] < 0 || Snakex[0] > 780 || Snakey[0] < 80 || Snakey[0] > 580) {
started = 2;
}
//判断蛇是否吃到了食物
if (Snakex[0] == foodx && Snakey[0] == foody) {
slong++;
foodx = random.nextInt(39);
foody = random.nextInt(22);
foodx = foodx * 20;
foody = foody * 20 + 80;
//System.out.println(foodx + "," + foody);
} else if (Snakex[0] == foodx1 && Snakey[0] == foody1) {
slong += 2;
foodx1 = random.nextInt(39);
foody1 = random.nextInt(22);
foodx1 = foodx1 * 20;
foody1 = foody1 * 20 + 80;
} else if (Snakex[0] == foodx2 && Snakey[0] == foody2) {
slong -= 3;
foodx2 = random.nextInt(39);
foody2 = random.nextInt(22);
foodx2 = foodx;
foody2 = foody + 80;
}
// 判断是否吃到了自己
for (int i = 1; i < slong; i++) {
if (Snakex[0] == Snakex[i] && Snakey[0] == Snakey[i]) {
started = 2;
}
}
// 判断食物是否随机在了蛇身上
for (int i = 0; i < slong; i++) {
if (foodx == Snakex[i] && foody == Snakey[i]) {
// 随机食物的初识位置
foodx = random.nextInt(39);
foody = random.nextInt(22);
foodx = foodx * 20;
foody = foody * 20 + 80;
//ystem.out.println(foodx + "," + foody);
}
}
repaint();
}
timer.start();
}
// 输入
@Override
public void keyTyped(KeyEvent e) {
}
// 键盘按下——控制游戏的开始以及蛇的移动方向
@Override
public void keyPressed(KeyEvent e) {
// 获取从键盘输入的键
int key = e.getKeyCode();
//判断是否为回车键
if (key == KeyEvent.VK_ENTER) {
if (started == 0) {
started = 1;
} else if (started == 1) {
started = 0;
} else if (started == 2) {
started = 0;
slong = 3;//蛇当前长度
//蛇的初识位置
Snakex[0] = 60;
Snakey[0] = 100;
Snakex[1] = 40;
Snakey[1] = 100;
Snakex[2] = 20;
Snakey[2] = 100;
//随机食物的初识位置
foodx = random.nextInt(39);
foody = random.nextInt(22);
foodx = foodx * 20;
foody = foody * 20 + 80;
foodx1 = random.nextInt(39);
foody1 = random.nextInt(22);
foodx1 = foodx1 * 20;
foody1 = foody1 * 20 + 80;
// 初始化方向
fx = 1;
}
repaint();
timer.start();
//左
} else if (key == KeyEvent.VK_LEFT || key == KeyEvent.VK_A) {
if (fx != 1) {
fx = 0;
}
// 右
} else if (key == KeyEvent.VK_RIGHT || key == KeyEvent.VK_D) {
if (fx != 0) {
fx = 1;
}
// 上
} else if (key == KeyEvent.VK_UP || key == KeyEvent.VK_W) {
if (fx != 3) {
fx = 2;
}
//下
} else if (key == KeyEvent.VK_DOWN || key == KeyEvent.VK_S) {
if (fx != 2) {
fx = 3;
}
}
}
// 弹起
@Override
public void keyReleased(KeyEvent e) {
}
// 点击
@Override
public void mouseClicked(MouseEvent e) {
}
// 按下
@Override
public void mousePressed(MouseEvent e) {
}
// 抬起
@Override
public void mouseReleased(MouseEvent e) {
}
// 进入
@Override
public void mouseEntered(MouseEvent e) {
}
// 离开
@Override
public void mouseExited(MouseEvent e) {
}
}
Test类
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Random;
public class Test {
public static void main(String[] args) {
Snake snake = new Snake();
snake.myJFrame();
}
}