五子棋游戏控制台实现(Java)

五子棋游戏(Java)

本篇文章参考了一下两篇文章:
1.控制台五子棋java_java实现简单控制台五子棋游戏
2.Java实现五子棋小游戏(对新手极为友好的版本)
在本章中,主要是参考了第一篇文章!五子棋判断输赢的核心算法是参考的第二篇!

五子棋项目大概构成

在本项目中主要含有3个类。参考如下图:
在这里插入图片描述

三个类(Coordinate、GameMain、Gobang)

Coordinate类

package gobang;

/*
 * 棋子坐标
 */
public class Coordinate {

	private int x;
	private int y;
	
	public Coordinate(int x, int y) {
		super();
		this.x = x;
		this.y = y;
	}

	public int getX() {
		return x;
	}

	public void setX(int x) {
		this.x = x;
	}

	public int getY() {
		return y;
	}

	public void setY(int y) {
		this.y = y;
	}
	
}

Gobang类-游戏主体

package gobang;

/*
 * 游戏地图设计,规则设计
 */
public class Gobang {
	
	public int scale = 20;//规模
	public String color;//当局颜色是白?还是黑
	public String mark = "╋";
	public String white = "○";
	public String black = "●";
	public String[][] map = new String[scale][scale];
	public String[] border = {"⒈", "⒉", "⒊", "⒋", "⒌", "⒍", "⒎", "⒏", "⒐", "⒑",
			"⒒", "⒓", "⒔", "⒕", "⒖", "⒗", "⒘","⒙", "⒚", "⒛" };
	
	public Gobang() {
		
		initMap();//初始化地图
	}
	
	/**
	 * 初始化地图
	 */
	public void initMap() {
		for(int i = 0;i < scale;i++) {
			for(int j = 0;j < scale;j++) {
				if(i == scale - 1) {                       //棋盘下边界处
					map[i][j] = border[j];
				}else if(j == scale - 1) {              //棋盘左边界处
					map[i][j] = border[i];
				}else {
					map[i][j] = mark;
				}
			}	
		}
		//打印地图
		printMap();
	}
	
	/**
	 * 打印地图
	 */
	public void printMap() {
		for(int i = 0;i < scale;i++) {
			for(int j = 0;j < scale;j++) {
				System.out.print(map[i][j]);
			}
			System.out.println();
		}
	}
	
	/**
	 * 解析坐标:在输入的坐标值处下子
	 * @param coordinate 用户输入的落子坐标的字符串
	 * @return 返回落子的坐标类
	 */
	public Coordinate analyCoordinate(String coordinate) {
		String[] coordinates = coordinate.split(",");//分离出逗号,并赋值给coordinates字符串数组
		int x = Integer.parseInt(coordinates[0]) - 1;
		int y = Integer.parseInt(coordinates[1]) - 1;
		
		return new Coordinate(x,y);//创建坐标对象,将x,y值传入Coordinate类
	}
	
	/**
	 * 落子
	 * @param coordinate  落子坐标
	 * @param color 当局落子颜色
	 */
	public boolean putDownPieces(Coordinate coordinate,Boolean color) {
		//判断是否出界
		if(coordinate.getX() < 0 || coordinate.getX() > 18 ||
		    coordinate.getY() < 0 || coordinate.getY() > 18) {
			return false;//坐标出界,落子失败
		}
		
		//判断落子的地方是否被占用
		if(map[coordinate.getX()][coordinate.getY()] != mark) {
			return false;//该地方已经被下子,落子失败
		}
		
		//将坐标的位置上的mark改成white或者black,完成落子!
		map[coordinate.getX()][coordinate.getY()] = color ? white : black;
		return true;//落子成功
	}
	
	/**
	 * 判断输赢
	 * @param coordinate  棋子坐标
	 * @param color  当局下棋的颜色
	 * @return
	 */
	public boolean isWin(Coordinate coordinate,boolean color) {
		//垂直方向
		if((extend(coordinate,0,color)+extend(coordinate,4,color)) >= 4) {
			return true;//游戏结束,本局中在垂直方向上有5个相同色的棋子已成功连接
		}
		//副对角线
		if((extend(coordinate,1,color)+extend(coordinate,5,color)) >= 4) {
			return true;//游戏结束
		}
		//水平方向
		if((extend(coordinate,2,color)+extend(coordinate,6,color)) >= 4) {
			return true;//游戏结束
		}
		//主对角线
		if((extend(coordinate,3,color)+extend(coordinate,7,color)) >= 4) {
			return true;//游戏结束
		}
		return false;//游戏尚未结束,在本局中没有5个相同棋子连接起来
	}
	
	/**
	 * 判断延展方向上是否有4个相同的颜色的棋子
	 * @param coordinate 坐标
	 * @param direction 0向上 1右上 2右 3右下 4下 5左下 6左 7左上 
	 * @param color 当局颜色
	 * @return 相同颜色个数在同一方向上
	 */
	public int extend(Coordinate coordinate,int direction,boolean color) {
		int count = 0;//记录相同颜色在同一方向上的个数
		int x = coordinate.getX();
		int y = coordinate.getY();
		
		//在延展方向上(不包括刚落下的棋子)判断4个即可
		for(int i = 0;i < 4;i++) {
			switch(direction) {
			case 0: x--;break;
			case 1: x--;y++;break;
			case 2: y++;break;
			case 3: x++;y++;break;
			case 4: x++;break;
			case 5: x++;y--;break;
			case 6: y--;break;
			case 7: x--;y--;break;
			}
			//判断坐标递减后是否出界
			if(x < 0 || x > 18 || y < 0 || y > 18) {
				break;
			}
			//判断颜色是否为当局颜色
			if(map[x][y].equals(color?white:black)) {
				count++;
			}else {
				break;//不相等,跳出循环
			}
		}
		return count;
	}
}

GameMain类

package gobang;

import java.util.Scanner;

/*
 * 游戏主体,程序的入口
 */

public class GameMain {
	
	public static String white = "白方";
	public static String black = "黑方";
	public static boolean color = false;//白色:TRUE            黑色:FALSE
	public static String storagePoint;//存储坐标
	
	public static void main(String[] args) {
		
		Gobang gobang = new Gobang();
		Scanner scanner = new Scanner(System.in);
		
		while(true) {
			System.out.print("请"+(color?white:black)+"落子:(格式:竖,横)");
			storagePoint = scanner.next();//格式:x,y  如3,4
			
			Coordinate coordinate = gobang.analyCoordinate(storagePoint);//输入的落子坐标
			
			//落子(putDownPieces)并打印更新棋盘(printMap)
			if(gobang.putDownPieces(coordinate, color)) {//开局默认为黑色
				gobang.printMap();
				//落子后,判断输赢
				if(gobang.isWin(coordinate, color)) {
					System.out.println("恭喜"+(color?white:black)+"赢了!!");
					scanner.close();//游戏结束,关闭scanner
					break;//一方胜利,结束游戏并退出程序
				}
				//交换下棋
				color = !color;
			}
		}	
	}	
}

参考坐标系

在这里插入图片描述
在游戏中x指的是行,y指的是列,如上图所示!

玩法

在开始时,要求你输入棋子的落下坐标(黑子开局):

3,4

输入后,棋子会在第3行第4列,落下棋子。之后白子落棋,直至有一方五子连起来结束游戏!
在这里插入图片描述
完结

posted @ 2022-01-20 23:52  辰梦starDream  阅读(14)  评论(0编辑  收藏  举报  来源