设计思想:
主要用数据结构中遍历的思想,按照一定次序访问,不通则回溯。改程序已经做成界面版,在消灭星星中运用。
源代码 :
package star;
import java.awt.Component;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class Star extends JFrame implements ActionListener{
int[][] random;
JButton[][] star;
int[][] visited;//用于判断是否被访问过若未被访问过为0访问过为1需要回溯则为3
JLabel back;
public Star() {
// TODO Auto-generated constructor stub
this.setTitle("消灭星星");
ImageIcon im=new ImageIcon("5.jpg");
Image image=im.getImage();//对窗体图标的设置
this.setIconImage(image);
this.setSize(515, 710);
this.setLocation(100, 0);
this.setLayout(null);//窗体设置,布局为空
Container con=this.getContentPane();//加一个容器
JPanel panel=new JPanel();//添加一个面板把控件都放在面板上
con.add(panel);
panel.setSize(500, 700);
panel.setLocation(0, 0);
panel.setLayout(null);//设置为网格布局
ImageIcon ii=new ImageIcon("7.jpg");//添加背景图片
back=new JLabel(ii);
back.setSize(500, 700);
back.setLocation(0, 0);
panel.add(back);
random=new int[10][10];//把产生的随机数存入二维矩阵二维矩阵数字元素和图片名称相对应
star=new JButton[10][10];//申请按钮矩阵
Random ran=new Random();//产生随机数用于显示随机图片
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
{
random[i][j]=ran.nextInt(4)+1;
}
}
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
{
String str=Integer.toString(random[i][j]);//把产生的随机整肃转化为字符串类型
String stri=str+".jpg";//和图片格式连接 生成"x.jpg"的字符串
ImageIcon icon=new ImageIcon(stri);//实例化图片
star[i][j]=new JButton(icon);//实例化按钮
star[i][j].setSize(50, 50);//按钮的位置大小的设置
star[i][j].setLocation(50*i, 50*j+180);
star[i][j].setVisible(true);//图片设置为可见性
star[i][j].addActionListener((ActionListener) this);
back.add(star[i][j]);//加入按钮,只有把按钮放在背景上才不会出现 只有当鼠标放在按钮上才显示按钮
}
}
visited=new int[10][10];//实例化存储访问性的数组
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
{
visited[i][j]=0;//初始化设置为0表示均未访问
}
}
}
/**
* @param args
*/
public static void main(final String[] args) {
// TODO Auto-generated method stub
Star s=new Star();
s.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
{
if(e.getSource()==star[i][j])
{
int a=i;
int b=j;
star[i][j].setVisible(false);
visited[a][b]=1;
int count=1;
boolean flag=true;
while(flag==true)
{//按照左下右上的顺序 visited[][]为0表示没被访问过1表示访问过3表示访问过并且不需要回溯
if(b-1>=0&&random[a][b]==random[a][b-1]&&visited[a][b-1]==0)
{
visited[a][b-1]=1;
b=b-1;
count++;
star[a][b].setVisible(false);
}
else if(a+1<=9&&random[a][b]==random[a+1][b]&&visited[a+1][b]==0)
{
visited[a+1][b]=1;
a=a+1;
count++;
star[a][b].setVisible(false);
}
else if(b+1<=9&&random[a][b]==random[a][b+1]&&visited[a][b+1]==0)
{
visited[a][b+1]=1;
b=b+1;
count++;
star[a][b].setVisible(false);
}
else if(a-1>=0&&random[a][b]==random[a-1][b]&&visited[a-1][b]==0)
{
visited[a-1][b]=1;
a=a-1;
count++;
star[a][b].setVisible(false);
}
else//都不满足开始回溯
{
if(b-1>=0&&random[a][b-1]==random[a][b]&&visited[a][b-1]==1)
{
visited[a][b]=3;
b=b-1;
count++;
System.out.println(a+","+b);
}
else if(a+1<=9&&random[a+1][b]==random[a][b]&&visited[a+1][b]==1)
{
visited[a][b]=3;
a=a+1;
count++;
System.out.println(a+","+b);
}
else if(b+1<=9&&random[a][b+1]==random[a][b]&&visited[a][b+1]==1)
{
visited[a][b]=3;
b=b+1;
count++;
System.out.println(a+","+b);
}
else if(a-1>=0&&random[a-1][b]==random[a][b]&&visited[a-1][b]==1)
{
visited[a][b]=3;
a=a-1;
count++;
System.out.println(a+","+b);
}
else
{
System.out.println("所有星星已被消灭完!");
flag=false;
}
}
}
}
}
}
}
}