⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 drawpanel.java

📁 一个简单的汉诺塔游戏
💻 JAVA
字号:
import java.awt.*;
import javax.swing.JPanel;
public class DrawPanel extends JPanel                //图形处理,画图类
{
	//用于设置画图面板布局方式
    BorderLayout borderLayout1 = new BorderLayout();
    
    //声明布尔型变量v1、v2、v3,用来控制哪个杆被选择,值为true的,对应序号的杆被选
    boolean v1 = true,v2 = false,v3 = false;
    
    //声明用于存储盘子总数的变量plate_num
    int plate_num;
    SuperPlate superPlate[];
    
    //声明主类对象
    MainFrame mainframe;
    
    //声明三个盘子类SuperPlate对象数组,用来分别保存三个杆上的盘子对象
    SuperPlate superplate1[];                  		 //柱1上盘子对象
    SuperPlate superplate2[];                        //柱2上盘子对象
    SuperPlate superplate3[];                        //柱3上盘子对象
    
    //声明控制游戏状态的变量:
    //win判断是否取胜,start判断游戏是否开始,choose判断是否已选择等级
    boolean start=false,win=false,choose=false;  
    
    //声明变量winNum,用来存储最右边杆上的盘子数
    int winNum;
    
    //用于记录移动盘子次数
    int press_num;                                   

    //构造方法,并将主类对象作为参数传递进来
    public DrawPanel(MainFrame mainframe)
    {
    	//初始化面板布局
        this.setLayout(borderLayout1);
        
        //获取主类对象并保存
        this.mainframe = mainframe;
    }

    //画图方法
    public void paintComponent(Graphics g)              
    {
    	//获取Graphics2D对象g_2d,从而进行2D画图
        Graphics2D g_2d = (Graphics2D)g;
        
        //用白色清屏
        g_2d.setColor(Color.WHITE);
        g_2d.clearRect(0,0,400,400);
        
        //游戏界面中,设置说明性文字的字体、颜色、位置及内容
        BasicStroke bs2 = new BasicStroke(7f,BasicStroke.CAP_SQUARE,BasicStroke.JOIN_MITER);
        g_2d.setStroke(bs2);
        g_2d.setColor(Color.BLUE);
        g_2d.drawLine(50,310,350,310);
        g_2d.setColor(Color.DARK_GRAY);
        g_2d.drawString("说明:光标<左><右>键选择柱子,<回车>键移动盘子",30,330);
        
        //游戏开始前,未选定游戏等级提示
        if(choose == true)                               
        {
            g_2d.setColor(Color.RED);
            g_2d.drawString("请选择游戏等级",30,30);
        }
        
        //柱1(最左边杆上)被选定画图
        if(v1 == true)                                   
        {
        	//用红色画出直线,表示被选中杆
            g_2d.setColor(Color.RED);
            g_2d.drawLine(100,303,100,100);
            g_2d.setColor(Color.BLUE);
            g_2d.drawLine(200,303,200,100);
            g_2d.drawLine(300,303,300,100);
        }
        
        //柱2(中间杆上)被选定画图
        else if(v2 == true)                            
        {
        	//用红色画出直线,表示被选中杆
            g_2d.setColor(Color.RED);
            g_2d.drawLine(200,303,200,100);
            g_2d.setColor(Color.BLUE);
            g_2d.drawLine(100,303,100,100);
            g_2d.drawLine(300,303,300,100);
        }
        
        //柱2(最右边杆上)被选定画图
        else if(v3 == true)                            
        {
        	//用红色画出直线,表示被选中杆
            g_2d.setColor(Color.RED);
            g_2d.drawLine(300,303,300,100);
            g_2d.setColor(Color.BLUE);
            g_2d.drawLine(100,303,100,100);
            g_2d.drawLine(200,303,200,100);
           }
        
        //若游戏开始,则画盘子
        if(start == true)                               
        {
        	    //使用直线表示所画盘子,设置盘子的颜色和画盘子直线的样式
                g_2d.setColor(Color.GREEN);
                BasicStroke bs1 = new BasicStroke(8f,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND);
                g_2d.setStroke(bs1);
                
                //若柱1上有盘子时,画柱1上的盘子
                if(mainframe.s1.isEmpty() == false)               
                {
                  //按循环画出柱1上每一个盘子,
                  for(int i = 0; i < mainframe.s1.size(); i++)
                  {
                	 //画盘子左半边直线
                     g_2d.drawLine(superplate1[i].plate_x,
                                   superplate1[i].plate_y,
                                   superplate1[i].plate_x - superplate1[i].plate_width,
                                   superplate1[i].plate_y);
                     //画盘子右半边直线
                     g_2d.drawLine(superplate1[i].plate_x,
                                   superplate1[i].plate_y,
                                   superplate1[i].plate_x + superplate1[i].plate_width,
                                   superplate1[i].plate_y);
                    }
                }
                
                //若柱2上有盘子时,画柱2上的盘子
                if(mainframe.s2.isEmpty() == false)                
                {
                    for(int i = 0; i < mainframe.s2.size(); i++)
                    {
                        g_2d.drawLine(superplate2[i].plate_x,
                                      superplate2[i].plate_y,
                                      superplate2[i].plate_x -
                                      superplate2[i].plate_width,
                                      superplate2[i].plate_y);
                        g_2d.drawLine(superplate2[i].plate_x,
                                      superplate2[i].plate_y,
                                      superplate2[i].plate_x +
                                      superplate2[i].plate_width,
                                      superplate2[i].plate_y);
                    }
                }
                
                //若柱3上有盘子时,画柱3上的盘子
                if(mainframe.s3.isEmpty() == false)                //画柱3上的盘子
                {
                    for(int i = 0; i < mainframe.s3.size(); i++)
                    {
                        g_2d.drawLine(superplate3[i].plate_x,
                                      superplate3[i].plate_y,
                                      superplate3[i].plate_x -
                                      superplate3[i].plate_width,
                                      superplate3[i].plate_y);
                        g_2d.drawLine(superplate3[i].plate_x,
                                      superplate3[i].plate_y,
                                      superplate3[i].plate_x +
                                      superplate3[i].plate_width,
                                      superplate3[i].plate_y);
                    }
                }
        }
        
        //在游戏界面上画游戏中,移动盘子次数的显示
        g_2d.setColor(Color.BLUE);
        g_2d.drawString("移动盘子次数为:"+String.valueOf(press_num)+"次",30,90);
        
        //当游戏胜利后,画游戏胜利画面
        if(win == true)                                             //游戏胜利画面
        {
        	//设置字体
            Font f = new Font("Dialog",Font.ITALIC,20);
            
            //清屏
            g_2d.setColor(Color.WHITE);
            g_2d.clearRect(0,0,400,400);
            
            g_2d.setColor(Color.BLUE);
            g_2d.setFont(f);
            g_2d.drawString("Well!Finished!!!",120,200);
            g_2d.drawString("移动盘子次数为:"+String.valueOf(press_num)+"次",120,250);
        }
    }

    //初始化SuperPlate对象,用于初始化盘子数组对象
    public void setPlateNum(int x)                                
    {
        this.plate_num = x;
        superplate1 = new SuperPlate[plate_num];
        superplate2 = new SuperPlate[plate_num];
        superplate3 = new SuperPlate[plate_num];
    }

    //数据更新方法
    public void updata()                                           
    {
    	//判断柱1(最左边杆上)是否有盘子,若有则取出全部盘子对象
        if(mainframe.s1.isEmpty() == false)
        {
        	//从vector数组中取对象
            for (int i = 0; i < mainframe.s1.size(); i++) 
            {        
                superplate1[i] = null;
                superplate1[i] = (SuperPlate) mainframe.s1.elementAt(i);
            }
        }
        
        //判断柱2(中间杆上)是否有盘子,若有则取出全部盘子对象
        if(mainframe.s2.isEmpty() == false)
        {
            for (int i = 0;i < mainframe.s2.size(); i++)
            {
                superplate2[i] = null;
                superplate2[i] = (SuperPlate) mainframe.s2.elementAt(i);
            }
        }
        
        //判断柱3(最右边杆上)是否有盘子,若有则取出全部盘子对象
        if(mainframe.s3.isEmpty() == false)
        {
            for (int i = 0;i < mainframe.s3.size(); i++) {
                superplate3[i] = null;
                superplate3[i] = (SuperPlate) mainframe.s3.elementAt(i);
            }
        }
        
        //判断游戏胜利条件,当柱3上盘子总数为plate_num,设置控制游戏胜利的变量为true
        if(winNum == plate_num)                             
        {
            win = true;
            repaint();
        }
        repaint();
    }

    //取得柱3上的盘子总数
    public void getWinNum(int t)                             
    {
        this.winNum = t;
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -