📄 snake_frame.java
字号:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
/**
* 贪吃蛇的界面类
* @author HqkHxgHjj
*
*/
public class Snake_Frame extends JFrame{
/**
*
* @author HqkHxgHjj
*
*/
class MyKeyProcess implements KeyListener{
public void keyPressed(KeyEvent e) {
//先得获得用户到底按下的是什么键
int keyCode = e.getKeyCode();
//改变direction变量的方向值
switch (keyCode) {
case KeyEvent.VK_LEFT:
direction = WEST;
break;
case KeyEvent.VK_UP:
direction = NORTH;
break;
case KeyEvent.VK_RIGHT:
direction = EAST;
break;
case KeyEvent.VK_DOWN:
direction = SOUTH;
break;
}
}
public void keyReleased(KeyEvent arg0) {
}
public void keyTyped(KeyEvent arg0) {
}
}
/**
* 界面的宽度
*/
final static int SNAKE_FRAME_WIDTH = 400;
/**
* 界面的高度
*/
final static int SNAKE_FRAME_HEIGHT = 600;
/**
* 蛇身的宽度
*/
final static int SNAKE_WIDTH = 8;
/**
* 重绘的速度
*/
final static int SPEED = 200;
/**
* 朝东的常量
*/
final static int EAST = 0;
/**
* 朝西的常量
*/
final static int WEST = 1;
/**
* 朝南的常量
*/
final static int SOUTH = 2;
/**
* 朝北的常量
*/
final static int NORTH = 3;
/**
* 保存蛇所有节点坐标二维数组
*/
int[][] snake = new int[200][2];
/**
* 蛇身长度变量
*/
int snake_num = 7;
/**
* 存储方向的变量
*/
int direction = EAST;
/**
* 食物的X坐标
*/
int foodX;
/**
* 食物的Y坐标
*/
int foodY;
Snake_Frame(){
//初始化蛇坐标
init();
//注册事件处理对象
this.addWindowListener(new MyWindowProcess());
//注册键盘事件处理对象
this.addKeyListener(new MyKeyProcess());
//随机产生食物的坐标
generateFood();
}
/**
* 判断食物与蛇头是否重合的函数
*
* @return true代表重合 false代表不重合
*/
public boolean isSuperposition(){
if(snake[0][0] == foodX && snake[0][1] == foodY){
return true;
}
return false;
}
/**
* 吃掉食物的函数(当蛇头与食物重合时,加长蛇身)
*/
public void eat(){
//判断食物是否被吃掉
if(isSuperposition()){
//当食物被吃掉时加长蛇身
snake_num++;
//产生新的食物
generateFood();
}
}
/**
* 随机产生食物坐标的函数
*/
public void generateFood(){
foodX = ((int)(Math.random() *
(SNAKE_FRAME_WIDTH - SNAKE_WIDTH))) / 8 * 8;
foodY = (((int)(Math.random() *
(SNAKE_FRAME_HEIGHT - SNAKE_WIDTH - 30))) +
30) / 8 * 8;
}
/**
* 初始化蛇的坐标
*/
public void init(){
//初始化蛇头坐标
snake[0][0] = 200;
snake[0][1] = 80;
//初始化蛇身坐标
for(int i = 1 ; i < snake_num ; i++){
snake[i][0] = snake[i - 1][0] + SNAKE_WIDTH;
snake[i][1] = snake[i - 1][1];
}
}
/**
* 刷新背景的函数
* @param g 用来刷背景的画笔
*/
public void flushScreen(Graphics g){
//改画笔颜色为背景色
g.setColor(Color.GREEN);
//刷背景
g.fillRect(0, 0,
Snake_Frame.SNAKE_FRAME_WIDTH,
Snake_Frame.SNAKE_FRAME_HEIGHT);
//改画笔颜色为前景色
g.setColor(Color.BLACK);
}
/**
* 画蛇的函数
* @param g 画蛇的画笔
*/
public void drawSnake(Graphics g){
for(int i = 0 ; i < snake_num ; i++){
g.drawRect(snake[i][0],snake[i][1],SNAKE_WIDTH,SNAKE_WIDTH);
}
}
/**
* 移动蛇的函数
*/
public void move(){
//根据前面的节点坐标改蛇身坐标
for(int i = (snake_num - 1) ; i > 0 ; i--){
snake[i][0] = snake[i - 1][0];
snake[i][1] = snake[i - 1][1];
}
//先改蛇头坐标
switch (direction) {
case WEST:
snake[0][0] -= SNAKE_WIDTH;
break;
case EAST:
snake[0][0] += SNAKE_WIDTH;
break;
case SOUTH:
snake[0][1] += SNAKE_WIDTH;
break;
case NORTH:
snake[0][1] -= SNAKE_WIDTH;
break;
}
}
/**
* 休息的代码
*/
public void speed(){
try {
Thread.sleep(SPEED);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
/**
* 画食物的方法
* @param g 画笔
*/
public void drawFood(Graphics g){
g.drawRect(foodX, foodY, SNAKE_WIDTH, SNAKE_WIDTH);
}
/**
* 界面类画完自己之后调用的方法
* @param g 画笔对象
*/
public void paint(Graphics g) {
//刷新背景开始
flushScreen(g);
//刷新背景结束
//画食物
drawFood(g);
//画蛇
drawSnake(g);
//移动蛇
move();
//吃食物
eat();
//休息一下
speed();
//重画
this.repaint();
}
public static void main(String[] args) {
Snake_Frame f = new Snake_Frame();
f.setSize(Snake_Frame.SNAKE_FRAME_WIDTH,
Snake_Frame.SNAKE_FRAME_HEIGHT);
f.setVisible(true);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -