Java五子棋游戏——控制台版

Posted 是语呀-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java五子棋游戏——控制台版相关的知识,希望对你有一定的参考价值。

 该项目为Java编程语言编写的五子棋游戏(控制台版),用到二维数组、for循环、if语句、while()语句、Scanner Until包,此项目主要是对数组的使用。该项目的功能有落子、输出棋盘、判断输赢。

代码条:

package edu.qizi.gam;

import java.util.Scanner;

public class GobangTest {
	public static void main(String[] args) {
		int BoardSize = 20;
		// 棋盘的实现
		String[][] board = new String[BoardSize][BoardSize];
		
		for (int i = 0; i < board.length; i++) {
			for (int j = 0; j < board[i].length; j++) {
				board[i][j] = "+";
			}
		}
		//输出棋盘
		PrintBoard(board);
		while(true) {
		//黑棋落子
		System.out.println("黑棋落子");
		BlackMoveLater(board);
//		每下一步黑棋要输出一下棋盘
		PrintBoard(board);
		
//		行判断黑棋
		BlackRow(BoardSize, board);
//		列判断黑棋
		BlackLine(BoardSize, board);
//		自左上--->右下判断黑棋,每次第二个for循环最开始列不变,阶梯逼近左下的方法
		BlackTopLeftToBottomRight_Line(BoardSize, board);
//		自左上--->右下判断黑棋,每次第二个for循环最开始行不变,阶梯逼近右上的方法
		BlackTopLeftToBottomRight_Row(BoardSize, board);
//		自右上--->左下判断黑棋,每次第二个for循环最开始列不变,阶梯逼近右下的方法
		BlackTopRightToBottomLeft_Line(BoardSize, board);
//		自右上--->左下判断黑棋,每次第二个for循环最开始行不变,阶梯逼近左上的方法
		BlackTopRightToBottomLeft_Row(BoardSize, board);
		
		
//		白棋落子
		System.out.println("白棋落子");
		WhiteMoveLater(board);
//		每下一步白棋要输出一下棋盘
		PrintBoard(board);
		
//		行判断白棋
		WhiteRow(BoardSize, board);
//		列判断白棋
		WhiteLine(BoardSize, board);
//		自左上--->右下判断白棋,每次第二个for循环最开始列不变,阶梯逼近左下的方法
		WhiteTopLeftToBottomRight_Line(BoardSize, board);
//		自左上--->右下判断白棋,每次第二个for循环最开始行不变,阶梯逼近右上的方法
		WhiteTopLeftToBottomRight_Row(BoardSize, board);
//		自右上--->左下判断白棋,每次第二个for循环最开始列不变,阶梯逼近右下的方法
		WhiteTopRightToBottomLeft_Line(BoardSize, board);
//		自右上--->左下判断白棋,每次第二个for循环最开始行不变,阶梯逼近左上的方法
		WhiteTopRightToBottomLeft_Row(BoardSize, board);
		} 
	}

下面是实现的方法

//实现棋盘输出的方法
	public static void PrintBoard(String[][] board) {
			for (int i = 0; i < board.length; i++) {
				for (int j = 0; j < board[i].length; j++) {
					System.out.print(	board[i][j]+" ");
				}
				System.out.println();
			}
		}

实现黑棋落子

//	实现黑棋落子的方法
	public static void BlackMoveLater(String[][] board) {
		while(true) {
		Scanner sc1=new Scanner(System.in);
		System.out.println("请输入黑棋落子的横坐标[1---20]:");
		int BlackBoard_x=sc1.nextInt();
		//判断横坐标是否数组越界
		if(BlackBoard_x<1 || BlackBoard_x>20) {
			System.out.println("你输入的坐标范围有误 ,横坐标取1到20,请正确输入:\\n");
			continue;
		}
		Scanner sc2=new Scanner(System.in);
		System.out.println("请输入黑棋落子的纵坐标[1---20]:");
		int BlackBoard_y=sc2.nextInt();
		//判断纵坐标是否数组越界
		if(BlackBoard_y<1 || BlackBoard_y>20) {
			System.out.println("你输入的坐标范围有误,纵坐标取1到20,请正确输入:\\n");
			continue;
		}
		//判断此位置是否可以落入棋子
		if(board[BlackBoard_x-1][BlackBoard_y-1]=="○") {
			System.out.println("此位置已经有棋子了,请你将棋子下到空位置");
			continue;
		}else {
			 board[BlackBoard_x-1][BlackBoard_y-1]="●";
			 break;
		}
		}
	}

实现白棋落子

//	实现白棋落子的方法
	public static void WhiteMoveLater(String[][] board) {
		while(true) {
		Scanner sc1=new Scanner(System.in);
		System.out.println("请输入白棋落子的横坐标[1---20]:");
		int WhiteBoard_x=sc1.nextInt();
		//判断横坐标是否数组越界
		if(WhiteBoard_x<1 || WhiteBoard_x>20) {
			System.out.println("你输入的坐标范围有误 ,横坐标取1到20,请正确输入:\\n");
			continue;
		 }
		Scanner sc2=new Scanner(System.in);
		System.out.println("请输入白棋落子的纵坐标[1---20]:");
		int WhiteBoard_y=sc2.nextInt();
		//判断纵坐标是否数组越界
		if(WhiteBoard_y<1 || WhiteBoard_y>20) {
			System.out.println("你输入的坐标范围有误,纵坐标取1到20,请正确输入:\\n");
			continue;
			}
		//判断此位置是否可以落入棋子
		if(board[WhiteBoard_x-1][WhiteBoard_y-1]=="●") {
			System.out.println("此位置已经有棋子了,请你将棋子下到空位置\\n");
			continue;
		}else {
			board[WhiteBoard_x-1][WhiteBoard_y-1]="○";
			break;
		}
		}
	}

判定输赢以黑棋为例(有六个方法),下面一一列举

//	实现行判断黑棋子
	public static void BlackRow(int BoardSize, String[][] board) {
//		先定义一个数number,以此来计数
		int number=0;
//		一行一行的读取数组中的元素
		for(int row=0;row<BoardSize;row++) {
			for(int line=0;line<BoardSize;line++) {
//				如果此行中有元素为黑棋则number+1
				if(board[row][line]=="●") {
					number++;
				}
//				当number为5的时候则黑棋一方的胜
				while(number==5) {
					System.out.println("黑棋方胜!");
		    		//胜出后输出棋盘
		    		for ( row = 0; row < board.length; row++) {
		    			for ( line = 0; line < board[row].length; line++) {
		    				System.out.print(	board[row][line]+" ");
		    			}
		    			System.out.println();
		    		}
		    		//胜后退出系统
		    		System.exit(0);
				}
//				如果此行中虽有五个黑棋但是并不相连,不能说是黑棋方胜,需将number置为0
				if(board[row][line]=="○"|| board[row][line]=="+") {
					number=0;
				}
			}
//			每一行读取数组元素后未能分出胜负需要将number置为0
			number=0;
		}
	}

展现第一个方法的结果

 第二个方法代码

//	实现列判断黑棋子
	public static void BlackLine(int BoardSize, String[][] board) {
//		先定义一个数number,以此来计数
		int number=0;
//		一列一列的读取数组中的元素
		for(int Line=0;Line<BoardSize;Line++) {
			for(int row=0;row<BoardSize;row++) {
//				如果此列中有元素为黑棋则number+1
				if(board[row][Line]=="●") {
					number++;
				}
//				当number为5的时候则黑棋一方的胜
				while(number==5) {
					System.out.println("黑棋方胜!");
		    		//胜出后输出棋盘
		    		for ( row = 0; row < board.length; row++) {
		    			for ( Line = 0; Line < board[row].length; Line++) {
		    				System.out.print(	board[row][Line]+" ");
		    			}
		    			System.out.println();
		    		}
		    		//胜后退出系统
		    		System.exit(0);
				}
//				如果此列中虽有五个黑棋但是并不相连,不能说是黑棋方胜,需将number置为0
				if(board[row][Line]=="○"|| board[row][Line]=="+") {
					number=0;
				}
			}
//			每一列读取数组元素后未能分出胜负需要将number置为0
			number=0;
		}
	}

 展现第二个方法的结果

 

 第三个方法代码

//	实现自左上--->右下判断黑棋,每次第二个for循环最开始列不变,阶梯逼近左下的方法
	public static void BlackTopLeftToBottomRight_Line(int BoardSize, String[][] board) {
//		先定义一个数number,以此来计数
		int number=0;
//		每当执行第二个for循环的时候列line总是从0开始
		for(int row=0;row<BoardSize;row++) {
//			执行这个for循环的时候每一次行+1,列+1,数据元素呈现阶梯分布,阶梯逼近左下
			for(int line=0,i=row;line<BoardSize-row;line++,i++) {
//				如果此阶梯中有元素为黑棋则number+1
				if(board[i][line]=="●") {
					number++;
				}
//				当number为5的时候则黑棋一方的胜
				while(number==5) {
					System.out.println("黑棋方胜!");
		    		//胜出后输出棋盘
		    		for ( row = 0; row < board.length; row++) {
		    			for ( line = 0; line < board[i].length; line++) {
		    				System.out.print(	board[row][line]+" ");
		    			}
		    			System.out.println();
		    		}
		    		//胜后退出系统
		    		System.exit(0);
				}
//				如果此阶梯中虽有五个黑棋但是并不相连,不能说是黑方胜,需将number置为0
				if(board[i][line]=="○"|| board[i][line]=="+") {
					number=0;
				}
			}
//			每当第二个for循环完毕后需要将number置为0
			number=0;
		}
	}

展现第三种方法的结果

 第四个方法代码

//	实现自左上--->右下判断黑棋,每次第二个for循环最开始行不变,阶梯逼近右上的方法
	public static void BlackTopLeftToBottomRight_Row(int BoardSize, String[][] board) {
//		先定义一个数number,以此来计数
		int number=0;
//		每当执行第二个for循环的时候行row总是从0开始
		for(int line=0;line<BoardSize;line++) {
//			执行这个for循环的时候每一次列+1,行+1,数据元素呈现阶梯分布,阶梯逼近右上
			for(int row=0,i=line;row<BoardSize-line;row++,i++) {
//				如果此阶梯中有元素为黑棋则number+1
				if(board[row][i]=="●") {
					number++;
				}
//				当number为5的时候则黑棋一方的胜
				while(number==5) {
					System.out.println("黑棋方胜!");
		    		//胜出后输出棋盘
		    		for ( row = 0; row < board.length; row++) {
		    			for ( line = 0; line < board[row].length; line++) {
		    				System.out.print(	board[row][line]+" ");
		    			}
		    			System.out.println();
		    		}
		    		//胜后退出系统
		    		System.exit(0);
				}
//				如果此阶梯中虽有五个黑棋但是并不相连,不能说是黑方胜,需将number置为0
				if(board[row][i]=="○"|| board[row][i]=="+") {
					number=0;
				}
			}
//			每当第二个for循环完毕后需要将number置为0
			number=0;
		}
	}

 第四个方法结果展示

 第五个方法的代码

//	实现自右上--->左下判断黑棋,每次第二个for循环最开始列不变,阶梯逼近右下的方法
	public static void BlackTopRightToBottomLeft_Line(int BoardSize, String[][] board) {
//		先定义一个数number,以此来计数
		int number=0;
//		每当执行第二个for循环的时候列line总是从最后一列开始
		for(int row=0;row<BoardSize;row++) {
//			执行这个for循环的时候每一次列+1,行+1,数据元素呈现阶梯分布,阶梯逼近右下
			for(int line=BoardSize-1,i=row;line>=0+row;line--,i++) {
//				如果此阶梯中有元素为黑棋则number+1
				if(board[i][line]=="●") {
					number++;
				}
//				当number为5的时候则黑棋一方的胜
				while(number==5) {
					System.out.println("黑棋方胜!");
		    		//胜出后输出棋盘
		    		for ( row = 0; row < board.length; row++) {
		    			for ( line = 0; line < board[row].length; line++) {
		    				System.out.print(	board[row][line]+" ");
		    			}
		    			System.out.println();
		    		}
		    		//胜后退出系统
		    		System.exit(0);
				}
//				如果此阶梯中虽有五个黑棋但是并不相连,不能说是黑方胜,需将number置为0
				if(board[i][line]=="○"|| board[i][line]=="+") {
					number=0;
				}
			}
//			每当第二个for循环完毕后需要将number置为0
			number=0;
		}
	}

第五个方法结果展示

 第六个方法的代码

//	实现自右上--->左下判断黑棋,每次第二个for循环最开始行不变,阶梯逼近左上的方法
	public static void BlackTopRightToBottomLeft_Row(int BoardSize, String[][] board) {
//		先定义一个数number,以此来计数
		int number=0;
//		每当执行第二个for循环的时候行row总是从最后一列开始
		for(int line=BoardSize-1;line>=0;line--) {
//			执行这个for循环的时候每一次列+1,行+1,数据元素呈现阶梯分布,阶梯逼近左上
			for(int row=0,j=line;row<line;j--,row++) {
//				如果此阶梯中有元素为黑棋则number+1
				if(board[row][j]=="●") {
					number++;
				}
//				当number为5的时候则黑棋一方的胜
				while(number==5) {
					System.out.println("黑棋方胜!");
		    		//胜出后输出棋盘
		    		for ( row = 0; row < board.length; row++) {
		    			for ( line = 0; line < board[row].length; line++) {
		    				System.out.print(	board[row][line]+" ");
		    			}
		    			System.out.println();
		    		}
		    		//胜后退出系统
		    		System.exit(0);
				}
//				如果此阶梯中虽有五个黑棋但是并不相连,不能说是黑方胜,需将number置为0
				if(board[row][j]=="○"|| board[row][j]=="+") {
					number=0;
				}
			}
//			每当第二个for循环完毕后需要将number置为0
			number=0;
		}
	}

第六个方法结果展示

 后面是白棋的判断方法的代码,与黑棋一样


//	实现行判断白棋
	public static void WhiteRow(int BoardSize, String[][] board) {
//		先定义一个数number,以此来计数
		int number=0;
//		一行一行的读取数组中的元素
		for(int row=0;row<BoardSize;row++) {
			for(int line=0;line<BoardSize;line++) {
//				如果此行中有元素为白棋则number+1
				if(board[row][line]=="○") {
					number++;
				}
//				当number为5的时候则白棋一方的胜
				while(number==5) {
					System.out.println("白棋方胜!");
		    		//胜出后输出棋盘
		    		for ( row = 0; row < board.length; row++) {
		    			for ( line = 0; line < board[row].length; line++) {
		    				System.out.print(	board[row][line]+" ");
		    			}
		    			System.out.println();
		    		}
		    		//胜后退出系统
		    		System.exit(0);
				}
//				如果此行中虽有五个白棋但是并不相连,不能说是白棋方胜,需将number置为0
				if(board[row][line]=="●"|| board[row][line]=="+") {
					number=0;
				}
			}
//			每一行读取数组元素后未能分出胜负需要将number置为0
			number=0;
		}
	}
//	实现列判断白棋
	public static void WhiteLine(int BoardSize, String[][] board) {
//		先定义一个数number,以此来计数
		int number=0;
//		一列一列的读取数组中的元素
		for(int line=0;line<BoardSize;line++) {
			for(int row=0;row<BoardSize;row++) {
//				如果此列中有元素为白棋则number+1
				if(board[row][line]=="○") {
					number++;
				}
//				当number为5的时候则白棋一方的胜
				while(number==5) {
					System.out.println("白棋方胜!");
		    		//胜出后输出棋盘
		    		for ( row = 0; row < board.length; row++) {
		    			for ( line = 0; line < board[row].length; line++) {
		    				System.out.print(	board[row][line]+" ");
		    			}
		    			System.out.println();
		    		}
		    		//胜后退出系统
		    		System.exit(0);
				}
//				如果此列中虽有五个白棋但是并不相连,不能说是白棋方胜,需将number置为0
				if(board[row][line]=="●"|| board[row][line]=="+") {
					number=0;
				}
			}
//			每一列读取数组元素后未能分出胜负需要将number置为0
			number=0;
		}
	}
//	实现自左上--->右下判断白棋,每次第二个for循环最开始列不变,阶梯逼近左下的方法
	public static void WhiteTopLeftToBottomRight_Line(int BoardSize, String[][] board) {
//		先定义一个数number,以此来计数
		int number=0;
//		每当执行第二个for循环的时候列line总是从0开始
		for(int row=0;row<BoardSize;row++) {
//			执行这个for循环的时候每一次行+1,列+1,数据元素呈现阶梯分布,阶梯逼近左下
			for(int line=0,i=row;line<BoardSize-row;line++,i++) {
//				如果此阶梯中有元素为白棋则number+1
				if(board[i][line]=="○") {
					number++;
				}
//				当number为5的时候则白棋一方的胜
				while(number==5) {
					System.out.println("白棋方胜!");
		    		//胜出后输出棋盘
		    		for ( row = 0; row < board.length; row++) {
		    			for ( line = 0; line < board[i].length; line++) {
		    				System.out.print(	board[row][line]+" ");
		    			}
		    			System.out.println();
		    		}
		    		//胜后退出系统
		    		System.exit(0);
				}
//				如果此阶梯中虽有五个白棋但是并不相连,不能说是黑白方胜,需将number置为0
				if(board[i][line]=="●"|| board[i][line]=="+") {
					number=0;
				}
			}
//			每当第二个for循环完毕后需要将number置为0
			number=0;
		}
	}
//	实现自左上--->右下判断白棋,每次第二个for循环最开始行不变,阶梯逼近右上的方法
	public static void WhiteTopLeftToBottomRight_Row(int BoardSize, String[][] board) {
//		先定义一个数number,以此来计数
		int number=0;
//		每当执行第二个for循环的时候行row总是从0开始
		for(int line=0;line<BoardSize;line++) {
//			执行这个for循环的时候每一次列+1,行+1,数据元素呈现阶梯分布,阶梯逼近右上
			for( int row=0,i=line;row<BoardSize-line;row++,i++) {
//				如果此阶梯中有元素为白棋则number+1
				if(board[row][i]=="○") {
					number++;
				}
//				当number为5的时候则白棋一方的胜
				while(number==5) {
					System.out.println("白棋方胜!");
		    		//胜出后输出棋盘
		    		for ( row = 0; row < board.length; row++) {
		    			for ( line = 0; line < board[row].length; line++) {
		    				System.out.print(	board[row][line]+" ");
		    			}
		    			System.out.println();
		    		}
		    		//胜后退出系统
		    		System.exit(0);
				}
//				如果此阶梯中虽有五个白棋但是并不相连,不能说是白方胜,需将number置为0
				if(board[row][i]=="●"|| board[row][i]=="+") {
					number=0;
				}
			}
//			每当第二个for循环完毕后需要将number置为0
			number=0;
		}
	}
//	实现自右上--->左下判断白棋,每次第二个for循环最开始列不变,阶梯逼近右下的方法
	public static void WhiteTopRightToBottomLeft_Line(int BoardSize, String[][] board) {
//		先定义一个数number,以此来计数
		int number=0;
//		每当执行第二个for循环的时候列line总是从最后一列开始
		for(int row=0;row<BoardSize;row++) {
//			执行这个for循环的时候每一次列+1,行+1,数据元素呈现阶梯分布,阶梯逼近右下
			for(int line=BoardSize-1,i=row;line>=0+row;line--,i++) {
				if(board[i][line]=="○") {
//					如果此阶梯中有元素为白棋则number+1
					number++;
				}
//				当number为5的时候则白棋一方的胜
				while(number==5) {
					System.out.println("白棋方胜!");
		    		//胜出后输出棋盘
		    		for ( row = 0; row < board.length; row++) {
		    			for ( line = 0; line < board[row].length; line++) {
		    				System.out.print(	board[row][line]+" ");
		    			}
		    			System.out.println();
		    		}
		    		//胜后退出系统
		    		System.exit(0);
				}
//				如果此阶梯中虽有五个白棋但是并不相连,不能说是白方胜,需将number置为0
				if(board[i][line]=="●"|| board[i][line]=="+") {
					number=0;
				}
			}
//			每当第二个for循环完毕后需要将number置为0
			number=0;
		}
	}
//	实现自右上--->左下判断白棋,每次第二个for循环最开始行不变,阶梯逼近左上的方法
	public static void WhiteTopRightToBottomLeft_Row(int BoardSize, String[][] board) {
//		先定义一个数number,以此来计数
		int number=0;
//		每当执行第二个for循环的时候行row总是从最后一列开始
		for(int line=BoardSize-1;line>=0;line--) {
//			执行这个for循环的时候每一次列+1,行+1,数据元素呈现阶梯分布,阶梯逼近左上
			for(int row=0,j=line;row<line;j--,row++) {
//				如果此阶梯中有元素为白棋则number+1
				if(board[row][j]=="○") {
					number++;
				}
//				当number为5的时候则白棋一方的胜
				while(number==5) {
					System.out.println("白棋方胜!");
		    		//胜出后输出棋盘
		    		for ( row = 0;row < board.length; row++) {
		    			for ( line = 0;line < board[row].length; line++) {
		    				System.out.print(	board[row][line]+" ");
		    			}
		    			System.out.println();
		    		}
		    		//胜后退出系统
		    		System.exit(0);
				}
//				如果此阶梯中虽有五个白棋但是并不相连,不能说是白方胜,需将number置为0
				if(board[row][j]=="●"|| board[row][j]=="+") {
					number=0;
				}
			}
//			每当第二个for循环完毕后需要将number置为0
			number=0;
		}
	}
}

以上是关于Java五子棋游戏——控制台版的主要内容,如果未能解决你的问题,请参考以下文章

源码分享iOS-OC版五子棋

《游戏学习》java实现连珠五子棋完整代码

《游戏学习》java实现连珠五子棋完整代码

游戏黑作坊Socket联机版五子棋

java项目开发----五子棋

控制台五子棋游戏这学期的编程大作业有救了!(建议收藏)