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

📄 numbercal.java

📁 数字游戏_Java版,一个用java写的数字游戏
💻 JAVA
字号:
package com.john.cal3;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

public class NumberCal
{
	private static int index = 1;
	
	private static int[] s_avNum = {1,2,3,4,5,6,7,8,9,0};

	private static PrintWriter pw ;
	
	/**
	 * @param args
	 */
	public static void main(String[] args)
	{

		int [][] n = new int[10][10];
		fillnext(n, 1, 1);
		pw.close();
		
//		int [][] n ={{0,0,0,0,0,0,0,0,0,0},
//		{0,1 ,  2 ,  3  , 4  , 5  , 6  , 7  , 8  , 9 }  ,
//
//		{0,4 ,  5 ,  6  , 7  , 8  , 9,   1 ,  2 , 3}   ,
//
//		{0,7 ,  8 ,  9 ,  1 ,  2 ,  3 ,  4 ,  5 ,  6  } ,
//
//		{0,2  , 1  , 4  , 3  , 6  , 5  , 8 ,  9 ,  7   },
//
//		{0,3  , 0  , 0  , 0 ,  0 ,  0 ,  0 ,  0 ,  0   },
//
//		{0,0   ,0  , 0 ,  0  , 0  , 0  , 0  , 0  , 0   },
//
//		{0,0   ,0  , 0 ,  0  , 0  , 0  , 0  , 0  , 0   },
//
//		{0,0   ,0  , 0 ,  0  , 0  , 0  , 0  , 0  , 0   },
//
//		{0,0   ,0  , 0 ,  0  , 0  , 0  , 0  , 0  , 0   }};

		
//		int [] result = getAvNum(n, 5, 2);
//		System.out.println(result);

	}

	public static void fillnext(int[][] n, int i_x, int i_y)
	{
		
		int x, y;

		int[] avNum;

		avNum = getAvNum(n, i_x, i_y);
		if (avNum == null)
			return;

		for (int i = 0; i < avNum.length; i++)
		{

			int[][] n_new = new int[10][10];
			for (int j = 0; j < n_new.length; j++)
			{
				System.arraycopy(n[j], 0, n_new[j], 0, n.length);
			}

			n_new[i_x][i_y] = avNum[i];
			
			
			if ((i_x == 9) && (i_y == 9))
			{
				printResult(n_new);
				return;
			}
			
			x = i_x + i_y / 9;
			
			if(i_y!=9)
				y = i_y +1;
			else
				y = 1;
			
//			printResult(n_new);
			fillnext(n_new, x, y);
			
		}
	}

	private static void printResult(int[][] n)
	{
//		System.out.println("----------- "+ index +" --------------:"	);
//		printNumbers(n);
		printToFile(n);
	}

	private static int[] getAvNum(int[][] n, int x, int y)
	{
		int[] avBlock;
		int[] avRow;
		int[] avLine;

		avBlock = getAvBlock(n, x, y);
		avRow = getAvRow(n, x);
		avLine = getAvLine(n, y);
		
		int [] temp = new int[10];
		int t_index = 0;
		
		for (int i = 0; i < avRow.length; i++)
		{
			for (int j = 0; j < avLine.length; j++)
			{
				if(avRow[i]==avLine[j])
				{
					for (int k = 0; k < avBlock.length; k++)
					{
						if(avRow[i]==avBlock[k])
						{
							temp[t_index++] =avRow[i];
							break;
						}
					}
					break;
				}
			}

		}

		return getShortArray(temp);
	}

	private static int[] getAvRow(int[][] n, int x)
	{
		int[] temp = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
		for (int i = 1; i < 10; i++)
		{
			temp[n[x][i]] = 0;
		}

		return getShortArray(temp);
	}

	private static int[] getAvLine(int[][] n, int y)
	{
		int[] temp = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
		for (int i = 1; i < 10; i++)
		{
			temp[n[i][y]] = 0;
		}

		return getShortArray(temp);
	}

	// /////////////////////////////s

	private static int[] getShortArray(int[] temp)
	{

		int n_index = 0;
		for (int i = 0; i < temp.length; i++)
		{
			if (temp[i] != 0)
				n_index++;
		}
		if (n_index == 0)
			return null;
		int[] result = new int[n_index];

		n_index = 0;
		for (int i = 0; i < 10; i++)
		{
			if (temp[i] != 0)
				result[n_index++] = temp[i];
		}
		return result;
	}

	private static int[] getAvBlock(int[][] n, int x, int y)
	{
		int[] temp = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
		int z;
		z = getBlockNum(x, y);
		int n_x, n_y;
		n_x = (z - 1) / 3;
		n_y = (z - 1) % 3;

		int n_num = 0;

		for (int j = 1; j < 4; j++)
		{
			for (int k = 1; k < 4; k++)
			{
				n_num = n[n_x * 3 + j][n_y * 3 + k];
				if (n_num != 0)
					temp[n_num] = 0;
			}
		}

		return getShortArray(temp);
	}

	private static int getBlockNum(int x, int y)
	{
		return ((x - 1) / 3) * 3 + (y - 1) / 3 + 1;
	}

	public static boolean isFinished(int[][] n)
	{
		for (int i = 1; i < 10; i++)
		{
			for (int j = 1; j < 10; j++)
			{
				if (n[i][j] == 0)
					return false;
			}
		}
		return true;
	}

	private static void printToFile(int[][] n)
	{
		try
		{
			FileWriter fw = null;

			fw = new FileWriter("d:/date.txt",true);
			BufferedWriter bw = new BufferedWriter(fw);

			pw = new PrintWriter(bw);
			for (int i = 1; i < 10; i++)
			{
				for (int j = 1; j < 10; j++)
				{
					pw.print(n[i][j] + "   ");
				}
				pw.println();
				pw.println();
			}
			pw.println("---------------------------------------: "
					+ index++);
			pw.close();
		} catch (IOException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public static void printNumbers(int[][] n)
	{
		for (int i = 1; i < 10; i++)
		{
			for (int j = 1; j < 10; j++)
			{
				System.out.print(n[i][j] + "   ");
			}
			System.out.println();
			System.out.println();
		}
	}

	public static int[][] cal(int[][] n)
	{
		int[] a_block;
		int[] a_row;
		int[] a_line;

		int[][] newNumber = null;// = new int[10][10];

		for (int i = 1; i < 10; i++)
		{
			for (int x = 1; x < 10; x++)
			{

			}
			a_block = getAvBlock(n, i);
			a_row = getAvRow(n, i);
			a_line = getAvLine(n, i);

			newNumber = fillBlank(n, a_block, a_row, a_line, i);
		}
		return newNumber;
	}

	public static int[] blockHasNum(int[][] n, int num)
	{
		int[] numRecode = new int[10];
		for (int i = 1; i < 10; i++)
		{
			for (int j = 1; j < 4; j++)
			{
				for (int k = 1; k < 4; k++)
				{
					if (n[i * j][k] == num)
						numRecode[i] = 1;
				}
			}
		}
		return null;
	}

	// ///new
	public static int[] getAvBlock(int[][] n, int num)
	{
		int[] numRecode = new int[10];
		for (int i = 1; i < 10; i++)
		{
			int x, y;
			x = (i - 1) / 3;
			y = (i - 1) % 3;
			// if(y!=0)
			// y=2;

			int n_row, n_line;

			for (int j = 1; j < 4; j++)
			{
				for (int k = 1; k < 4; k++)
				{
					n_row = x * 3 + j;
					n_line = y * 3 + k;
					if (n[n_row][n_line] == num)
						numRecode[i] = 1;
				}
			}
		}
		return numRecode;
	}

	public static int[][] fillBlank(int[][] n, int[] block, int[] row,
			int[] line, int num)
	{
		int[][] newNumber = new int[10][10];
		System.arraycopy(n, 0, newNumber, 0, 10);
		for (int i = 1; i < 10; i++)
		{
			if (block[i] == 0)
			{
				int x, y;
				x = (i - 1) / 3;
				y = (i - 1) % 3;

				int n_row, n_line;

				int n_time = 0;
				int n_x = 0, n_y = 0;

				for (int j = 1; j < 4; j++)
				{
					for (int k = 1; k < 4; k++)
					{
						n_row = x * 3 + j;
						n_line = y * 3 + k;
						if ((n[n_row][n_line] == 0) && (row[n_row] == 1)
								&& (line[n_line] == 1))
						{
							n_x = n_row;
							n_y = n_line;
							n_time++;
						}
					}
				}
				if (n_time == 1)
					newNumber[n_x][n_y] = num;
			}
		}
		return newNumber;
	}

	public static boolean isLineHasNum(int[][] n, int line, int num)// 列
	{
		for (int i = 1; i < 10; i++)
		{
			if (n[line][i] == num)
				return true;
		}
		return false;
	}

	public static boolean isRowHasNum(int[][] n, int row, int num)// 行
	{
		for (int i = 1; i < 10; i++)
		{
			if (n[i][row] == num)
				return true;
		}
		return false;
	}
}

⌨️ 快捷键说明

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