📄 drawpanel.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 + -