GUI编程入门到游戏实践
GUI编程入门到游戏实践
建议不要直接在container或者frame中直接添加文本框等组件,先add面板,再进行操作
1. 简介
GUI的核心技术:Swing , AWT
* 即将淘汰
* 界面不美观
* 需要jre 环境
* 需要学习
* 可以写出自己心中想要的一些小工具
* 工作时候,也可能需要维护到Swing界面,概率极小
* 了解MVC机构,了解监听!
2. AWT
2.1 Awt介绍
* 包含了很多类和接口
* 元素:窗口、按钮、文本框
* java.awt
* 包含了很多类和接口
* 元素:窗口、按钮、文本框
* java.awt
2.2 组件和容器
想偷个懒就用到了Swing包下的JFrame
2.2.1 Frame:窗体
* setVisible
* setResizable
* setBackground
* setLoaction
* setSize
* setBBounds
2.2.2 Panel:面板
不能单独存在,需要放到Frame中
frame.add(panel);
//监听器:适配者模式
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
})
Java JFrame窗口关闭方法总结需要继承JFrame类
2.3 布局管理器
* 流式布局
* 东西南北中
* 表格式布局
package lesson01;
import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class TestLayout02{
public static void main(String[] args) {
//窗体初始化
Frame frame = new Frame();
frame.setLayout(new GridLayout(2,1));
frame.setVisible(true);
frame.setBounds(300,400,300,400);
frame.setBackground(Color.CYAN);
//四个面板
Panel p1 = new Panel(new BorderLayout());
Panel p2 = new Panel(new GridLayout(2,1));
Panel p3 = new Panel(new BorderLayout());
Panel p4 = new Panel(new GridLayout(2,2));
//基本框架确立
p1.add(new Button("West-1"), BorderLayout.WEST);
p1.add(p2, BorderLayout.CENTER);
p1.add(new Button("East-1"), BorderLayout.EAST);
p3.add(new Button("West-2"),BorderLayout.WEST);
p3.add(p4,BorderLayout.CENTER);
p3.add(new Button("East-2"),BorderLayout.EAST);
//添加按钮和面板
p2.add(new Button("p2-btn-1"));
p2.add(new Button("p2-btn-2"));
for (int i = 1; i < 5; i++){
p4.add(new Button("p4-btn-" + i));
}
frame.add(p1);
frame.add(p3);
//监听器,关闭动作
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
2.4 事件监听
package lesson01;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Demo01 {
public static void main(String[] args) {
//初始化窗体
JFrame frame = new JFrame();
frame.setBounds(400,400,400,400);
frame.setVisible(true);
//创建按钮
Button button1 = new Button("start");
Button button2 = new Button("stop");
//为按钮添加事件反馈信息,默认为按钮label信息
button1.setActionCommand("开始");
MyMonitor myMonitor = new MyMonitor();
button1.addActionListener(myMonitor);
button2.addActionListener(myMonitor);
frame.add(button1, BorderLayout.EAST);
frame.add(button2, BorderLayout.WEST);
//窗口关闭事件
frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
}
}
class MyMonitor implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("按钮被点击了--->" + e.getActionCommand());
//可以实现精确定位,避免重复建立监听器
if ("开始".equals(e.getActionCommand())){
System.out.println("恭喜");
}
}
}
2.5 输入框 TextField 监听
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Demo02 {
public static void main(String[] args) {
new MyFrame().setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
//仅用来启动
}
}
class MyFrame extends JFrame{
public MyFrame() throws HeadlessException {
TextField textField = new TextField();
add(textField);
//监听这个文本框的文字,按下回车启动
MyActionListener myActionListener = new MyActionListener();
textField.addActionListener(myActionListener);
setVisible(true);
//自适应
pack();
//设置替换编码
textField.setEchoChar('*');
}
}
class MyActionListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
TextField field = (TextField) e.getSource();
System.out.println(field.getText());
//清空文本框
field.setText("");
}
}
2.6 简易计算器,组合+内部类
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Demo03 {
public static void main(String[] args) {
new Calculator();
}
}
//计算机类
class Calculator extends JFrame{
public Calculator() throws HeadlessException {
//3个文本框
TextField textField1 = new TextField(10);
TextField textField2 = new TextField(10);
TextField textField3 = new TextField(10);
//1个按钮
Button button = new Button("=");
//1个标签
Label label = new Label("+");
//布局
setLayout(new FlowLayout());
add(textField1);
add(label);
add(textField2);
add(button);
add(textField3);
setVisible(true);
pack();
//关闭窗体
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
//监听事件
CalculatorListener calculatorListener = new CalculatorListener(textField1, textField2, textField3);
button.addActionListener(calculatorListener);
}
}
//监听器类
class CalculatorListener implements ActionListener{
//获取三个变量
private TextField textField1, textField2, textField3;
public CalculatorListener(TextField textField1, TextField textField2, TextField textField3) {
this.textField1 = textField1;
this.textField2 = textField2;
this.textField3 = textField3;
}
@Override
public void actionPerformed(ActionEvent e) {
//1.获得加数和被加数
int num1 = Integer.parseInt(textField1.getText());
int num2 = Integer.parseInt(textField2.getText());
//2.将结果放到第三个文本框
textField3.setText("" + (num1 + num2));
//3.清楚前两个框
textField1.setText("");
textField2.setText("");
}
}
代码优化1(完全面向对象):
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Demo03 {
public static void main(String[] args) {
new Calculator().start();
}
}
//计算机类
class Calculator extends JFrame{
TextField textField1 = null;
TextField textField2 = null;
TextField textField3 = null;
public void start(){
textField1 = new TextField(10);
textField2 = new TextField(10);
textField3 = new TextField(10);
Button button = new Button("=");
Label label = new Label("+");
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
button.addActionListener(new CalculatorListener(this));
setLayout(new FlowLayout());
add(textField1);
add(label);
add(textField2);
add(button);
add(textField3);
setVisible(true);
pack();
}
}
//监听器类
class CalculatorListener implements ActionListener{
private final Calculator calculator;
public CalculatorListener(Calculator calculator) {
this.calculator = calculator;
}
@Override
public void actionPerformed(ActionEvent e) {
int num1 = Integer.parseInt(this.calculator.textField1.getText());
int num2 = Integer.parseInt(this.calculator.textField2.getText());
calculator.textField3.setText("" + (num1 + num2));
calculator.textField1.setText("");
calculator.textField2.setText("");
}
}
代码优化2(内部类,更好的包装):
原本外部类的内容可以直接访问,大大降低代码成本
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Demo03 {
public static void main(String[] args) {
new Calculator().start();
}
}
//计算机类
class Calculator extends JFrame{
TextField textField1 = null;
TextField textField2 = null;
TextField textField3 = null;
public void start(){
textField1 = new TextField(10);
textField2 = new TextField(10);
textField3 = new TextField(10);
Button button = new Button("=");
Label label = new Label("+");
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
button.addActionListener(new CalculatorListener());
setLayout(new FlowLayout());
add(textField1);
add(label);
add(textField2);
add(button);
add(textField3);
setVisible(true);
pack();
}
private class CalculatorListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
int num1 = Integer.parseInt(textField1.getText());
int num2 = Integer.parseInt(textField2.getText());
textField3.setText("" + (num1 + num2));
textField1.setText("");
textField2.setText("");
}
}
}
2.7 画笔paint
package paint;
import javax.swing.*;
import java.awt.*;
public class Demo01 {
public static void main(String[] args) {
//组件中自动调用print方法,且只调用一次
MyPaint myPaint = new MyPaint();
myPaint.start();
myPaint.close();
}
}
class MyPaint extends JFrame{
public void start(){
setBounds(200,200,600,500);
setVisible(true);
}
//画笔
@Override
public void paint(Graphics g) {
g.setColor(Color.BLUE);
g.drawOval(100,100,100,100);
g.setColor(Color.CYAN);
g.fillOval(200,200,100,100);
g.fillRect(300,300,100,100);
}
public void close(){
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
}
}
2.7.1 鼠标监听
package lesson02;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Iterator;
public class TestMouseListener {
public static void main(String[] args) {
MyFrame myFrame = new MyFrame("画板");
myFrame.close();
}
}
class MyFrame extends JFrame{
ArrayList points;
public MyFrame(String title) throws HeadlessException {
super(title);
setBounds(200,200,400,300);
setVisible(true);
points = new ArrayList<>();
this.addMouseListener(new MyMouseListener());
}
@Override
public void paint(Graphics g) {
Iterator iterator = points.iterator();
while (iterator.hasNext()){
Point point = (Point) iterator.next();
g.setColor(Color.CYAN);
g.fillOval(point.x, point.y, 10, 10);
}
}
private class MyMouseListener extends MouseAdapter{
@Override
public void mousePressed(MouseEvent e) {
points.add(new Point(e.getX(), e.getY()));
repaint();
}
}
protected void close(){
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
}
}
2.7.2 窗口监听
package lesson03;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class TestWindow {
public static void main(String[] args) {
new MyFrame();
}
}
class MyFrame extends Frame{
public MyFrame(){
setBounds(300,300,500,600);
setVisible(true);
this.addWindowListener(new MyWindowListener());
}
private class MyWindowListener extends WindowAdapter {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
@Override
public void windowActivated(WindowEvent e) {
Frame frame = (Frame) e.getSource();
frame.setTitle("Hello!");
}
}
}
2.8 键盘监听
package lesson04;
import java.awt.*;
import java.awt.event.*;
public class TestKeyListener {
public static void main(String[] args) {
new MyFrame();
}
}
class MyFrame extends Frame{
public MyFrame(){
setBounds(300,300,300,300);
setVisible(true);
this.addKeyListener(new Listener());
this.addWindowListener(new close());
}
private class Listener extends KeyAdapter {
@Override
public void keyPressed(KeyEvent e) {
System.out.println(e.getKeyChar());
if (e.getKeyCode() == KeyEvent.VK_3)
System.out.println("hhh");
}
}
private class close extends WindowAdapter {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
}
3. Swing
3.1 窗口
//居中方法
label.setHorizontalAlignment(SwingConstants.CENTER);
JFrame是Frame的子类,但依赖于容器
package lesson05;
import javax.swing.*;
import java.awt.*;
public class JFrameDemo {
public static void main(String[] args) {
//init();初始化
new MyFrame().init();
}
}
class MyFrame extends JFrame{
public void init(){
//获得容器
Container contentPane = getContentPane();
contentPane.setBackground(Color.CYAN);
setVisible(true);
setBounds(100,100,200,200);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public MyFrame() throws HeadlessException {
add(new JLabel("欢迎来到对抗路", SwingConstants.CENTER));
}
}
3.2 弹窗
package lesson06;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class DialogDemo {
public static void main(String[] args) {
new MyJFrame().init();
}
}
class MyJFrame extends JFrame{
public void init(){
Container container = getContentPane();
container.setBackground(Color.CYAN);
setVisible(true);
setBounds(500,500,500,800);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public MyJFrame() throws HeadlessException {
JButton button = new JButton("点击弹出对话框");
button.setBounds(0,0,100,100);
JLabel jlabel = new JLabel("Hello!");
jlabel.setBounds(200,300,200,100);
jlabel.setHorizontalAlignment(SwingConstants.CENTER);
add(button);
add(jlabel);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new MyDialog().init();
}
});
}
}
class MyDialog extends JDialog{
public void init(){
Container container = getContentPane();
container.setBackground(Color.BLUE);
setBounds(400,400,300,550);
setVisible(true);
}
public MyDialog() {
JLabel jLabel = new JLabel("OK");
jLabel.setBounds(10,20,50,40);
add(jLabel);
}
}
3.3 Icon、ImageIcon标签
package lesson07;
import javax.swing.*;
import java.awt.*;
public class IconDemo extends JFrame implements Icon {
public IconDemo() throws HeadlessException {
setBounds(100,100,100,100);
}
private int width;
private int height;
public IconDemo(int width, int height) throws HeadlessException {
this.width = width;
this.height = height;
}
public void init(){
Container container = getContentPane();
container.add(new JLabel("hello", new IconDemo(15,15), SwingConstants.CENTER));
this.setVisible(true);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
@Override
public void paintIcon(Component c, Graphics g, int x, int y) {
g.fillOval(x,y, width, height);
}
@Override
public int getIconWidth() {
return width;
}
@Override
public int getIconHeight() {
return width;
}
public static void main(String[] args) {
new IconDemo().init();
}
}
package lesson08;
import javax.swing.*;
import java.awt.*;
import java.net.URL;
public class ImageDemo extends JFrame {
public ImageDemo() throws HeadlessException {
JLabel hello = new JLabel("hello");
//图片放到out的对应文件夹下
URL url = ImageDemo.class.getResource("头像01.jpg");
hello.setIcon(new ImageIcon(url));
hello.setHorizontalAlignment(SwingConstants.CENTER);
Container container = getContentPane();
container.add(hello);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
pack();
setVisible(true);
}
public static void main(String[] args) {
new ImageDemo();
}
}
3.4 Pannel面板
package lesson09;
import javax.swing.*;
import java.awt.*;
public class JPanelDemo extends JFrame {
public JPanelDemo() throws HeadlessException {
Container container = getContentPane();
container.setLayout(new GridLayout(2, 1, 10 ,10));//后两个参数代表间距
JPanel panel = new JPanel();
panel.add(new JButton("01"));
panel.add(new JButton("02"));
panel.add(new JButton("03"));
container.add(panel);
setVisible(true);
pack();
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new JPanelDemo();
}
}
JScroll面板(带滚动条)
package lesson09;
import javax.swing.*;
import java.awt.*;
public class JScrollDemo extends JFrame {
public JScrollDemo() {
Container container = getContentPane();
//文本域
JTextArea textArea = new JTextArea();
textArea.setText("欢迎学习wqwqrrqwrqrqrwqrqwrq" +'\n'+
"qwerqrqrqrw" +'\n'+
"wrqrqwrqrwrw!");
//JScroll面板(滚动条)
JScrollPane pane = new JScrollPane(textArea);
container.add(pane);
this.setVisible(true);
this.setBounds(100,100,300,350);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new JScrollDemo();
}
}
3.5 按钮
3.5.1 普通按钮
package lesson10;
import javax.swing.*;
import java.awt.*;
import java.net.URL;
public class JButtonDemo extends JFrame {
public JButtonDemo(){
Container container = getContentPane();
//将一个图片变为图标
URL url = JButtonDemo.class.getResource("头像01.jpg");
ImageIcon icon = new ImageIcon(url);
//创建按钮
JButton jButton = new JButton(icon);
jButton.setToolTipText("这是提示语");
container.add(jButton);
this.setVisible(true);
this.pack();
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new JButtonDemo();
}
}
3.5.2 单选框按钮
package lesson11;
import javax.swing.*;
import java.awt.*;
import java.net.URL;
public class JRadioButtonDemo extends JFrame {
public JRadioButtonDemo(){
Container container = getContentPane();
//单选框,分组,只能选择一个
JRadioButton jButton01 = new JRadioButton("01");
JRadioButton jButton02 = new JRadioButton("02");
JRadioButton jButton03 = new JRadioButton("03");
ButtonGroup group = new ButtonGroup();
group.add(jButton01);
group.add(jButton02);
group.add(jButton03);
container.add(jButton01,BorderLayout.CENTER);
container.add(jButton02, BorderLayout.NORTH);
container.add(jButton03, BorderLayout.SOUTH);
this.setVisible(true);
this.setBounds(100,100,500,300);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new JRadioButtonDemo();
}
}
3.5.3 复选框
package lesson11;
import javax.swing.*;
import java.awt.*;
public class JCheckBoxDemo extends JFrame {
public JCheckBoxDemo(){
Container container = getContentPane();
//多选框
JCheckBox checkBox01 = new JCheckBox("01");
JCheckBox checkBox02 = new JCheckBox("02");
JCheckBox checkBox03 = new JCheckBox("03");
container.add(checkBox01,BorderLayout.CENTER);
container.add(checkBox02,BorderLayout.NORTH);
container.add(checkBox03,BorderLayout.SOUTH);
this.setVisible(true);
this.setBounds(100,100,500,300);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new JCheckBoxDemo();
}
}
3.6 列表
3.6.1 下拉框
package lesson12;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class JComboBoxDemo extends JFrame {
public JComboBoxDemo() throws HeadlessException {
Container container = this.getContentPane();
JComboBox<Object> status = new JComboBox<>();
status.addItem("null");
status.addItem("正在热映");
status.addItem("已下架");
status.addItem("即将上映");
status.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(status.getSelectedIndex());//获取项序数
System.out.println(status.getSelectedItem());//获取内容
}
});
container.add(status);
this.setVisible(true);
this.setBounds(100,100,300,500);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new JComboBoxDemo();
}
}
3.6.2 列表框
String[]静态添加数据,Vector可动态调整数据
package lesson12;
import javax.swing.*;
import java.awt.*;
public class JComboBoxDemo extends JFrame {
public JComboBoxDemo() throws HeadlessException {
Container container = this.getContentPane();
String[] content = {"1","2","3"};
JList<Object> status = new JList<>(content);
container.add(status);
this.setVisible(true);
this.setBounds(100,100,300,500);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new JComboBoxDemo();
}
}
3.7 文字组件
3.7.1 文本框
package lesson12;
import javax.swing.*;
import java.awt.*;
public class JComboBoxDemo extends JFrame {
public JComboBoxDemo() throws HeadlessException {
Container container = this.getContentPane();
JTextField textField = new JTextField("hello");
JTextField textField2 = new JTextField("world",10);
container.add(textField,BorderLayout.NORTH);
container.add(textField2,BorderLayout.SOUTH);
this.setVisible(true);
this.setBounds(100,100,300,500);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new JComboBoxDemo();
}
}
3.7.2 密码框
package lesson12;
import javax.swing.*;
import java.awt.*;
public class JComboBoxDemo extends JFrame {
public JComboBoxDemo() throws HeadlessException {
Container container = this.getContentPane();
JPasswordField passwordField = new JPasswordField();
passwordField.setEchoChar('*');
container.add(passwordField);
this.setVisible(true);
this.setBounds(100,100,300,500);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new JComboBoxDemo();
}
}
3.7.3 文本域
package lesson09;
import javax.swing.*;
import java.awt.*;
public class JScrollDemo extends JFrame {
public JScrollDemo() {
Container container = getContentPane();
//文本域
JTextArea textArea = new JTextArea();
textArea.setText("欢迎学习wqwqrrqwrqrqrwqrqwrq" +'\n'+
"qwerqrqrqrw" +'\n'+
"wrqrqwrqrwrw!");
//JScroll面板(滚动条)
JScrollPane pane = new JScrollPane(textArea);
container.add(pane);
this.setVisible(true);
this.setBounds(100,100,300,350);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new JScrollDemo();
}
}
4. 贪吃蛇
StartGame
package snake;
import javax.swing.*;
//游戏中的主启动类
public class StartGame extends JFrame{
public StartGame() {
super("贪吃蛇");
this.setBounds(10,10,900,720);
this.setResizable(false);//设置窗体大小不可变
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
this.setVisible(true);
}
public void init(){
this.add(new GamePanel());
}
public static void main(String[] args) {
new StartGame().init();
}
}
GamePanel
package snake;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.Random;
//游戏的面板
public class GamePanel extends JPanel implements ActionListener {
boolean isStart = false;//游戏状态参数
boolean isFail = false;
SnakeStructure snakeStructure = new SnakeStructure();
Food food = new Food();
Timer timer = new Timer(100,this);
public GamePanel(){
snakeStructure.init();
food.init();
//获得焦点和键盘事件
this.setFocusable(true);
this.addKeyListener(new MyKeyListener());
//游戏一开始,定时器启动
timer.start();
}
//定义蛇的数据结构
class SnakeStructure {
int score;//得分
int length;//蛇的长度
int[] snakeX = new int[600]; // 蛇的x坐标
int[] snakeY = new int[500]; // 蛇的y坐标
String fx;//方向
//初始化方法
public void init(){
length = 3;
score = 0;
snakeX[0] = 100;snakeY[0] = 100;//脑袋的坐标
snakeX[1] = 75;snakeY[1] = 100;//第一个身体的坐标
snakeX[2] = 50;snakeY[2] = 100;//第二个身体的坐标
fx = "R";//初始化方向为右
}
}
//定义食物位置
class Food{
int foodX, foodY;
Random random = new Random();
//把食物随机分布在界面上
public void init(){
foodX = 25 + 25 * random.nextInt(34);
foodY = 75 + 25 * random.nextInt(24);
}
}
//键盘监听器
class MyKeyListener extends KeyAdapter {
@Override
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
if (keyCode == KeyEvent.VK_SPACE) {
if (isFail){
isFail = false;
snakeStructure.init();
}
else
isStart = !isStart;
}
repaint();
//小蛇移动
if (keyCode == KeyEvent.VK_UP){
snakeStructure.fx = "U";
}else if (keyCode == KeyEvent.VK_DOWN){
snakeStructure.fx = "D";
}else if (keyCode == KeyEvent.VK_LEFT){
snakeStructure.fx = "L";
}else if (keyCode == KeyEvent.VK_RIGHT){
snakeStructure.fx = "R";
}
}
}
//事件监听---通过定时器实现,刷新
public void actionPerformed(ActionEvent e) {
if (isStart && !isFail){
//吃食物
if (snakeStructure.snakeX[0] == food.foodX && snakeStructure.snakeY[0] == food.foodY) {
snakeStructure.length ++;
snakeStructure.score += 10;
food.init();//再次初始化食物
}
//身体移动
for (int i = snakeStructure.length - 1; i > 0; i--) {
snakeStructure.snakeX[i] = snakeStructure.snakeX[i-1];
snakeStructure.snakeY[i] = snakeStructure.snakeY[i-1];
}
//走向
if ("R".equals(snakeStructure.fx)){
snakeStructure.snakeX[0] += 25;
if (snakeStructure.snakeX[0] > 850)
snakeStructure.snakeX[0] = 25;
}
else if ("L".equals(snakeStructure.fx)){
snakeStructure.snakeX[0] -= 25;
if (snakeStructure.snakeX[0] < 25)
snakeStructure.snakeX[0] = 850;
}
else if ("U".equals(snakeStructure.fx)){
snakeStructure.snakeY[0] -= 25;
if (snakeStructure.snakeY[0] < 75)
snakeStructure.snakeY[0] = 650;
}
else if ("D".equals(snakeStructure.fx)){
snakeStructure.snakeY[0] += 25;
if (snakeStructure.snakeY[0] > 650)
snakeStructure.snakeY[0] = 75;
}
//失败判断,装到自己就算失败
for (int i = 1; i < snakeStructure.length; i++){
if (snakeStructure.snakeX[0] == snakeStructure.snakeX[i] && snakeStructure.snakeY[0] == snakeStructure.snakeY[i])
isFail = true;
}
repaint();
}
timer.start();
}
//绘制面板
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);//清屏,避免闪烁
//绘制静态面板
this.setBackground(Color.WHITE);
Date.header.paintIcon(this,g,25,11);//广告栏
g.fillRect(25,75,850,600);//默认的游戏界面
//计分板
g.setColor(Color.CYAN);
g.setFont(new Font("微软雅黑", Font.BOLD,18));
g.drawString("长度" + snakeStructure.length, 750,35);
g.drawString("分数" + snakeStructure.score, 750,60);
//画出食物
Date.food.paintIcon(this,g,food.foodX,food.foodY);
//画出小蛇
switch (snakeStructure.fx){
case "R": Date.right.paintIcon(this,g,snakeStructure.snakeX[0],snakeStructure.snakeY[0]);break;
case "L": Date.left.paintIcon(this,g,snakeStructure.snakeX[0],snakeStructure.snakeY[0]);break;
case "U": Date.up.paintIcon(this,g,snakeStructure.snakeX[0],snakeStructure.snakeY[0]);break;
case "D": Date.down.paintIcon(this,g,snakeStructure.snakeX[0],snakeStructure.snakeY[0]);break;
}
for (int i = 1; i < snakeStructure.length;i++){
Date.body.paintIcon(this,g,snakeStructure.snakeX[i],snakeStructure.snakeY[i]);//身体初始化
}
//游戏状态
if (isStart == false){
g.setColor(Color.WHITE);
g.setFont(new Font("微软雅黑", Font.BOLD,40));
g.drawString("按下空格开始游戏",300,300);
}
if (isFail == true){
g.setColor(Color.red);
g.setFont(new Font("微软雅黑", Font.BOLD,40));
g.drawString("按下空格开始游戏",300,300);
}
}
}
Date
package snake;
import javax.swing.*;
import java.net.URL;
public class Date {
private static URL headerURl = Date.class.getResource("/statics/header.png");
private static URL upURL = Date.class.getResource("/statics/up.png");
private static URL downURL = Date.class.getResource("/statics/down.png");
private static URL leftURl = Date.class.getResource("/statics/left.png");
private static URL rightURL = Date.class.getResource("/statics/right.png");
private static URL bodyURL = Date.class.getResource("/statics/body.png");
private static URL foodURL = Date.class.getResource("/statics/food.png");
public static ImageIcon header = new ImageIcon(headerURl);
public static ImageIcon up = new ImageIcon(upURL);
public static ImageIcon down = new ImageIcon(downURL);
public static ImageIcon left = new ImageIcon(leftURl);
public static ImageIcon right = new ImageIcon(rightURL);
public static ImageIcon body = new ImageIcon(bodyURL);
public static ImageIcon food = new ImageIcon(foodURL);
}



浙公网安备 33010602011771号