用java编程实现控制台版的五子棋

问题:

编程实现控制台版并支持两人对战的五子棋游戏
(1)绘制棋盘
(2)提示黑方(用 1 表示)和白方(用 2 表示)分别下棋(X,Y 轴位
置)并重新绘制棋盘。
(3)每当一方下棋后判断是否获胜 。
(4)提示:采用二维数组来模拟棋盘。

首先

首先,必要的是,审题,这很重要,对问题进行解析,分为:
1.绘制棋盘 2.黑白双方下棋 3.判断是否获胜。

再者,进一步分析:

绘制棋盘:

使用二维数组即可完成。

黑白双方下棋:

利用双重循环实现黑白两者的交换对局下子,利用两个数组用于存储黑白
方下子的坐标,当每一次下子完毕后,即调用函数,判断是否获胜,当获
胜,即退出游戏循环。

获胜函数:

当下一个子时,建立了该棋子的左,右,上,下,左上,左下,右上,右
下的个数变量,用于统计在这些方位内连续相同的棋子的个数。左右相加
为4,上下相加为4,以此类推,当出现这些情况中的任何一种时,即返回
false,即为获胜。

上代码:

import java.util.Scanner;
/**
 * 
 * @author YIS
 *
 */
public class Test2 {
	/*
	 * 目标: 编程实现控制台版并支持两人对战的五子棋游戏
		(1)绘制棋盘
		(2)提示黑方(用 1 表示)和白方(用 2 表示)分别下棋(X,Y 轴位
		置)并重新绘制棋盘。
		(3)每当一方下棋后判断是否获胜 。
		(4)提示:采用二维数组来模拟棋盘。
	 */
	public static void main(String[] args) {
		//绘制棋盘
		int[][] nums = new int[16][16];
		for(int i=0;i<nums.length;i++) {
			nums[0][i] = i;
			nums[i][0] = i;
		}
		game:while(true) {
			for(int i=0;i<nums.length;i++) {			//打印棋盘
				for(int j=0;j<nums.length;j++) {
					System.out.print(nums[i][j]+"	");				
				}
				System.out.println();
				//System.out.println();
			}
			
			//下子
			Scanner input = new Scanner(System.in);
			int[] blackPoint = new int[2];        //建立一个数组存放黑方下子坐标
			int[] whitePoint = new int[2];        //建立一个数组存放白方下子坐标
			boolean v = true;
			
			while(v){
				System.out.println("请黑方下子(请输入下子的坐标):");
				for(int i = 0;i<blackPoint.length;i++) {
					blackPoint[i] = input.nextInt();
				}
				if(nums[blackPoint[1]][blackPoint[0]]==0) {
					nums[blackPoint[1]][blackPoint[0]] = 1;
					//在此处插入判断条件
					v = victory(nums,blackPoint[0],blackPoint[1]);		
					if(v==false) {
						System.out.println("黑方胜利!!");
						break game;
					}
					break;
				}else if(blackPoint[1]==0 || blackPoint[0]==0 || blackPoint[1]>=nums.length || blackPoint[0]>=nums.length){
					System.out.println("您的坐标输入有误!请重新输入!");
					continue;
				}else {
					System.out.println("该位置已有子!请重新输入!");
					continue;
				}
			}
			
			
			for(int i=0;i<nums.length;i++) {   		//黑方下子后打印一次
				for(int j=0;j<nums.length;j++) {
					System.out.print(nums[i][j]+"	");				
				}
				System.out.println();
				//System.out.println();
			}
			
			while(v) {
				System.out.println("请白方下子(请输入下子的坐标):");
				for(int i = 0;i<whitePoint.length;i++) {
					whitePoint[i] = input.nextInt();
				}
				if(nums[whitePoint[1]][whitePoint[0]]==0) {
					nums[whitePoint[1]][whitePoint[0]] = 2;
					//在此处插入判断条件
					v = victory(nums,whitePoint[0],whitePoint[1]);
					if(v==false) {
						System.out.println("白方胜利!!");
						break game;
					}
					break;
				}else if(whitePoint[1]==0 || whitePoint[0]==0 || whitePoint[1]>=nums.length || whitePoint[0]>=nums.length){
					System.out.println("您的坐标输入有误!请重新输入!");
					continue;
				}else {
					System.out.println("该位置已有子!请重新输入!");
					continue;
				}		
			}
		}
		//判断是否胜利
	}
	public static boolean victory(int[][] nums, int point1,int point2){
		//判断落子的邻近是否可以有形成的五个连续的子
		//如果有即放回false给v;
		int leftNumber = 0;        	 	//定义落子的左边连续相同的个数
		int rightNumber = 0;			//定义落子的右边连续相同的个数
		int upperNumber = 0;			//定义落子的上边连续相同的个数
		int lowerNumber = 0;			//定义落子的下边连续相同的个数	
		int leftUpperNumber = 0;		//定义落子的左上连续相同的个数
		int leftLowerNumber = 0;		//定义落子的左下连续相同的个数
		int rightUpperNumber = 0;		//定义落子的右上连续相同的个数
		int rightLowerNumber = 0;		//定义落子的右下连续相同的个数
		for(int i=1;point1-i>0;i++) {   	//往左边数有多少个是连续相同的
			if(nums[point2][point1]==nums[point2][point1-i]) {
				leftNumber++;
			}else {
				break;
			}
		}
		for(int i=1;point1+i<nums.length;i++) {   	//往右边数有多少个是连续相同的
			if(nums[point2][point1]==nums[point2][point1+i]) {
				rightNumber++;
			}else {
				break;
			}
		}
		for(int i=1;point2-i>0;i++) {   	//往上边数有多少个是连续相同的
			if(nums[point2][point1]==nums[point2-i][point1]) {
				upperNumber++;
			}else {
				break;
			}
		}
		for(int i=1;point2+i<nums.length;i++) {   	//往下边数有多少个是连续相同的
			if(nums[point2][point1]==nums[point2+i][point1]) {
				lowerNumber++;
			}else {
				break;
			}
		}
		for(int i=1;point1-i>0 && point2-i>0;i++) {   	//往左上边数有多少个是连续相同的
			if(nums[point2][point1]==nums[point2-i][point1-i]) {
				leftUpperNumber++;
			}else {
				break;
			}
		}
		for(int i=1;point1+i<nums.length && point2+i<nums.length;i++) {   	//往右下数有多少个是连续相同的
			if(nums[point2][point1]==nums[point2+i][point1+i]) {
				rightLowerNumber++;
			}else {
				break;
			}
		}
		for(int i=1;point1-i>0 && point2+i<nums.length;i++) {   	//往左下边数有多少个是连续相同的
			if(nums[point2][point1]==nums[point2-i][point1-i]) {
				leftLowerNumber++;
			}else {
				break;
			}
		}
		for(int i=1;point1+i<nums.length && point2-i>0;i++) {   	//往右上数有多少个是连续相同的
			if(nums[point2][point1]==nums[point2+i][point1+i]) {
				rightUpperNumber++;
			}else {
				break;
			}
		}	
		//判断
		if(leftNumber+rightNumber==4 || upperNumber+lowerNumber==4 || leftUpperNumber+rightLowerNumber==4 || leftLowerNumber+rightUpperNumber==4) {
			return false;
		}else {
			return true;
		}	
	}
}

运行结果实例:
用java编程实现控制台版的五子棋_第1张图片
总结:

这道题想挺久的,也不是说这道题难啦,就是做出来了,对我来说就不能算难了哈哈哈,想太多,思考太多问题反而会耽误太多时间,大胆实现,先做就好了,整体做得还是有点慢,还是技术不太行,仍需加强练习,努力提升吧!!

你可能感兴趣的:(学习笔记)