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

📄 ninegrids.java

📁 java实现的 九宫 九个格子,1--8 初始化乱序 每次移动一个数字 最终排列成功
💻 JAVA
字号:
import java.awt.event.*;import javax.swing.*;import java.awt.*;import java.lang.Thread.*;public class NineGrids  extends JFrame implements ActionListener,Runnable{  public static int[] arr={7,1,2,3,4,5,6,8,0};  public static int n=0;  public static JButton [] jButton = new JButton[12];  public static JPanel jPanel = new JPanel();  public static boolean backturn=false,flag=false;  public static int location=0,locanum=2,prolocation=0,frelocation=8;  public static Thread sta;  public NineGrids()//创建图形化界面  {    this.setSize(375,420);    this.setLocation(200,200);    setTitle("八数码");    Container contentPane = getContentPane();    contentPane.setLayout(null);    contentPane.add(jPanel);    contentPane.setBackground(Color.RED);    jPanel.setSize(200,200);    jPanel.setLayout(new GridLayout(3,3));    jPanel.setLocation(75,20);    for(int i=0;i<9;i++)      jButton[i] = new JButton(Integer.toString(arr[i]));    jPanel.add(jButton[0]);    jPanel.add(jButton[1]);    jPanel.add(jButton[2]);    jPanel.add(jButton[7]);    jPanel.add(jButton[8]);    jPanel.add(jButton[3]);    jPanel.add(jButton[6]);    jPanel.add(jButton[5]);    jPanel.add(jButton[4]);    jButton[9] = new JButton("重置");    jButton[10] = new JButton("开始");    jButton[11] = new JButton("下一步");    contentPane.add(jButton[9]);    jButton[9].setSize(75,40);    jButton[9].setLocation(45,300);    contentPane.add(jButton[10]);    jButton[10].setSize(75,40);    jButton[10].setLocation(175,300);    contentPane.add(jButton[11]);    jButton[11].setSize(75,40);    jButton[11].setLocation(275,300);    jButton[9].addActionListener(this);    jButton[10].addActionListener(this);    jButton[11].addActionListener(this);  }  public static void main(String[] args)  {   NineGrids memo = new NineGrids();    memo.setVisible(true);    sta = new Thread(memo);  }  public static void Randomer()//随机函数用于生成8个数字  {    int temp=(int)(Math.random()*8)+1,i=0;    boolean flag;    while(i<8)    {       flag=true;       for(int j=0;j<i;j++)         if(arr[j]==temp)           flag=false;       if(flag)       {         arr[i]=temp;         i++;       }       temp=(int)(Math.random()*8)+1;    }    arr[8]=0;  }  public static boolean chack()//检验是否达到要求  {    int location=0;    for(int i=0;i<8;i++)      if(arr[i]==1)        location=i;    for(int i=location;i<location+7;i++)      if(arr[i%8]>arr[(i+1)%8])        return false;    return true;  }  public static void turnRight(int location)  {    arr[8]=arr[(location+1)%8];    arr[(location+1)%8]=0;    gifprint();    arr[(location+1)%8]=arr[location];    arr[location]=0;    gifprint();    arr[location]=arr[(location+7)%8];    arr[(location+7)%8]=0;    gifprint();    arr[(location+7)%8]=arr[8];    arr[8]=0;    gifprint();  }  public static void leftturn(int frelocation,int prolocation)  {//当prolocation为奇数位时,空格按照顺时针的顺序旋转到prolocation的位置上    if(frelocation<prolocation)//不需考虑7到0的位置变化      for(int i = frelocation; i < prolocation; i++)      {        arr[i % 8] = arr[ (i + 1) % 8];        arr[ (i + 1) % 8] = 0;        gifprint();      }    else//需要考虑位置变化造成的坐标差值      for (int i = frelocation; i < prolocation+8; i++)      {        arr[i % 8] = arr[ (i + 1) % 8];        arr[ (i + 1) % 8] = 0;        gifprint();      }    arr[prolocation] = arr[8];    arr[8] = 0;    gifprint();  }  public static void rightturn(int frelocation,int prolocation)  {//当prolocation为偶数位时,空格按照逆时针的顺序旋转到(prolocation+1)%8的位置上    if(frelocation>prolocation)      for(int i=frelocation;i>prolocation+1;i--)      {        arr[i]=arr[i-1];        arr[i-1]=0;        gifprint();      }    else    {      int begin = -frelocation;      for (int i = begin; i < 0; i++)      {        arr[frelocation] = arr[frelocation - 1];        arr[frelocation - 1] = 0;        frelocation--;        gifprint();      }      arr[0]=arr[7];      arr[7]=0;      frelocation=7;      gifprint();      for(int i=frelocation;i>prolocation+1;i--)      {        arr[i]=arr[i-1];        arr[i-1]=0;        gifprint();      }    }    arr[(prolocation+1)%8]=arr[8];    arr[8]=0;    gifprint();    frelocation=prolocation;  }  public static void gifprint()  { /*   System.out.println("现在的阵列数据为");    for(int i=0;i<3;i++)      System.out.print(arr[i]+" ");    System.out.println();    System.out.print(arr[7]+" ");    System.out.print(arr[8]+" ");    System.out.println(arr[3]+" ");    for(int i=6;i>3;i--)      System.out.print(arr[i]+" ");    System.out.println();*/    n++;    for(int i =0;i<9;i++)    {      jButton[i].setText(Integer.toString(arr[i]));      if(arr[i]==0)      {        jButton[i].setVisible(false);      }    }    try    {      sta.suspend();    }    catch(Exception e)    {}    for(int i=0;i<9;i++)      jButton[i].setVisible(true);  }  public void anoth(int frelocation,int prolocation)  {    if((frelocation+7)%8==prolocation)//顺序完成前的插8工作    {      for(int i=frelocation;i>frelocation-6;i--)      {        arr[(i+8)%8]=arr[(i+7)%8];        arr[(i+7)%8]=0;        gifprint();      }      arr[(frelocation+2)%8]=arr[8];      arr[8]=0;      gifprint();    }    else    {      if(frelocation<prolocation)      {        for(int i=frelocation;i<frelocation+((prolocation-frelocation-1)/2+1)*2;i++)        {          arr[i]=arr[(i+1)%8];          arr[(i+1)%8]=0;          gifprint();        }      }      else      {        for(int i=frelocation;i<frelocation+((prolocation+7-frelocation)/2+1)*2;i++)        {          arr[i%8]=arr[(i+1)%8];          arr[(i+1)%8]=0;          gifprint();        }      }      arr[prolocation/2*2+1]=arr[8];      arr[8]=0;      gifprint();      arr[8]=arr[frelocation];      arr[frelocation]=0;      gifprint();      prolocation=(prolocation+7)%8;      if(((prolocation+1)%2)==0)      {        leftturn(frelocation,prolocation);      }      else      {        rightturn(frelocation,prolocation);      }    }  }  public void actionPerformed(ActionEvent e)  {    String action =e.getActionCommand();    if(action.equals("重置"))    {      Randomer();      gifprint();    }    else if(action.equals("开始"))    {      sta.start();    }    else if(action.equals("下一步"))    {      sta.resume();    }  }  /**   * run   */  public void run()  {    backturn=false;    flag=false;    location=0;    locanum=2;    prolocation=0;    frelocation=8;    for(int i=0;i<8;i++)    {      if(arr[i]==1)      {        location=i;        prolocation=i;      }    }    gifprint();    while(!flag&&locanum<=8)    {      frelocation=8;      backturn=false;      if(arr[(prolocation+1)%8]==locanum)      {        locanum++;        prolocation=(prolocation+1)%8;      }      else//prolocation的下一个位置不是locanum的情况      {        for(int i=0;i<8;i++)//找出locanum的位置          if(arr[i]==locanum)          {            location = i;            break;          }        for(int i=0;i<(location+1)%2;i++)//可选择的四角旋转保证locanum在坐标的2,4,6,8        {          if(arr[(location+1)%8]==1)          {            backturn=true;            break;          }          turnRight(location);          location=(location+1)%8;        }        if(backturn)        {          frelocation=(location+7)%8;          arr[8]=arr[frelocation];          arr[frelocation]=0;          gifprint();          anoth(frelocation,prolocation);        }        else        {          arr[8]=locanum;          arr[location]=0;          frelocation=location;          gifprint();//把插入数引入中间空位          if(((prolocation+1)%2)==0)          {            leftturn(frelocation,prolocation);          }          else          {            rightturn(frelocation,prolocation);          }        }        for(int i=0;i<8;i++)          if(arr[i]==locanum)            prolocation=i;        locanum++;      }      flag=chack();    }    System.out.print(n);  }}

⌨️ 快捷键说明

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