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