学完Java的面向对象章节,利用已学的知识点完成一个简单的五子棋游戏编写。

  1. 用控制台运行java文件
  2. 编码格式为ANSI
  3. 因为没有学到异常处理,输入坐标要严格按照提示
代码如下
/**
 * @author WJH-97
 * @date 2020/08/28
 */
 
/*
	编程实现控制台版并支持两人对战的五子棋游戏
	1). 绘制棋盘
	2)提示黑方和白方分别下棋并重新绘制棋盘 
	3)每当一方下棋后判断是否获胜 
	4)提示: 采用二维数组来模拟并描述棋盘
*/

import java.util.Scanner;
import java.util.Arrays;

public class TaskTwo{
	
	public static void main(String[] args){
		// 创建二维数据,填充元素'+'作为空棋盘
		char[][] arr = new char[16][16];
		for(int i = 0;i<16;i++){
			Arrays.fill(arr[i],'+');
		}	
		
		TaskTwo tt = new TaskTwo();
		
		//
		
		Scanner sc = new Scanner(System.in);
		
		boolean begin = tt.menu();
		boolean flag1 = true;            //falg1用于标记此轮的下棋选手,默认白方先下
		boolean flag2;                   //flag2用于标记此轮落子的位置是否合法
		//初始化棋盘
		if(begin) {
			tt.chessBoard(arr);
		}
		while(begin){
			flag2 = tt.play(arr,flag1);
			tt.chessBoard(arr);
			
			//判断是否获胜
			if(tt.isWin(arr,flag1)){
				String str = flag1?"白方":"黑方";
				System.out.println("恭喜" + str + "获得胜利!\n\n");
				begin = tt.menu();
				if(begin){
					for(int i = 0;i<16;i++){
						Arrays.fill(arr[i],'+');
					}
					tt.chessBoard(arr);
				}
				
			}
			//如果成功落子且无玩家获胜,则进入对方回合
			if(flag2){
				flag1 = !flag1;
			}
			
		}

	}
	
	/**
	*  判断是否有玩家获胜,若有一方获胜,则返回菜单
	*/
	public boolean isWin(char[][] arr,boolean flag1){
		int countRow = 0;        //记录横向连珠个数
		int countCol = 0;        //记录纵向连珠个数
		int countDiag1 = 0;      //记录正斜连珠个数
		int countDiag2 = 0;      //记录反斜连珠个数
		char ch = flag1?(char)11 : (char)12; //在各自的轮次只判断该轮次的选手是否获胜
		// 1. 判断横纵向是否五子连珠
		for(int i = 0;i<16;i++){
			for(int j = 0;j<16;j++){
				//横向
				if(ch == arr[i][j]){
					countRow++;
					if(5 == countRow){
						return true;
					}
				}else{
					countRow = 0;
				}
				//纵向
				if(ch == arr[j][i]){
					countCol++;
					if(5 == countCol){
						return true;
					}
				}else{
					countCol = 0;   
				}
				
			}
			countRow = 0;
			countCol = 0;
		}
		//2.1判断下三角正斜向是否五子连珠
		for(int i = 0;i<11;i++){
			for(int j = i;j<16;j++){
				if(ch == arr[j][j-i]){  //
					countDiag1++;
					if(5 == countDiag1){
						return true;
					}
				}else{
						countDiag1 = 0;
					}
			}
			countDiag1 = 0;       //换直线清零
		}
		//2.2 判断上三角正斜向是否五子连珠
		for(int i = 0;i>-11;i--){
			for(int j = 0;j<16+i;j++){
				if(ch == arr[j][j-i]){  //
					countDiag1++;
					if(5 == countDiag1){
						return true;
					}
				}else{
						countDiag1 = 0;
					}
			}
			countDiag1 = 0;
		}
		//2.3 判断上三角反斜向是否五子连珠
		for(int i = -5; i>-16;i--){
			for(int j = 0;j<=-i;j++){
				if(ch == arr[j][-j-i]){
					countDiag2++;
					if(5 == countDiag2){
						return true;
					}
				}else{
					countDiag2 = 0;
				}
			}
			countDiag2 = 0;
		}
		//2.4 判断下三角反斜向是否五子连珠
		for(int i = -15;i>-32+5;i--){
			for(int j = -i-15;j<16;j++){
				if(ch == arr[j][-j-i]){
					countDiag2++;
					if(5 == countDiag2){
						return true;
					}
				}else{
					countDiag2 = 0;
				}
			}
			countDiag2 = 0;
		}
		return false;
	}
	
	/**
	* 实现下棋功能,并提示黑方和白方下棋
	*/
	public boolean play(char[][] arr, boolean flag1){
		if(flag1){
			System.out.print("请白方下棋(输入0-f横纵坐标以空格分隔):");
		}else {
			System.out.print("请黑方下棋(输入0-f横纵坐标以空格分隔):");
		}
		Scanner sc = new Scanner(System.in);
		String str1 = sc.next();
		String str2 = sc.next();
		//判断落子是否在棋盘范围内
		boolean isStr1 = (str1.charAt(0) >= '0' && str1.charAt(0) <= '9')||(str1.charAt(0) >= 'a' && str1.charAt(0) <= 'f');
		boolean isStr2 = (str2.charAt(0) >= '0' && str2.charAt(0) <= '9')||(str2.charAt(0) >= 'a' && str2.charAt(0) <= 'f');
		if(!isStr1 || !isStr2){
			System.out.println("该位置已超出棋盘范围!请重新输入!\n");
			System.out.println("----------------------------------------------------");
			return false;
		}
		
		int x = Integer.parseInt(str1,16);
		int y = Integer.parseInt(str2,16);
		if('+' == arr[x][y]){
			arr[x][y] = flag1? (char)11: (char)12;
		}else{
			System.out.println("该位置已有棋子,请重新输入\n");
			System.out.println("----------------------------------------------------");
			return false;
		}
		//System.out.println("x = " + x + " y = " + y );
		return true;
	}
	
	
	/**
	* 显示菜单
	*/
	public boolean menu(){
		System.out.println("---------------五子棋游戏--------------------");
		System.out.println("               1. 开始游戏                   ");
		System.out.println("               任意其他整数退出游戏                   ");
		System.out.println("请选择功能:");
		Scanner sc = new Scanner(System.in);
		int sele = sc.nextInt();
		if(1 == sele){
			System.out.println("开始游戏!");
			return true;
		}else{
			return false;
		}
	}
	
	
	/**
	*  显示棋盘方法
	*  输入二维数组
	*/
	public void chessBoard(char[][] arr){
		
		System.out.println();
		for(int i = 0;i<17;i++){
			if(0 == i){
				System.out.print("  ");
				continue;
			}
			System.out.printf("%x ",i-1);
		}
		
		for(int i = 0;i<16;i++){
			System.out.println();
			System.out.printf("%x",i);
			for(int j = 0;j<16;j++){
				System.out.print(" " + arr[i][j]);
			}
		}
		System.out.println();
	}
}

这是一个非常简单的实现,如果有同学发现有逻辑错误或者不合理之处,希望大家不吝赐教!