package www.huarongdao.game; import javax.swing.*; import java.awt.event.*; import java.awt.*; public class Hua_Rong_Road extends JFrame implements MouseListener,KeyListener,ActionListener { private static final int ERROR_MESSAGE = 0; private static final int WARNING_MESSAGE = 0; int cnt=0; Person person[]=new Person[10]; JButton left,right,above,below; JButton restart=new JButton("重新开始"); JButton about=new JButton("游戏背景"); JButton help=new JButton("游戏帮助"); JButton mouse=new JButton("鼠标操作"); JButton key=new JButton("键盘操作"); JButton message=new JButton("当前步数:"+cnt); JButton begin=new JButton("开始游戏"); JButton star=new JButton(); String name[]={"曹操","关羽","张飞","黄忠","马超","赵云","兵","兵","兵","兵"}; public Hua_Rong_Road(){ JOptionPane.showMessageDialog(this, "开始游戏前,请先阅读下方的游戏帮助,游戏背景可自行了解."); init(); //setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); setBounds(200,200,640,800);//设置窗体初始位置以及大小的一个函数 setVisible(true);//窗口可见 //person[9].requestFocus();//获取焦点需要卸载setVisible后面才行 validate();//使用validate方法是容器再次布置其组件,确保布局有效 } public void init(){ setLayout(null); message.setBackground(Color.ORANGE); add(restart); restart.setBounds(120, 640, 100, 50); //restart.setBackground(Color.RED); restart.addActionListener(this); add(about); about.addActionListener(this); about.setBounds(250,640,100,50); add(mouse); mouse.setBounds(280,40,100,50); mouse.addActionListener(this); add(key); key.setBounds(400, 40, 100, 50); key.addActionListener(this); add(help); help.setBounds(380, 640, 100, 50); help.addActionListener(this); add(message); message.setBounds(110,40,160,50); ImageIcon starr=new ImageIcon("images//huarongdao.jpg"); starr.setImage(starr.getImage().getScaledInstance(400,400,Image.SCALE_DEFAULT )); star.setIcon(starr); star.setBounds(108,208,400,400); add(star); add(begin); begin.addActionListener(this); begin.setBounds(250,140,100,50); setVisible(true); left=new JButton(); right=new JButton(); above=new JButton(); below=new JButton(); add(left); add(right); add(above); add(below); //边界类 left.setBounds(98, 98, 10, 520); right.setBounds(508,98,10,520); above.setBounds(98, 98, 420, 10); below.setBounds(98, 608, 420, 10); //鼠标操作 /*mouse.setBackground(Color.yellow); for(int k=0;k<name.length;k++) { System.out.println("this:"+this); person[k].addMouseListener(this); } this:www.huarongdao.game.Hua_Rong_Road [ frame0,0,0,136x39,invalid,layout=java.awt.BorderLayout, title=,resizable,normal,defaultCloseOperation=HIDE_ON_CLOSE, rootPane=javax.swing.JRootPane[,8,31,120x0,invalid, layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0, alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=, preferredSize=],rootPaneCheckingEnabled=true ] */ validate(); } //游戏布局 public void map1() { for(int k=0;k<name.length;k++) { person[k]=new Person(k,name[k]); add(person[k]); } person[0].setBounds(208,108,200,200);//曹操 //ImageIcon caocao=new ImageIcon("C:/Users/liuhu/Desktop/三国头像/caocao.jpg"); //src//images//a.gif ImageIcon caocao=new ImageIcon("images//caocao.jpg"); caocao.setImage(caocao.getImage().getScaledInstance(200,200,Image.SCALE_DEFAULT )); person[0].setIcon(caocao); person[1].setBounds(208,308,200,100);//关羽 ImageIcon guanyu=new ImageIcon("images//guanyu.jpg"); guanyu.setImage(guanyu.getImage().getScaledInstance(200,100,Image.SCALE_DEFAULT )); person[1].setIcon(guanyu); person[2].setBounds(108,308,100,200);//张飞 ImageIcon zhangfei=new ImageIcon("images//zhangfei.jpg"); zhangfei.setImage(zhangfei.getImage().getScaledInstance(100,200,Image.SCALE_DEFAULT )); person[2].setIcon(zhangfei); person[3].setBounds(408,308,100,200);//黄忠 ImageIcon huangzhong=new ImageIcon("images//huangzhong.jpg"); huangzhong.setImage(huangzhong.getImage().getScaledInstance(100,200,Image.SCALE_DEFAULT )); person[3].setIcon(huangzhong); person[4].setBounds(108,108,100,200);//马超 ImageIcon machao=new ImageIcon("images//machao.jpg"); machao.setImage(machao.getImage().getScaledInstance(100,200,Image.SCALE_DEFAULT )); person[4].setIcon(machao); person[5].setBounds(408,108,100,200);//赵云 ImageIcon zhaoyun=new ImageIcon("images//zhaoyun.jpg"); zhaoyun.setImage(zhaoyun.getImage().getScaledInstance(100,200,Image.SCALE_DEFAULT )); person[5].setIcon(zhaoyun); person[6].setBounds(108,508,100,100);// ImageIcon bing1=new ImageIcon("images//daqiao.jpg"); bing1.setImage(bing1.getImage().getScaledInstance(100,100,Image.SCALE_DEFAULT )); person[6].setIcon(bing1); person[7].setBounds(408,508,100,100); ImageIcon bing2=new ImageIcon("images//xiaoqiao.jpg"); bing2.setImage(bing2.getImage().getScaledInstance(100,100,Image.SCALE_DEFAULT )); person[7].setIcon(bing2); person[8].setBounds(208,408,100,100); ImageIcon bing3=new ImageIcon("images//diaocan.jpg"); bing3.setImage(bing3.getImage().getScaledInstance(100,100,Image.SCALE_DEFAULT )); person[8].setIcon(bing3); person[9].setBounds(308,408,100,100); ImageIcon bing4=new ImageIcon("images//zhenji.jpg"); bing4.setImage(bing4.getImage().getScaledInstance(100,100,Image.SCALE_DEFAULT )); person[9].setIcon(bing4); } 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)//下键 gok(man,below); if(e.getKeyCode()==KeyEvent.VK_UP)//上键 gok(man,above); if(e.getKeyCode()==KeyEvent.VK_LEFT)//左键 gok(man,left); if(e.getKeyCode()==KeyEvent.VK_RIGHT)//右键 gok(man,right); } //键盘模式下的移动 public void gok(Person man,JButton direction){ cnt++; message.setText("当前步数:"+cnt); boolean move=true;//可以移动 Rectangle manRect=man.getBounds(); int x=man.getBounds().x; int y=man.getBounds().y; if(direction==below) y=y+100; else if(direction==above) y=y-100; else if(direction==left) x=x-100; else if(direction==right) x=x+100; 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)){ //intersects为矩形类的一个方法,可以判断是否相交 for(Person man2:person){//遍历数组 if(goc(man2,direction)==true){ return; } } move=false; } } if(manRect.intersects(directionRect)){ for(Person man2:person){ if(goc(man2,direction)==true){ return; } } move=false; } if(move==true) { man.setLocation(x,y); } int cx,cy;//曹操的位置 cx=person[0].getBounds().x; cy=person[0].getBounds().y; if(cx==208&&cy==208) { win(); return ; } } public void win() { JOptionPane.showMessageDialog(this, "恭喜少侠,成功帮曹操脱险,日后必大富大贵!\n" + "操作"+cnt+"步.震惊天下!"); JButton winn=new JButton(); ImageIcon winner=new ImageIcon("timg (1).gif"); winn.setIcon(winner); winn.setBounds(108,108,400,500); add(winn); setVisible(true); for(int k=0;k<name.length;k++) this.remove(person[k]); } //判断是否可以进行移动 public boolean goc(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=y+100; else if(direction==above) y=y-100; else if(direction==left) x=x-100; else if(direction==right) x=x+100; 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); return move; } public void gom(Person man,JButton direction){ cnt++; message.setText("当前步数:"+cnt); boolean move=true;//可以移动 Rectangle manRect=man.getBounds(); int x=man.getBounds().x; int y=man.getBounds().y; if(direction==below) y=y+100; else if(direction==above) y=y-100; else if(direction==left) x=x-100; else if(direction==right) x=x+100; 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); int cx,cy;//曹操的位置 cx=person[0].getBounds().x; cy=person[0].getBounds().y; if(cx==208&&cy==208)//正确位置应该为408,这里为了快速结束游戏,设置较为简单 { win(); return ; } } @Override //重新开始新的一局游戏 public void actionPerformed(ActionEvent e) { JButton b=(JButton)e.getSource(); System.out.println("B等于:"+b); if(b==restart) { dispose(); new Hua_Rong_Road(); } if(b==about) { JOptionPane.showMessageDialog(this, "华容道游戏取自著名的三国故事,曹操在赤壁大战中被\n" + "刘备和孙权的“苦肉计”、“火烧连营”打败,被迫退逃到华容道,又遇上诸葛亮的伏兵,\n" + "关羽为了报答曹操对他的恩情,明逼实让,终于帮助曹操逃出了华容道。\n" + "曹操逃出华容道的最大障碍是关羽,关羽立马华容道,一夫当关,万夫莫开。\n" + "关羽与曹操当然是解开这一游戏的关键。\n" + "四个刘备军兵是最灵活的,也最容易对付,如何发挥他们的作用也要充分考虑周全。\n" + "“华容道”有一个带二十个小方格的棋盘,代表华容道。\n" + "棋盘下方有一个两方格边长的出口,是供曹操逃走的。" + ""); } if(b==help) { JOptionPane.showMessageDialog(this, "胜利条件:曹操到达地图中下方位置!\n" + "点击开始游戏后,先在上方选择游戏方式\n" + "键盘操作:使用小键盘的上下左右方向键控制角色的移动\n" + "精确操作:键盘操作模式下,先用鼠标点击某个角色,然后使用方向键进行移动。\n" + "鼠标操作:玩家通过点击当前角色人物的不同位置进行相应移动。\n" + "注意,不能往左下,右下,左上,右上进行移动。\n" + "选择完成操作方式中途尽量不要更换", "开始之前必看", WARNING_MESSAGE); } if(b==key) { b.setBackground(Color.green); for(int k=0;k<name.length;k++) { person[k].addKeyListener(this); } person[9].requestFocus();//获取焦点 } if(b==mouse) { b.setBackground(Color.yellow); for(int k=0;k<name.length;k++){ System.out.println("this:"+this); person[k].addMouseListener(this); } } if(b==begin) { b.setBackground(Color.yellow); this.remove(begin); this.remove(star); map1(); } } @Override public void mouseClicked(MouseEvent e) { // TODO Auto-generated method stub } @Override 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&&x>w/3&&x<(w*2)/3) { gom(man,below);//下面 } if(y<h/2&&x>w/3&&x<(w*2)/3) { gom(man,above);//上面 } if(x<w/2&&y>h/3&&y<(h*2)/3) { gom(man,left);//左 } if(x>w/2&&y>h/3&&y<(h*2)/3) { gom(man,right);//右 } } @Override public void mouseReleased(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseEntered(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseExited(MouseEvent e) { // TODO Auto-generated method stub } }
最近下载更多