Java学习day23
作者:互联网
今天学习了下拉框实现与简单游戏的实现
package com.Cra2iTeT.snake; 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; public class GamePanel extends JPanel implements KeyListener, ActionListener { int length;//蛇的长度 int[] snakeX = new int[600];//蛇的x坐标 int[] snakeY = new int[500];//蛇的y坐标 String fx = "R";//R:右,L:左,U:上,D:下 boolean isStart = false;//游戏开始标志 Timer timer = new Timer(100, this);//定时器 int foodX;//食物的x坐标 int foodY;//食物的y坐标 Random random = new Random(); boolean isFail = false;//游戏失败标识 int score;//积分 //构造器 public GamePanel() { init(); this.setFocusable(true); this.addKeyListener(this); timer.start(); } //初始化方法 public void init() { length = 3; snakeX[0] = 100; snakeY[0] = 100; snakeX[1] = 75; snakeY[1] = 100; snakeX[2] = 50; snakeY[2] = 100; foodX = 25 + 25 * random.nextInt(34); foodY = 75 + 25 * random.nextInt(24); score = 0; } //食物坐标生成 @Override protected void paintComponent(Graphics g) { super.paintComponent(g); this.setBackground(Color.white); Data.header.paintIcon(this, g, 25, 11);//顶部广告栏 g.fillRect(25, 75, 850, 600); //绘制静态的蛇 if (fx.equals("R")) { Data.right.paintIcon(this, g, snakeX[0], snakeY[0]); } else if (fx.equals("L")) { Data.left.paintIcon(this, g, snakeX[0], snakeY[0]); } else if (fx.equals("U")) { Data.up.paintIcon(this, g, snakeX[0], snakeY[0]); } else if (fx.equals("D")) { Data.down.paintIcon(this, g, snakeX[0], snakeY[0]); } for (int i = 1; i < length; i++) { Data.body.paintIcon(this, g, snakeX[i], snakeY[i]); } //积分系统 g.setColor(Color.white); g.setFont(new Font("微软雅黑", Font.BOLD, 18)); g.drawString("长度:" + length, 750, 35); g.drawString("分数:" + score, 750, 50); //绘制食物 Data.food.paintIcon(this, g, foodX, foodY); //游戏开始判断 if (isStart == false) { g.setColor(Color.white); g.setFont(new Font("微软雅黑", Font.BOLD, 40));//设置字体格式 g.drawString("按下空格键开始游戏", 300, 350); } //游戏失败判断 if (isFail) { g.setColor(Color.red); g.setFont(new Font("微软雅黑", Font.BOLD, 40));//设置字体格式 g.drawString("游戏失败,按下空格键重新开始", 175, 350); } } @Override public void keyPressed(KeyEvent e) { int keyCode = e.getKeyCode(); if (keyCode == KeyEvent.VK_SPACE) { if (isFail) { isFail = false; init();//重新初始化游戏 } else { isStart = !isStart; } repaint();//刷新 } if (keyCode == KeyEvent.VK_LEFT) { fx = "L"; } else if (keyCode == KeyEvent.VK_RIGHT) { fx = "R"; } else if (keyCode == KeyEvent.VK_UP) { fx = "U"; } else if (keyCode == KeyEvent.VK_DOWN) { fx = "D"; } } @Override public void keyTyped(KeyEvent e) { } @Override public void keyReleased(KeyEvent e) { } @Override public void actionPerformed(ActionEvent e) { if (isStart && isFail == false) { for (int i = length - 1; i > 0; i--) { snakeX[i] = snakeX[i - 1]; snakeY[i] = snakeY[i - 1]; } if (fx.equals("R")) { snakeX[0] = snakeX[0] + 25; //边界判断 if (snakeX[0] > 850) { snakeX[0] = 25; } } else if (fx.equals("L")) { snakeX[0] = snakeX[0] - 25; //边界判断 if (snakeX[0] < 25) { snakeX[0] = 850; } } else if (fx.equals("U")) { snakeY[0] = snakeY[0] - 25; //边界判断 if (snakeY[0] < 75) { snakeY[0] = 650; } } else if (fx.equals("D")) { snakeY[0] = snakeY[0] + 25; //边界判断 if (snakeY[0] > 650) { snakeY[0] = 75; } } //是否吃到食物判断 if (snakeX[0] == foodX && snakeY[0] == foodY) { length++;//长度增加 //新的食物生成 foodX = 25 + 25 * random.nextInt(34); foodY = 75 + 25 * random.nextInt(24); score += 10;//增加积分 } //结束判断 for (int i = 1; i < length; i++) { if (snakeX[0] == snakeX[i] && snakeY[0] == snakeY[i]) { isFail = true; } } repaint();//刷新 } timer.start(); } }
以上是游戏面板以及游戏其他主体部分的实现
在初始阶段绘制一条固定位置的静态小蛇与屏幕中部的“按下空格开始游戏”提示
利用事件监听获得按键方向从而控制小蛇移动
小蛇的移动是通过坐标复制实现的,即数组从末尾往起始位置复制,使用repaint方法刷新画面,画出新的画,可以通过定时器Timer来控制刷新的间隔长
明天学习网络编程部分的知识
标签:25,Java,fx,snakeX,snakeY,学习,int,day23,else 来源: https://www.cnblogs.com/Cra2iTeT/p/15040709.html