JAVA开发的华容道游戏

本文介绍了一个使用Java实现的华容道游戏示例代码。通过继承Button类并实现FocusListener接口来创建游戏角色,利用KeyEvent监听键盘操作以移动角色。文章详细展示了如何设置游戏界面、绘制边界及处理角色移动逻辑。
摘要由CSDN通过智能技术生成
 
import java.awt.*;import java.applet.*;import java.awt.event.*;
class People extends Button implements FocusListener  //代表华容道人物的类。
{  Rectangle rect=null;
   int left_x,left_y;//按扭的左上角坐标.
   int width,height; //按扭的宽和高.
   String name; int number;
   People(int number,String s,int x,int y,int w,int h,Hua_Rong_Road road)
   {  super(s);
      name=s;this.number=number;
      left_x=x;left_y=y;
      width=w;height=h;setBackground(Color.orange);
      road.add(this);    addKeyListener(road);
      setBounds(x,y,w,h);addFocusListener(this);
      rect=new Rectangle(x,y,w,h);
   }
   public void focusGained(FocusEvent e)
   {  setBackground(Color.red);
   }
   public void focusLost(FocusEvent e)
   {   setBackground(Color.orange);
   }
}
public class Hua_Rong_Road extends Applet implements KeyListener,ActionListener
{  People people[]=new People[10];
   Rectangle left,right,above ,below;//华容道的边界 .
   Button restart=new Button("重新开始");
   public void init()
   {  setLayout(null); add(restart);
      restart.setBounds(5,5,80,25);
      restart.addActionListener(this);
      people[0]=new People(0,"曹操",104,54,100,100,this);
      people[1]=new People(1,"关羽",104,154,100,50,this);
      people[2]=new People(2,"张飞",54, 154,50,100,this);
    people[3]=new People(3,"刘备",204,154,50,100,this);
    people[4]=new People(4,"张辽",54, 54, 50,100,this);
    people[5]=new People(5,"曹仁",204, 54, 50,100,this);
    people[6]=new People(6,"兵  ",54,254,50,50,this);
    people[7]=new People(7,"兵  ",204,254,50,50,this);
    people[8]=new People(8,"兵  ",104,204,50,50,this);
    people[9]=new People(9,"兵  ",154,204,50,50,this);
    people[9].requestFocus();
    left=new Rectangle(49,49,5,260);
  people[0].setForeground(Color.white) ;
    right=new Rectangle(254,49,5,260);
      above=new Rectangle(49,49,210,5);
      below=new Rectangle(49,304,210,5);
   }
   public void paint(Graphics g)
   {  //画出华容道的边界:
      g.setColor(Color.cyan);
      g.fillRect(49,49,5,260);//left.
      g.fillRect(254,49,5,260);//right.
      g.fillRect(49,49,210,5); //above.
      g.fillRect(49,304,210,5);//below.
      //提示曹操逃出位置和按键规则:
      g.drawString("点击相应的人物,然后按键盘上的上下左右箭头移动",100,20);
      g.setColor(Color.red);
      g.drawString("曹操到达该位置",110,300);
   }
   public void keyPressed(KeyEvent e)
   {  People man=(People)e.getSource();//获取事件源.
       man.rect.setLocation(man.getBounds().x, man.getBounds().y);
       if(e.getKeyCode()==KeyEvent.VK_DOWN)
         {  man.left_y=man.left_y+50;     //向下前进50个单位。
            man.setLocation(man.left_x,man.left_y);
            man.rect.setLocation(man.left_x,man.left_y);
              //判断是否和其它人物或下边界出现重叠,如果出现重叠就退回50个单位距离。
            for(int i=0;i<10;i++)
                {if((man.rect.intersects(people[i].rect))&&(man.number!=i))
                    {  man.left_y=man.left_y-50;
                       man.setLocation(man.left_x,man.left_y);
                       man.rect.setLocation(man.left_x,man.left_y);
                    }
                 }
             if(man.rect.intersects(below))
                 {  man.left_y=man.left_y-50;
                    man.setLocation(man.left_x,man.left_y);
                    man.rect.setLocation(man.left_x,man.left_y);
                 }
         }
       if(e.getKeyCode()==KeyEvent.VK_UP)
        {  man.left_y=man.left_y-50;     //向上前进50个单位。
           man.setLocation(man.left_x,man.left_y);
           man.rect.setLocation(man.left_x,man.left_y);
           //判断是否和其它人物或上边界出现重叠,如果出现重叠就退回50个单位距离。
           for(int i=0;i<10;i++)
               {  if((man.rect.intersects(people[i].rect))&&(man.number!=i))
                      {  man.left_y=man.left_y+50;
                         man.setLocation(man.left_x,man.left_y);
                          man.rect.setLocation(man.left_x,man.left_y);
                       }
               }
            if(man.rect.intersects(above))
               {  man.left_y=man.left_y+50;
                  man.setLocation(man.left_x,man.left_y);
                  man.rect.setLocation(man.left_x,man.left_y);
               }
        }
      if(e.getKeyCode()==KeyEvent.VK_LEFT)
        {  man.left_x=man.left_x-50;     //向左前进50个单位。
           man.setLocation(man.left_x,man.left_y);
           man.rect.setLocation(man.left_x,man.left_y);
           //判断是否和其它人物或左边界出现重叠,如果出现重叠就退回50个单位距离。
          for(int i=0;i<10;i++)
               {  if((man.rect.intersects(people[i].rect))&&(man.number!=i))
                    { man.left_x=man.left_x+50;
                      man.setLocation(man.left_x,man.left_y);
                      man.rect.setLocation(man.left_x,man.left_y);
                     }
               }
          if(man.rect.intersects(left))
              {  man.left_x=man.left_x+50;
                 man.setLocation(man.left_x,man.left_y);
                 man.rect.setLocation(man.left_x,man.left_y);
               }
        }
      if(e.getKeyCode()==KeyEvent.VK_RIGHT)
       {  man.left_x=man.left_x+50;     //向右前进50个单位。
          man.setLocation(man.left_x,man.left_y);
          man.rect.setLocation(man.left_x,man.left_y);
         //判断是否和其它人物或右边界出现重叠,如果出现重叠就退回50个单位距离。
          for(int i=0;i<10;i++)
              {  if((man.rect.intersects(people[i].rect))&&(man.number!=i))
                    { man.left_x=man.left_x-50;
                      man.setLocation(man.left_x,man.left_y);
                      man.rect.setLocation(man.left_x,man.left_y);
                     }
               }
           if(man.rect.intersects(right))
               {  man.left_x=man.left_x-50;
                  man.setLocation(man.left_x,man.left_y);
                  man.rect.setLocation(man.left_x,man.left_y);
                }
         }
   }
   public void keyTyped(KeyEvent e){}
   public void keyReleased(KeyEvent e){}
   public void actionPerformed(ActionEvent e)
   {  this.removeAll();
      this.init();
   }
}
 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值