Java实例 华容道

//Inner class 事件处理例一
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class Hua_Rong_Road extends JFrame implements MouseListener, KeyListener, ActionListener
{
    Person person[] = new Person[10];
    JButton left, right, above, below;
    JButton restart = new JButton("从新开始");

    public Hua_Rong_Road()
    {
        init();
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        setBounds(100, 100, 320,500);
        setVisible(true);
        validate();
    }

    public void init()
    {
        setLayout(null);

        // 重新开始按钮
        add(restart);
        restart.setBounds(100,400,120,35);
        restart.addActionListener(this);

        // 创建人物按钮
        String name[] = {"曹操","关羽","张","刘","周","黄","兵","兵","兵","兵"};
        for(int i = 0; i < name.length; i++)
        {
            person[i] = new Person(i, name[i]);
            person[i].addMouseListener(this);
            person[i].addKeyListener(this);
            add(person[i]);
        }

        // 设置人物大小
        person[0].setBounds(104,54,100,100);
        person[1].setBounds(104,154,100,50);
        person[2].setBounds(54,154,50,100);
        person[3].setBounds(204,154,50,100);
        person[4].setBounds(54,54,50,100);
        person[5].setBounds(204,54,50,100);
        person[6].setBounds(54,254,50,50);
        person[7].setBounds(204,254,50,50);
        person[8].setBounds(104,204,50,50);
        person[9].setBounds(154,204,50,50);

        // 设置初始焦点
        person[9].requestFocus();

        // 创建移动按钮
        left = new JButton();
        right = new JButton();
        above = new JButton();
        below = new JButton();

        add(left);
        add(right);
        add(above);
        add(below);

        left.setBounds(49,49,5,260);
        right.setBounds(254,49,5,260);
        above.setBounds(49,49,210,5);
        below.setBounds(49,304,210,5);

        validate();///
    }

    public void keyTyped(KeyEvent e){}
    public void keyReleased(KeyEvent e){}

    // 按下键盘
    public void keyPressed(KeyEvent e)
    {
        Person man = (Person)e.getSource();

        // 移动函数
        if(e.getKeyCode() == KeyEvent.VK_DOWN)
            go(man, below);
        if(e.getKeyCode() == KeyEvent.VK_UP)
            go(man, above);
        if(e.getKeyCode() == KeyEvent.VK_LEFT)
            go(man, left);
        if(e.getKeyCode() == KeyEvent.VK_RIGHT)
            go(man, right);
    }

    // 鼠标按下
    public void mousePressed(MouseEvent e)
    {
        Person man = (Person)e.getSource();

        int x = -1,y = -1;
        x = e.getX();
        y = e.getY();
        int w = man.getBounds().width;
        int h = man.getBounds().height;

        // 鼠标点击按钮左半部分是左移,其他类似
        if(y > h/2)
            go(man, below);
        if(y < h/2)
            go(man, above);
        if(x < w/2)
            go(man, left);
        if(x > w/2)
            go(man, right);
    }

    public void mouseReleased(MouseEvent e){}
    public void mouseEntered(MouseEvent e){}
    public void mouseExited(MouseEvent e){}
    public void mouseClicked(MouseEvent e){}

    // 移动函数
    public void go(Person man, JButton direction)
    {
        boolean move = true;
        Rectangle manRect = man.getBounds();
        int x = man.getBounds().x;
        int y = man.getBounds().y;

        // 移动
        if(direction == below)
            y += 50;
        else if(direction == above)
            y -= 50;
        else  if(direction == left)
            x -= 50;
        else if(direction == right)
            x += 50;

        // 重新设置位置
        manRect.setLocation(x, y);

        Rectangle directionRect = direction.getBounds();  // 获得移动按钮的位置信息

        for(int k = 0; k < 10;k++)
        {
            Rectangle personRect = person[k].getBounds();
            if(manRect.intersects(personRect) && (man.number != k))//
                move = false;
        }
        if(manRect.intersects(directionRect))
            move = false;
        if(move == true)
            man.setLocation(x, y);

        // 胜利机制
        if(person[0].getLocation().y == 304 - 100)
            JOptionPane.showMessageDialog(this, "恭喜你成功啦!", "游戏胜利", JOptionPane.PLAIN_MESSAGE);
    }

    public void actionPerformed(ActionEvent e)
    {
        dispose();
        new Hua_Rong_Road();
    }
}

class Person extends JButton implements FocusListener
{
    int number;
    Color c = new Color(255, 245, 170);  // 设置颜色
    Font font = new Font("宋体", Font.BOLD, 12);   // 设置字体

    Person(int number, String s)
    {
        super(s);
        setBackground(c);
        setFont(font);
        this.number = number;

        c = getBackground();
        addFocusListener(this);
    }

    public void focusGained(FocusEvent e)
    {
        setBackground(Color.red);
    }

    public void focusLost(FocusEvent e)
    {
        setBackground(c);
    }
}

//主类
public class test
{
    public static void main(String args[])
    {
        new Hua_Rong_Road();
    }
}

在这里插入图片描述

在这里插入图片描述

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值