`
Brucegaochina
  • 浏览: 40464 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

五子棋(java)

阅读更多
五子棋分析:

[1] 这里做的是一个控制台程序,一个16x16的棋盘组成;同时棋盘的第一行和第一列作为坐 标指示行和列不可落子。

[2] 行列的指示像:0 1 2 3 4 5 6 7 8 9 a b c d e f ,也就是说任何一方在落子的时候只能是这其中的任一组合中选择,如:23,5d,fe,等,否则判断落子不合法,该方重新落子。

[3] 考虑用一个固定的字符数组来初始化棋盘,并且在打印的时候将第一行和第一列至为 0 1 2 3 4 5 6 7 8 9 a b c d e f ,其他可以落子的地方至为'*',那么接下来的问题就是落子的问题了。

[4] 鉴于白黑双方每次只能落子一次并且不能悔棋(当然悔棋是能实现的了),设计的时候在Chess类中给一个对象变量初始化为0,当每一个打印新的棋盘时该变量做一次自加运算,用该变量与2的模运算来判定黑白方落子(余0白方落子,余1黑方落子),现在接下来的问题是解决输赢的问题了。

[5] 这面所以的问题都比较好解决,这里输赢怎么来判断呢?规则是当任何一条线上(横向,纵向,左斜方向,右斜方向)的同一方的棋子率先达到5颗,那么判定该方获胜;我这里的思路是每次下一颗棋子时,总横向,纵向,斜向判断该方的棋子是否达到5颗,达到则该方获胜。


Chess.java
package com.chess.gobang;

/**
 * @ClassName: Chess
 * @Description: TODO
 * @author Bruce
 * @date Aug 29, 2011 9:13:59 PM
 * @version 1.1
 * 
 */
class Chess {
	private static final int ROW_CHESS = 16;
	private static final int COLUMN_CHESS = 16;
	public int stepCount = 0;
	char[][] board = new char[ROW_CHESS][COLUMN_CHESS];

	public int getStepCount() {
		return this.stepCount;
	}

	public void init() {
		for (int i = 0; i < ROW_CHESS; i++) {
			for (int j = 0; j < COLUMN_CHESS; j++) {
				if (i == 0 || j == 0) {
					board[0][j] = Integer.toHexString(j).charAt(0);
					board[j][0] = Integer.toHexString(j).charAt(0);
				} else
					board[i][j] = '*';
			}
		}
	}

	public void printChess() {
		for (int i = 0; i < ROW_CHESS; i++) {
			for (int j = 0; j < COLUMN_CHESS; j++) {
				System.out.print(board[i][j] + " ");
			}
			System.out.println();
		}
		stepCount++;
	}

	public boolean validChessman(char row) {
		switch (row) {
		case '1':
			return true;
		case '2':
			return true;
		case '3':
			return true;
		case '4':
			return true;
		case '5':
			return true;
		case '6':
			return true;
		case '7':
			return true;
		case '8':
			return true;
		case '9':
			return true;
		case 'a':
			return true;
		case 'b':
			return true;
		case 'c':
			return true;
		case 'd':
			return true;
		case 'e':
			return true;
		case 'f':
			return true;
		}
		return false;
	}

	public void setWhite(char row, char col) {
		int i = Character.getNumericValue(row);
		int j = Character.getNumericValue(col);

		if (board[i][j] == '*') {
			board[i][j] = '@';
			this.printChess();
		}

		else if (board[i][j] == '@')
			System.out.println("这里已经有你的棋子!");
		else
			System.out.println("这里已经有黑方棋子!");

	}

	public void setBlack(char row, char col) {
		int i = Character.getNumericValue(row);
		int j = Character.getNumericValue(col);

		if (board[i][j] == '*') {
			board[i][j] = '#';
			this.printChess();
		} else if (board[i][j] == '#')
			System.out.println("这里已经有你的棋子!");
		else
			System.out.println("这里已经有白方棋子!");

	}

	public boolean isWin(char row, char col) {

		if (this.validChessman(row) && this.validChessman(col)) {

			int r = Character.getNumericValue(row);
			int l = Character.getNumericValue(col);
			int left = 0;
			int right = 0;
			int up = 0;
			int down = 0;

			int leftUp = 0;
			int leftDown = 0;

			int rightUp = 0;
			int rightDown = 0;

			int ri = l;
			int upPoint = r;
			int tempL = l;

			int leftUpR = r;
			int leftUpL = l;
			int leftDownR = r;
			int leftDownL = l;

			int rightUpR = r;
			int rightUpL = l;
			int rightDownR = r;
			int rightDownL = l;

			if (this.getStepCount() % 2 == 0) {

				// 判断横向
				while (this.validChessman(Integer.toHexString(--l).charAt(0))
						&& board[r][l] == '@') {
					left++;
				}
				while (ri < 16
						&& this.validChessman(Integer.toHexString(ri).charAt(0))
						&& board[r][ri++] == '@') {
					right++;
				}
				if (right + left > 4) {
					System.out.println("恭喜你,白方获胜!");
					return true;
				}
				// 判断纵向
				while (this.validChessman(Integer.toHexString(--r).charAt(0))
						&& board[r][tempL] == '@')
					up++;
				while (upPoint < 16
						&& this.validChessman(Integer.toHexString(upPoint)
								.charAt(0)) && board[upPoint++][tempL] == '@')
					down++;
				if (up + down > 4) {
					System.out.println("恭喜你,白方获胜!");
					return true;
				}
				// 判断左斜方向
				while (this.validChessman(Integer.toHexString(--leftUpR)
						.charAt(0))
						&& this.validChessman(Integer.toHexString(--leftUpL)
								.charAt(0)) && board[leftUpR][leftUpL] == '@')
					leftUp++;
				while (leftDownR < 16
						&& leftDownL < 16
						&& this.validChessman(Integer.toHexString(leftDownR)
								.charAt(0))
						&& this.validChessman(Integer.toHexString(leftDownL)
								.charAt(0))
						&& board[leftDownR++][leftDownL++] == '@')
					leftDown++;
				if (leftUp + leftDown > 4) {
					System.out.println("恭喜你,白方获胜!");
					return true;
				}
				// 判断右斜方向
				while (this.validChessman(Integer.toHexString(--rightUpR)
						.charAt(0))
						&& this.validChessman(Integer.toHexString(++rightUpL)
								.charAt(0))
						&& rightUpL < 16
						&& board[rightUpR][rightUpL] == '@')
					rightUp++;
				while (this.validChessman(Integer.toHexString(rightDownR)
						.charAt(0))
						&& this.validChessman(Integer.toHexString(rightDownL)
								.charAt(0))
						&& rightDownR < 16
						&& board[rightDownR++][rightDownL--] == '@')
					rightDown++;
				if (rightUp + rightDown > 4) {
					System.out.println("恭喜你,白方获胜!");
					return true;
				}

			} else {
				// 判断横向
				while (this.validChessman(Integer.toHexString(--l).charAt(0))
						&& board[r][l] == '#') {
					left++;
				}
				while (ri < 16
						&& this.validChessman(Integer.toHexString(ri).charAt(0))
						&& board[r][ri++] == '#') {
					right++;
				}
				if (right + left > 4) {
					System.out.println("恭喜你,黑方获胜!");
					return true;
				}
				// 判断纵向
				while (this.validChessman(Integer.toHexString(--r).charAt(0))
						&& board[r][tempL] == '#')
					up++;
				while (upPoint < 16
						&& this.validChessman(Integer.toHexString(upPoint)
								.charAt(0)) && board[upPoint++][tempL] == '#')
					down++;
				if (up + down > 4) {
					System.out.println("恭喜你,黑方获胜!");
					return true;
				}
				// 判断左斜方向
				while (this.validChessman(Integer.toHexString(--leftUpR)
						.charAt(0))
						&& this.validChessman(Integer.toHexString(--leftUpL)
								.charAt(0)) && board[leftUpR][leftUpL] == '#')
					leftUp++;
				while (leftDownR < 16
						&& leftDownL < 16
						&& this.validChessman(Integer.toHexString(leftDownR)
								.charAt(0))
						&& this.validChessman(Integer.toHexString(leftDownL)
								.charAt(0))
						&& board[leftDownR++][leftDownL++] == '#')
					leftDown++;
				if (leftUp + leftDown > 4) {
					System.out.println("恭喜你,黑方获胜!");
					return true;
				}
				// 判断右斜方向
				while (this.validChessman(Integer.toHexString(--rightUpR)
						.charAt(0))
						&& this.validChessman(Integer.toHexString(++rightUpL)
								.charAt(0))
						&& rightUpL < 16
						&& board[rightUpR][rightUpL] == '#')
					rightUp++;
				while (this.validChessman(Integer.toHexString(rightDownR)
						.charAt(0))
						&& this.validChessman(Integer.toHexString(rightDownL)
								.charAt(0))
						&& rightDownR < 16
						&& board[rightDownR++][rightDownL--] == '#')
					rightDown++;
				if (rightUp + rightDown > 4) {
					System.out.println("恭喜你,黑方获胜!");
					return true;
				}
			}
		}
		return false;
	}
}



Gobang.java
package com.chess.gobang;

/** 
 * @ClassName: Gobang 
 * @Description: TODO
 * @author Bruce
 * @date Aug 29, 2011 9:14:42 PM 
 * @version 1.1
 * 
 */
import java.util.Scanner;

public class Gobang {

	public static void main(String[] args) {
		Chess chess = new Chess();
		chess.init();
		chess.printChess();

		Scanner sc = new Scanner(System.in);
		String chessman = "";
		char rowChessman = 0;
		char colChessman = 0;

		while (!chess.isWin(rowChessman, colChessman)) {
			//倘若到最后都没分出胜负,跳出循环,结束,平局
			if(chess.getStepCount() == 226)
			{
				break;
			}
				
			// 由白方开始落子
			if (chess.getStepCount() % 2 == 1) {
				System.out.println("请白方落子(@):");
				
				chessman = sc.next();
				//棋子坐标长度是否为两位,否则重新落子
				if (chessman.length() == 2) {
					rowChessman = chessman.charAt(0);
					colChessman = chessman.charAt(1);
					boolean whiteDone = false;
					while (!whiteDone) {
						// 棋子合法,继续;否则直到获得合法棋子为止
						if (chess.validChessman(rowChessman)
								&& chess.validChessman(colChessman)) {
							chess.setWhite(rowChessman, colChessman);
							whiteDone = true;
						} else {
							//棋子包含无效字符,重新落子
							System.out.println("白棋子不合法,请重新落子:");
							break;
						}
					}
				} else {
					System.out.println("白棋子坐标长度应该为2,请重新落子:");
				}
			} else {
				// 黑方开始落子
				System.out.println("请黑方落子(#):");
				chessman = sc.next();
				//棋子坐标长度是否为两位,否则重新落子
				if (chessman.length() == 2) {
					rowChessman = chessman.charAt(0);
					colChessman = chessman.charAt(1);
					boolean blackDone = false;
					while (!blackDone) {
						// 棋子合法,继续;否则直到获得合法棋子为止
						if (chess.validChessman(rowChessman)
								&& chess.validChessman(colChessman)) {
							chess.setBlack(rowChessman, colChessman);
							blackDone = true;
						} else {
							//棋子包含无效字符,重新落子
							System.out.println("黑棋子不合法,请重新落子:");
							break;
						}
					}
				} else {
					System.out.println("黑棋子坐标长度应该为2,请重新落子:");
				}
			}
		}
		System.out.println("恭喜二位,你们实力相当,占城平手!");
	}

}





附注:
[size=medium]
[1] 我认为这里的isWin()方法写的实在是对不住观众,仅仅是功能实现而已;这个仅仅是一个中间版本,接下来的时候我会优化这些代码,使其更加的面向对象,这样可读性也会好很多。

[2] 在判断棋子的合法性我用了一个包含switch的方法,这里当然也可以利用类似二分查找的算法,只是返回值是boolean类型而已,不过我觉得这里用switch语句可能可读性更加好点,而且在这里其性能也不比二分查找差(我的感觉而已)
size]
分享到:
评论

相关推荐

    五子棋 java版 博弈算法

    总之,这个五子棋Java版项目涵盖了棋盘游戏的基础设计、游戏逻辑实现和博弈算法的运用,对于学习和实践游戏开发、算法设计以及Java编程都是很好的案例。通过深入理解和实现该项目,开发者不仅能提升编程技能,还能...

    五子棋java全套源代码

    【五子棋Java全套源代码】是一个基于Java Swing开发的桌面应用程序,专为五子棋爱好者设计。在这款游戏中,玩家可以与计算机进行对弈,体验经典的五子棋玩法。Swing是Java的一个图形用户界面(GUI)工具包,它允许...

    单机版五子棋java代码实现。

    【标题】"单机版五子棋java代码实现"是一个基于Java编程语言开发的桌面游戏项目,旨在提供一个用户可以在本地计算机上玩的五子棋游戏。五子棋是一种策略性棋类游戏,两名玩家轮流在棋盘上下棋,目标是先连成五颗棋子...

    五子棋JAVA课程设计

    在本项目中,"五子棋JAVA课程设计"是一个典型的编程实践案例,旨在让学生通过编写Java代码来实现一个五子棋游戏,包括人机对战功能。以下将详细阐述涉及的知识点及其重要性: 1. **Java编程基础**:整个项目基于...

    五子棋java源代码

    【五子棋java源代码】是一个基于控制台实现的简易版五子棋游戏,它采用Java编程语言编写,提供了一个10*10的棋盘界面,玩家通过输入坐标进行落子,目标是先形成连续的五个棋子,无论是横、竖、还是斜线,即可获得...

    五子棋 java 小程序

    通过这个五子棋Java小程序,开发者不仅可以体验到游戏的乐趣,还能深入学习和实践Java GUI编程、多线程、数据结构以及错误处理等核心编程概念。对于初学者而言,这是一个很好的实战项目,能够帮助他们巩固理论知识,...

    五子棋java完整代码

    【五子棋Java完整代码】项目是一个实现五子棋游戏的程序,主要使用Java语言编写。这个项目的特点在于它没有采用图形用户界面(GUI)中的按钮元素,而是通过自定义绘制棋盘和棋子来实现游戏界面。以下是该项目中涉及...

    五子棋java

    【五子棋Java游戏开发详解】 五子棋Java游戏是一款利用Java编程语言开发的桌面棋类游戏,它允许两位玩家通过网络或者在同一设备上进行对弈。在这个项目中,我们主要探讨以下几个关键知识点: 1. **Java基础**:...

    GoBang 五子棋java源程序

    【GoBang 五子棋java源程序】是一个学习和实践Java编程语言的项目,它实现了一个经典的五子棋游戏。这个项目对于初学者或者想要提升Java编程技能的人来说,是一个很好的资源,因为它提供了实际运行的代码,可以加深...

    简易人工智能五子棋java代码

    【简易人工智能五子棋Java代码】是一个编程项目,旨在实现一个基本的五子棋游戏,玩家可以与计算机进行对弈。这个项目的核心是利用Java语言编写的游戏逻辑和一个初级的人工智能算法。以下是对这个项目的详细解读: ...

    带人工智能的五子棋java源程序

    标题 "带人工智能的五子棋java源程序" 暗示了这个项目是用Java编程语言实现的一个五子棋游戏,其中包含了一种人工智能算法,使得计算机能够与玩家对弈。五子棋是一种古老的策略棋类游戏,目标是首先在棋盘上形成连续...

    五子棋 java版

    【五子棋 Java 版】是一款基于 Java 编程语言实现的桌面游戏,它提供了用户友好的图形界面,使得玩家可以在计算机上体验经典的五子棋对弈。在这款游戏中,两个玩家轮流在棋盘上下棋,目标是首先形成连续的五个同色...

    java_wzq.rar_java b/s 五子棋_java 五子棋_五子棋 java_五子棋 java_五子棋java

    此外,“五子棋_java”和“五子棋java”标签再次重申了游戏的核心主题。 【压缩包子文件的文件名称列表】: 1. "www.pudn.com.txt" - 这可能是一个文本文件,可能是从"PUDN"(一个分享资源和技术讨论的网站)获取该...

    wuziqi.rar_java联机五子棋_五子棋java_五子棋联机JAVA_联机_联机五子棋java

    【标题】"wuziqi.rar_java联机五子棋_五子棋java_五子棋联机JAVA_联机_联机五子棋java" 指的是一个使用Java编程语言开发的在线五子棋游戏项目。这个项目旨在创建一个可以支持两个玩家通过网络进行对战的五子棋游戏。...

    wuziq.rar_java 五子棋_java五子棋_wuz_五子棋_五子棋 java

    【描述】"java版本的五子棋java版本的五子棋" 提示这是一个用Java语言编写的五子棋游戏程序。Java作为一种跨平台的面向对象编程语言,适合开发桌面应用、网络应用和移动应用,包括游戏。因此,这个项目可能包含一个...

    wuziqi.rar_ChessPlayer java_五子棋java_网络 五子棋 java

    【标题】"wuziqi.rar_ChessPlayer java_五子棋java_网络 五子棋 java" 提供了一个基于Java编程语言实现的网络版五子棋游戏项目。这个项目的核心在于实现多人在线对战的功能,让玩家能够在互联网上进行实时的五子棋...

    双人五子棋java小案例

    本案例"双人五子棋java小案例"就是一个基于Java实现的基础项目,它展示了如何利用Java来设计和实现一个简单的双人对战五子棋游戏。下面将详细探讨这个项目的相关知识点。 首先,我们需要了解五子棋的基本规则。...

Global site tag (gtag.js) - Google Analytics