贪吃蛇(定时器控制)
接上篇
SnakePanel类
package game.snake.first_try;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.nio.DoubleBuffer;
import java.util.Random;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.Timer;
public class SnakePanel extends JPanel implements KeyListener, ActionListener{
//加载图片
ImageIcon up = new ImageIcon("up.png");
ImageIcon down = new ImageIcon("down.png");
ImageIcon right = new ImageIcon("right.png");
ImageIcon left = new ImageIcon("left.png");
ImageIcon body = new ImageIcon("body.png");
ImageIcon food = new ImageIcon("food.png");
ImageIcon title = new ImageIcon("title.png");
//数组来存放蛇身体节点的坐标
int[] snakex = new int[850];
int[] snakey = new int[850];
int len = 3;
//初始长度
int score = 0;
//初始分数
String direction = "R";
//初始方向
Random random = new Random();
//随机生成食物
int foodx = random.nextInt(36) * 25 + 25;
//25-925
int foody = random.nextInt(24) * 25 + 75;
//75-675
boolean foodFitFlag = true;
boolean isStarted = false;
boolean isFaild = false;
Timer timer = new Timer(150,this);
public SnakePanel() {
this.setFocusable(true);
initSnake();
this.addKeyListener(this);
timer.start();
}
//初始化
public void initSnake() {
isFaild = false;
isStarted = false;
len = 3;
score = 0;
direction = "R";
snakex[0] = 100;
snakey[0] = 100;
snakex[1] = 75;
snakey[1] = 100;
snakex[2] = 50;
snakey[2] = 100;
}
//判断食物生成位置是否在蛇身
public boolean isFoodFit() {
for (int i = 0;
i < len;
i++) {
if(foodx == snakex[i] && foody == snakey[i]) {
return false;
//食物生成在蛇身
}
}
return true;
}
/** 画板*/
public void paint(Graphics g) {
//画背景
this.setBackground(Color.BLACK);
g.fillRect(25, 75, 900, 625);
//画标头
title.paintIcon(this, g, 25, 10);
//画蛇头
if(direction.equals("R")) {
right.paintIcon(this, g, snakex[0], snakey[0]);
}else if(direction.equals("L")) {
left.paintIcon(this, g, snakex[0], snakey[0]);
}else if(direction.equals("U")) {
up.paintIcon(this, g, snakex[0], snakey[0]);
}else if(direction.equals("D")) {
down.paintIcon(this, g, snakex[0], snakey[0]);
}
//画蛇身
for(int i=1;
i.0;
i--) {
snakex[i] = snakex[i-1];
snakey[i] = snakey[i-1];
}
//蛇头移动
if(direction.equals("R")) {
snakex[0] = snakex[0] + 25;
if(snakex[0] > 900) snakex[0] = 25;
}else if(direction.equals("L")) {
snakex[0] = snakex[0] - 25;
if(snakex[0] < 25) snakex[0] = 900;
}else if(direction.equals("U")) {
snakey[0] = snakey[0] - 25;
if(snakey[0] < 75) snakey[0] = 675;
}else if(direction.equals("D")) {
snakey[0] = snakey[0] + 25;
if(snakey[0] > 675) snakey[0] = 75;
}
if(snakex[0] == foodx && snakey[0] == foody) {
len++;
score++;
foodx = random.nextInt(36) * 25 + 25;
foody = random.nextInt(22) * 25 + 75;
}
//失败判定
for(int i = 1;
i < len;
i++) {
if(snakex[0] == snakex[i] && snakey[0] == snakey[i]) {
isFaild = true;
}
}
}
repaint();
}}
主类 Snack类
package game.snake.first_try;
import javax.swing.JFrame;
public class Snake { public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setBounds(550, 200, 950, 750);
//边界
frame.setTitle("贪吃蛇1.0");
//标题
frame.setResizable(false);
//能否改变大小
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//退出方式frame.add(new SnakePanel());
frame.setVisible(true);
}}
尾言 【贪吃蛇(定时器控制)】其实,定时器版和双缓冲版 对这个版本的贪吃蛇 作用并不大,或者说没有作用。主要还是因为,他的坐标是25的加的,即使他的加载很流畅,但是因为每次都是25的跨度,所以还是会有闪烁。不过这次经历确实给了我很多东西,还算不错。人生不止,代码不断。?加油!
推荐阅读
- 芯灵思SinlinxA33开发板Linux内核定时器编程
- 贪吃让我看到内在有很深伤痛
- STM32F4|STM32F4 TIM6 TIM7 基本定时器
- 这就是街舞-法老与蛇带来的怀念
- 闭包-定时器-BOM
- 乌龟与蛇
- 全志A33开发板Linux内核定时器编程
- 数据结构|贪吃蛇代码--c语言版 visual c++6.0打开
- 第10封信l|第10封信l 这件事一定不会虎头蛇尾啦
- javascript|javascript--21--定时器