坦克大战--Java类型 ---- 按键设置和用户名的输入

Posted winter-bamboo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了坦克大战--Java类型 ---- 按键设置和用户名的输入相关的知识,希望对你有一定的参考价值。

一、实现思路(emmmm,这个地方我很大程度参照了别人的写法)

   由于键盘按键众多,因此使用选择框JComboBox 进行按键选择,点击一个JButton 按钮后,读取所有选择框中的内容,然后存到一个用于保存键位设置的对象Key中,然后在坦克移动的时候根据对象Key中的数据判断对坦克的操作。

     同时,为了保证每次打开游戏时,能够保留上一次的按键设置,使用对象流将对象Key存入文件,以后创建KeySet的对象后,从文件中读取保存对象Key的信息,并使用;如果文件不存在或者文件为空,那么就重新new一个Key对象,并在用户确定按键设置后将新的Key对象存入文件中,以便下一次打开。

  同时,我们也需要绘制选择界面,首先就是将选择框JComboBox 以及按钮JButton 加入JFrame里面,并设置好位置等等,同时我们需要提示用户当前的按键是什么,为了简单,直接paint到JFrame里面了。

二、JComboBox的使用

  1) JComboBox  UP =  new JComboBox<String>()

      创建类JComboBox的对象,用String代表选择内容的类型,这里用的是String型

    2) UP.setFont(new Font(Font.SERIF, Font.BOLD, 20));

      设置选择框中字体的类型

    3)   UP.setBounds(100, 100, 150, 50);

      设置选择框的大小和相对位置,相对位置为相对于JFrame的位置

    4)   UP.addItem("VK_UP");

      像选择框中添加选择,这里我添加了上移键的默认位置 VK_UP就是键盘上的那个向上的箭头

    5)  jframe.add(UP);

      jrame就是JFrame的对象,我们需要把选择框加入其中,才可以让别人看得见并进行操作

    6)  String up = (String) UP.getSelectedItem();

      获取选择框的选择内容,并转型,因为返回值是Object类型的

 三、一些次要的功能

  1)错误提示

    比如选择按键的时候,同一个按键实现了两个功能,就会出现如下的情况

技术图片

    同时,出现了用户名没有输入或者为空的时候也会进行提示,如下

技术图片

    实现方法:JOptionPane.showMessageDialog(jframe, "按键重复!", "警告", 0);

      第一个参数代表要显示在的窗口,第二个参数为提示信息,第三个参数为标题,第四个参数为提示信息类型

  2)音乐播放

    this.music = new Music(11);

     music.start();

    构造方法中参数为音乐类型,Music为自定义的类,具体请参考另一篇博文

    通过start()方法用多线程开始播放音乐。

public void actionPerformed(ActionEvent e) {
if(e.getSource() == music_button) {
if(tot++ % 2 == 0) {
music.close();
}else {
music.open();
}
}
  ......
}

    这个地方设置了一个musci_button的按钮,就是图中左上角的那个,实现点击后暂停或者重新播放。

四、效果展示

技术图片

 

 五、代码区

   类Key

package component;

import java.awt.event.KeyEvent;
import java.io.Serializable;

public class Key implements Serializable{
    private static final long serialVersionUID = 1L;
    public int MY_UP;
    public int MY_DOWN;
    public int MY_LEFT;
    public int MY_RIGHT;
    public int MY_ATTACK;
    public Key() {
        MY_UP = KeyEvent.VK_UP;
        MY_DOWN = KeyEvent.VK_DOWN;
        MY_LEFT = KeyEvent.VK_LEFT;
        MY_RIGHT = KeyEvent.VK_RIGHT;
        MY_ATTACK = KeyEvent.VK_SPACE;
    }
    public Key(int MY_UP,int MY_DOWN,int MY_LEFT,int MY_RIGHT,int MY_ATTACK) {
        this.MY_UP = MY_UP;
        this.MY_DOWN = MY_DOWN;
        this.MY_LEFT = MY_LEFT;
        this.MY_RIGHT = MY_RIGHT;
        this.MY_ATTACK = MY_ATTACK;
    }
}

  类KeySet

package component;

import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import javax.swing.*;

public class KeySet extends JPanel implements ActionListener{
    private static final long serialVersionUID = 1675L;
    private Key key = null;
    private JFrame jframe;
    private JComboBox<String> UP;
    private JComboBox<String> RIGHT;
    private JComboBox<String> DOWN;
    private JComboBox<String> LEFT;
    private JComboBox<String> ATTACK;// 攻击
    private JTextField txt = null;// 输入名字
    private JButton ENSURE;
    private JButton music_button = new JButton("");
    private Music music;
    private static int tot = 0;

    public static void main(String[] args) {
        new KeySet();
    }

    public KeySet() {
        this.readData();
        this.music = new Music(11);
        music.start();
        jframe = new JFrame("设置");
        jframe.setSize(1200, 600);
        jframe.setLocationRelativeTo(null);// 不可扩大
        jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jframe.setLayout(null);
        
        ENSURE = new JButton("保存");// 确定按键
        ENSURE.setFont(new Font(Font.SERIF, Font.BOLD, 20));// 设置字体
        ENSURE.setBounds(100, 400, 100, 50);// 设置按钮
        jframe.add(ENSURE);
        ENSURE.addActionListener(this);
        
        UP = new JComboBox<String>();
        UP.setFont(new Font(Font.SERIF, Font.BOLD, 20));
        UP.addItem("VK_UP");// 初始值
        UP.setBounds(100, 100, 150, 50);
        addChoose(UP);// 添加备选项

        RIGHT = new JComboBox<String>();
        RIGHT.setFont(new Font(Font.SERIF, Font.BOLD, 20));
        RIGHT.addItem("VK_RIGHT");
        RIGHT.setBounds(400, 200, 150, 50);
        addChoose(RIGHT);

        DOWN = new JComboBox<String>();
        DOWN.setFont(new Font(Font.SERIF, Font.BOLD, 20));
        DOWN.addItem("VK_DOWN");
        DOWN.setBounds(400, 100, 150, 50);
        addChoose(DOWN);

        LEFT = new JComboBox<String>();
        LEFT.setFont(new Font(Font.SERIF, Font.BOLD, 20));
        LEFT.addItem("VK_LEFT");
        LEFT.setBounds(100, 200, 150, 50);
        addChoose(LEFT);

        ATTACK = new JComboBox<String>();
        ATTACK.setFont(new Font(Font.SERIF, Font.BOLD, 20));
        ATTACK.addItem("VK_SPACE");
        ATTACK.setBounds(100, 300, 150, 50);
        addChoose(ATTACK);

        txt = new JTextField("用户名");
        txt.setBounds(400, 300, 150, 50);
        txt.setFont(new Font(Font.SERIF, Font.BOLD, 20));
        
        //music_button.setBackground(Color.CYAN);
        music_button.setBounds(0, 0, 75, 75);
        music_button.setIcon(new ImageIcon("img/music2.png"));
        music_button.addActionListener(this);

        jframe.add(UP);
        jframe.add(RIGHT);
        jframe.add(DOWN);
        jframe.add(LEFT);
        jframe.add(ATTACK);
        jframe.add(txt);
        jframe.add(music_button);
        
        this.setBounds(0, 0, 1200, 600);
        jframe.add(this); // 将画板加入画笔
        jframe.repaint();
        jframe.setVisible(true);

    }
    
    public void paint(Graphics g) {
        Font f = new Font(Font.SERIF,Font.BOLD,20);
        g.setFont(f);
        g.drawString("上移键:", 100, 80);
        g.drawString("下移键:", 400, 80);
        g.drawString("左移键:", 100, 180);
        g.drawString("右移键:", 400, 180);
        g.drawString("攻击键:", 100, 280);
        g.drawString("名字:",400,280);//画出选项
        
        String up = "向上键 VK_"+(char)key.MY_UP+" ";
        String down = "向下键 VK_"+(char)key.MY_DOWN+" ";
        String left = "向左键 VK_"+(char)key.MY_LEFT+" ";
        String right = "向右键 VK_"+(char)key.MY_RIGHT+" ";
        String attack = "攻击键 VK_" +(char)key.MY_ATTACK+" ";
        System.out.println(key.MY_ATTACK);
        
        g.drawString("当前键:", 600, 150);//画出当前选择
        if(key.MY_UP == 38) {
            g.drawString("向上: VK_UP", 600, 200);
        }
        else {
            g.drawString(up, 600, 200);
        }
        if(key.MY_DOWN == 40) {
            g.drawString("向下: VK_DOWN", 800, 200);
        }
        else {
            g.drawString(down, 800, 200);
        }
        if(key.MY_LEFT == 37) {
            g.drawString("向左: VK_LEFT",600,250);
        }
        else {
            g.drawString(left, 600, 250);
        }
        if(key.MY_RIGHT == 39) {
            g.drawString("向右: VK_RIGHT",800,250);
        }
        else {
            g.drawString(right, 800, 250);
        }
        if(key.MY_ATTACK == 32) {
            g.drawString("攻击: 空格",700,300);
        }
        else {
            g.drawString(attack, 700, 300);
        }
    }

    // 判断按键是否重复
    private boolean judge() {
        String a = (String) UP.getSelectedItem();
        String b = (String) RIGHT.getSelectedItem();
        String c = (String) DOWN.getSelectedItem();
        String d = (String) LEFT.getSelectedItem();
        String e = (String) ATTACK.getSelectedItem();
        if (a.equals(b) || a.equals(c) || a.equals(d) || a.equals(e)) {
            return true;
        } else if (b.equals(c) || b.equals(d) || b.equals(e)) {
            return true;
        } else if (c.equals(d) || c.equals(e) || c.equals(e)) {
            return true;
        }
        return false;
    }

    private void addChoose(JComboBox<String> now) {
        for (int i = 0; i <= 9; i++) {
            now.addItem(String.valueOf(i));// 添加 1 - 9
        }
        for (int i = 65; i <= 90; i++) {
            now.addItem((char) (i) + " "); // 添加‘A‘ ~ ‘Z‘
        }
    }

    // 读入本地文件 如果文件不存在 就创建一个新的key
    private boolean readData() {
        File file = new File("key.txt");
        if(!file.exists() || file.length() == 0) {
            try {
                file.createNewFile();
                key = new Key();
                saveData();
                return true;
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        
        
        ObjectInputStream ois = null;// 读入流
        try {
            FileInputStream fis = new FileInputStream("key.txt");
            ois = new ObjectInputStream(fis);
            key = (Key) ois.readObject(); // 读入

        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            try {
                if (ois != null) {
                    ois.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            this.saveData(); // 保存
        }
        return true;
    }

    private boolean saveData() {
        ObjectOutputStream oos = null;
        try {
            oos = new ObjectOutputStream(new FileOutputStream("key.txt"));
            oos.writeObject(key);
            oos.flush();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (oos != null) {
                try {
                    oos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return true;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getSource() == music_button) {
            if(tot++ % 2 == 0) {
                music.close();
            }else {
                music.open();
            }
        }else if(e.getSource() == ENSURE) {
            if (judge()) {
                JOptionPane.showMessageDialog(jframe, "按键重复!", "警告", 0);
            } else if (txt.getText().equals("") || txt.getText().equals("用户名")) {
                JOptionPane.showMessageDialog(jframe, "请输入用户名", "警告", 0);
            } else {// 只有一个按键
                String up = (String) UP.getSelectedItem();// 获取向上
                if (!up.equals("VK_UP")) { // 不是默认值
                    char a = up.charAt(0); // 获取选中的
                    key.MY_UP = (int) a; // 用int保存
                } else {
                    key.MY_UP = 38;
                }
                String down = (String) DOWN.getSelectedItem();// 获取向下的操作
                if (!down.equals("VK_DOWN")) {
                    char a = down.charAt(0);
                    key.MY_DOWN = (int) a;
                } else {
                    key.MY_DOWN = 40;
                }
                String left = (String) LEFT.getSelectedItem();
                if (!left.equals("VK_LEFT")) {
                    char a = left.charAt(0);
                    key.MY_LEFT = (int) a;
                } else {
                    key.MY_LEFT = 37;
                }
                String right = (String) RIGHT.getSelectedItem();
                if (!right.equals("VK_RIGHT")) {
                    char a = right.charAt(0);
                    key.MY_RIGHT = (int) a;
                } else {
                    key.MY_RIGHT = 39;
                }
                String attack = (String) ATTACK.getSelectedItem();
                if (!attack.equals("VK_SPACE")) {
                    char a = attack.charAt(0);
                    key.MY_ATTACK = (int) a;
                    System.out.println((char)a + " " + attack);
                } else {
                    key.MY_ATTACK = 32;
                }
                String name = txt.getText();
                System.out.println(name);
                
                saveData();// 存入文件
                music.close();
                new Choose(name,key); // 进入关卡选择
                jframe.dispose();
            }

        }
        
    }

}

 

以上是关于坦克大战--Java类型 ---- 按键设置和用户名的输入的主要内容,如果未能解决你的问题,请参考以下文章

JAVA课程设计(坦克大战)

基于java的坦克大战游戏

java学习之坦克大战游戏

《游戏学习》JAVA版坦克大战课程设计及源码

《游戏学习》JAVA版坦克大战课程设计及源码

JAVA坦克大战项目练习日4