day11--java练习贪吃蛇
贪吃蛇游戏
一、图形界面
帧,如果时间片足够小,就是动画,一秒30帧
键盘监听
定时器Timer
二、逻辑编写
面板
数据中心
四步曲
定义数据
画上去
监听事件
public class GamePanel extends JPanel implements KeyListener,ActionListener {
int[] snackx = new int[600];
int[] snacky = new int[500];
int length; //小蛇长度
boolean isStart;
String fx ; //控制方向
Timer timer = new Timer(500,this);
//随机生成食物
int foodx;
int foody;
Random random = new Random();
//失败判定
boolean falure;
//积分
int score;
public GamePanel(){
this.setBackground(Color.WHITE);
init();
this.setFocusable(true);
this.addKeyListener(this);
timer.start();
}
public void init() {
isStart = false;
length = 3;
//初始化小蛇坐标
snackx[0] = 100;snacky[0] = 100;
snackx[1] = 75;snacky[1] = 100;
snackx[2] = 50;snacky[2] = 100;
//初始化方向
fx = "R";
//随机生成食物
foodx = 25 + 25* random.nextInt(37);
foody = 75 + 25* random.nextInt(27);
//失败判定初始化
falure = false;
//积分初始化
score = 0;
//初始化定时器
timer.setDelay(500);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
//画头
Data.head.paintIcon(this,g,25,5);
//画游戏区
g.setColor(Color.black);
g.fillRect(25,75,950,675);
//画食物
Data.food.paintIcon(this,g,foodx,foody);
//画小蛇
//画蛇身
for (int i = 1; i < length; i++) {
Data.body.paintIcon(this,g,snackx[i],snacky[i]);
}
//画蛇头
if (fx.equals("R")) {
Data.right.paintIcon(this, g, snackx[0], snacky[0]);
}else if (fx.equals("L")) {
Data.left.paintIcon(this, g, snackx[0], snacky[0]);
}else if (fx.equals("U")) {
Data.up.paintIcon(this, g, snackx[0], snacky[0]);
}else if (fx.equals("D")) {
Data.down.paintIcon(this, g, snackx[0], snacky[0]);
}
//画文字
if (!isStart){
g.setFont(new Font("微软雅黑",Font.BOLD,48));
g.setColor(Color.WHITE);
g.drawString("按空格开始游戏!",350,300);
}
//画失败
if (falure){
g.setFont(new Font("微软雅黑",Font.BOLD,48));
g.setColor(Color.RED);
g.drawString("失败!按空格重新开始游戏!",250,300);
}
//画积分
g.setFont(new Font("微软雅黑",Font.BOLD,20));
g.setColor(Color.RED);
g.drawString("长度:"+length,750,30);
g.drawString("积分:"+score,750,55);
}
@Override
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
if (keyCode == VK_SPACE){
if (!falure) {
isStart = !isStart;
}else {
init();
}
repaint();
}
if (keyCode == VK_UP){
fx = "U";
}else if (keyCode == VK_DOWN){
fx = "D";
}else if (keyCode == VK_LEFT){
fx = "L";
}else if (keyCode == VK_RIGHT){
fx = "R";
}
}
@Override
public void keyReleased(KeyEvent e) {
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void actionPerformed(ActionEvent e) {
if (isStart && !falure){
//吃食物
if (snackx[0] == foodx && snacky[0] == foody){
length++;
score = score + 10 + 10*(length/10);
int level = score / 100;
System.out.println(level);
switch (level){
case 0:
timer.setDelay(500);
break;
case 1:
timer.setDelay(400);
break;
case 2:
timer.setDelay(300);
break;
case 3:
timer.setDelay(200);
break;
case 4:
timer.setDelay(100);
break;
default:
timer.setDelay(50);
break;
}
//随机生成食物
foodx = 25 + 25* random.nextInt(37);
foody = 75 + 25* random.nextInt(27);
}
//更新蛇身坐标
for (int i = length-1; i > 0; i--) {
snackx[i]= snackx[i-1];
snacky[i]= snacky[i-1];
}
//更新蛇头坐标
if (fx.equals("R")) {
if (snackx[0] < 950) {
snackx[0] = snackx[0] + 25;
}else{
snackx[0] = 25;
}
}else if (fx.equals("L")) {
if (snackx[0] > 25) {
snackx[0] = snackx[0] - 25;
}else{
snackx[0] = 950;
}
}else if (fx.equals("U")) {
if (snacky[0] > 75) {
snacky[0] = snacky[0] - 25;
}else{
snacky[0] = 725;
}
}else if (fx.equals("D")) {
if (snacky[0] < 725) {
snacky[0] = snacky[0] + 25;
}else{
snacky[0] = 75;
}
}
//失败判定
for (int i = 1; i < length; i++) {
if (snackx[0] == snackx[i] && snacky[0] == snacky[i]){
falure = true;
}
}
repaint();
timer.start();
}
}
}


浙公网安备 33010602011771号