java实现简陋五子棋(虽然bug很多,但会继续改进)

import java.util.InputMismatchException;
import java.util.Random;
import java.util.Scanner;
import javax.swing.JOptionPane;

/**
 * 五子棋小游戏.可供双人对战和人机对战(人机对战的机是随机输入,未加如入精确算法)和棋的情况没有做判断。
 * <p>
 * 在15*15的棋盘上,获胜的情况总共有572种。<br>
 * 在一场五子棋的游戏中,计算机必须要知道有哪些的获胜组合,因此我们必须求得获胜组合的总数。<br>
 * (1)计算水平方向的获胜组合数,每一行的获胜组合是:11种,共15行,所以水平方向的获胜组合数为:11*15=165. <br>
 * (2)计算垂直方向的获胜组合总数,每一列的获胜组合是:11种,共15列,所以垂直方向的获胜组合数为:11*15=165.<br>
 * (3)计算正对角线方向的获胜组合总数,正对角线上的获胜组合总数为11+(10+9+...+2+1)*2=121.<br>
 * (4)计算反对角线方向的获胜组合总数,反对角线上的获胜组合总数为11+(10+9+...+2+1)*2=121.<br>
 * 所以,获胜的总数有165+165+121+121=572.
 * 
 * @author frank
 *
 */
public class NewGoBang
{
	// 静态代码块
	static
	{
		System.out.println("欢迎来到五子棋世界!");
	}
	public final static int size = 15;
	String[][] board = new String[size][size];
	boolean flag = true;
	// 创建一个random随机对象。
	Random ran = new Random();

	/**
	 * 画出棋盘。"十"
	 */
	public void initBoard()
	{
		for (int x = 0; x < board.length; x++)
		{
			for (int y = 0; y < board.length; y++)
			{
				board[x][y] = "十";// ╂ ,╋
			}
		}
		printArray(board);
	}

	/**
	 * 判断棋子是否有五个连续.
	 * 
	 * @param row
	 *            棋子的横坐标
	 * @param column
	 *            棋子的纵坐标
	 * @param str
	 *            字符串数组
	 * @param c
	 *            字符串参数(即是棋子)
	 */
	public void isFive(int row, int column, String[][] str, String c)
	{
		// 横向判断
		int m, L;
		m = 1;
		L = 1;
		while ((column + m) < size && str[row][column + m] == c)
		{
			L++;
			m++;
		}
		m = 1;
		while ((column - m) >= 0 && str[row][column - m] == c)
		{
			L++;
			m++;
		}

		showMessage(L, c);

		// 纵向判断
		m = 1;
		L = 1;
		while ((row + m) < size && str[row + m][column] == c)
		{
			L++;
			m++;
		}
		m = 1;
		while ((row - m) >= 0 && str[row - m][column] == c)
		{
			L++;
			m++;
		}

		showMessage(L, c);


		// 斜向判断
		Italic(row, column, str, c);
	}

	// 斜向判断
	public void Italic(int row, int column, String[][] str, String c)
	{

		int L = 1;// 定义一个指针,超过五个就胜利了。
		int m = 1;
		// 斜向判断
		while ((row + m) < size && (column + m) < size
				&& str[row + m][column + m] == c)
		{
			L++;
			m++;
		}
		m = 1;//m重新置为1;
		while ((row - m) >= 0 && (column - m) >= 0
				&& str[row - m][column - m] == c)
		{
			L++;
			m++;
		}

		showMessage(L, c);


		// 反斜向判断
		m = 1;
		L = 1;
		while ((row + m) < size && (column - m) >= 0
				&& str[row + m][column - m] == c)
		{
			L++;
			m++;
		}
		m = 1;//m重新置为1;
		while ((row - m) >= 0 && (column + m) < size
				&& str[row - m][column + m] == c)
		{
			L++;
			m++;
		}

		showMessage(L, c);


	}

	//判断是否等于五个
	public void showMessage(int point, String c)
	{
		if (point >= 5)
		{
			System.out.println( "恭喜 " + c + " 棋赢了!");
			//可以用下面这句弹出一个对话框,比较美观。			
			//JOptionPane.showMessageDialog(null, "恭喜 " + c + " 棋赢了!");
			//赢了之后当然得结束程序。
			System.exit(0);
		} else
		{
			point = 0;
		}
	}
        /*这里可以选择双人对战或者是人机对战。
            别太兴奋,人机对战只是随机输入的,并没有加入什么核心算法。
            后续有机会我会继续更新的。
        */
	public void show()
	{
		System.out.println("双人对战请输入:1,人机对战请输入2.");
		//利用Scanner输入数据。
		Scanner sc = new Scanner(System.in);
		int option = sc.nextInt();
		//这里可以选择双人对战或者是人机对战。
		switch(option)
		{
		            //双人对战
			case 1:
				while (flag)
				{
					System.out.println("请黑方输入棋子的坐标:(如:1 3)");
					manInput("●");
					System.out.println("请白方输入棋子的坐标:(如:1 3)");
					manInput("○");
				}
				//人机对战
			case 2:
				while (flag)
				{
					System.out.println("请您输入棋子的坐标:(如:1 3)");
					manInput("●");
					System.out.println("电脑下子:");
					computer("○");
				}
			//机机对战,用来快速调试
			case 3: 
				while (flag)
				{
					System.out.println("电脑A下子:");
					computer("●");
					System.out.println("电脑B下子:");
					computer("○");
				}
				
		}
		
	}
	
	//电脑随机下子。
	public boolean computer(String c)
	{
		int row = ran.nextInt(size);
		int column = ran.nextInt(size);
                
		while(board[row][column] != "十")
		{
			row = ran.nextInt(size);
			column = ran.nextInt(size);
		}
		if(board[row][column] == "十")
		{
			System.out.println("(" + row + "," + column + ")");
			board[row][column] = c;
			printArray(board);
			isFive(row, column, board, c);
		}
		else 
			return false;
		return true;
		
		
	}
	//人工下子。输入坐标Coordinate
	private void manInput(String c)// int row,int column
	{
		try
		{
			 Scanner scan = new Scanner(System.in);
			 int row = scan.nextInt();
			 int column = scan.nextInt();

			if (board[row][column] == "十")//row>=0&&column>=0&&row<size&&column<size&&
			{
				System.out.println("(" + row + "," + column + ")");
				board[row][column] = c;
				// 自选字符‘★‘,‘█‘,‘▓‘,‘‘,‘‘●●●‘╋‘‘"●"‘○
				printArray(board);
				isFive(row, column, board, c);
			} else
			{			
			
				System.out.println("该位置已放有棋子,请放到其他位置!");
				manInput(c);
			}
		} catch (ArrayIndexOutOfBoundsException e)
		{		
			System.out.println("超出棋盘位置,请重新输入!");
			manInput(c);
		}
		catch(InputMismatchException e)
		{
                //JOptionPane.showMessageDialog(null, "输入的数不合法,请重新输入!");
			System.out.println("输入的数不合法,请重新输入!");
			manInput(c);
		}
                // System.out.println("我是美丽的调试,我无处不在!");

	}

	// 打印String类型的二维数组
	private void printArray(String[][] arr)
	{
		for (int i = 0; i < arr.length; i++)
		{
			for (int j = 0; j < arr[i].length; j++)
			{
				System.out.print(arr[i][j]);
			}
			System.out.println("");
		}
	}

	public static void main(String[] args)
	{
		NewGoBang gobang = new NewGoBang();
		gobang.initBoard();
		gobang.show();
	}

}


本文出自 “卡暗哩” 博客,请务必保留此出处http://kaanli.blog.51cto.com/6744784/1631302

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。