package org.crazyit.gobang;
/**
* 棋盘对象
*/
public class Chessboard {
// 定义一个二维数组来充当棋盘
private String[][] board;
// 定义棋盘的大小
public static final int BOARD_SIZE = 22;
/**
* 初始化棋盘
*
* @return void
*/
public void initBoard() {
// 初始化棋盘数组
board = new String[BOARD_SIZE][BOARD_SIZE];
// 把每个元素赋值为“十”,用于控制台输出棋盘
for (int i = 0; i < BOARD_SIZE; i++) {
for (int j = 0; j < BOARD_SIZE; j++) {
board[i][j] = "十";
}
}
}
public void test() {
Object[][] array = new Object[10][10];
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
array[i][j] = new Object();
}
}
}
/**
* 在控制台输出棋盘的方法
*/
public void printBoard() {
// 打印每个数组元素
for (int i = 0; i < BOARD_SIZE; i++) {
for (int j = 0; j < BOARD_SIZE; j++) {
// 打印后不换行
System.out.print(board[i][j]);
}
// 每打印完一行数组元素就换行一次
System.out.print("\n");
}
}
/**
* 给棋盘位置赋值
*
* @param posX
* X坐标
* @param posY
* Y坐标
* @param chessman
* 棋子
*/
public void setBoard(int posX, int posY, String chessman) {
this.board[posX][posY] = chessman;
}
/**
* 返回棋盘
*
* @return 返回棋盘
*/
public String[][] getBoard() {
return this.board;
}
}
*********************************************************************************
package org.crazyit.gobang;
/**
* 棋子枚举类
*/
public enum Chessman {
BLACK("●"), WHITE("○");
private String chessman;
/**
* 私有构造器
*/
private Chessman(String chessman) {
this.chessman = chessman;
}
/**
* @return String 黑棋或者白棋
*/
public String getChessman() {
return this.chessman;
}
}
*********************************************************************************
package org.crazyit.gobang;
import java.io.BufferedReader;
import java.io.InputStreamReader;
/**
* 五子棋游戏类
*/
public class GobangGame {
// 定义达到赢条件的棋子数目
private final int WIN_COUNT = 5;
// 定义用户输入的X坐标
private int posX = 0;
// 定义用户输入的X坐标
private int posY = 0;
// 定义棋盘
private Chessboard chessboard;
/**
* 空构造器
*/
public GobangGame() {
}
/**
* 构造器,初始化棋盘和棋子属性
*
* @param chessboard
* 棋盘类
*/
public GobangGame(Chessboard chessboard) {
this.chessboard = chessboard;
}
/**
* 检查输入是否合法。
*
* @param inputStr
* 由控制台输入的字符串。
* @return 字符串合法返回true,反则返回false。
*/
public boolean isValid(String inputStr) {
// 将用户输入的字符串以逗号(,)作为分隔,分隔成两个字符串
String[] posStrArr = inputStr.split(",");
try {
posX = Integer.parseInt(posStrArr[0]) - 1;
posY = Integer.parseInt(posStrArr[1]) - 1;
} catch (NumberFormatException e) {
chessboard.printBoard();
System.out.println("请以(数字,数字)的格式输入:");
return false;
}
// 检查输入数值是否在范围之内
if (posX < 0 || posX >= Chessboard.BOARD_SIZE || posY < 0
|| posY >= Chessboard.BOARD_SIZE) {
chessboard.printBoard();
System.out.println("X与Y坐标只能大于等于1,与小于等于" + Chessboard.BOARD_SIZE
+ ",请重新输入:");
return false;
}
// 检查输入的位置是否已经有棋子
String[][] board = chessboard.getBoard();
if (board[posX][posY] != "十") {
chessboard.printBoard();
System.out.println("此位置已经有棋子,请重新输入:");
return false;
}
return true;
}
/**
* 开始下棋
*/
public void start() throws Exception {
// true为游戏结束
boolean isOver = false;
chessboard.initBoard();
chessboard.printBoard();
// 获取键盘的输入
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String inputStr = null;
// br.readLine:每当键盘输入一行内容按回车键,则输入的内容被br读取到
while ((inputStr = br.readLine()) != null) {
isOver = false;
if (!isValid(inputStr)) {
// 如果不合法,要求重新输入,再继续
continue;
}
// 把对应的数组元素赋为"●"
String chessman = Chessman.BLACK.getChessman();
chessboard.setBoard(posX, posY, chessman);
// 判断用户是否赢了
if (isWon(posX, posY, chessman)) {
isOver = true;
} else {
// 计算机随机选择位置坐标
int[] computerPosArr = computerDo();
chessman = Chessman.WHITE.getChessman();
chessboard.setBoard(computerPosArr[0], computerPosArr[1],
chessman);
// 判断计算机是否赢了
if (isWon(computerPosArr[0], computerPosArr[1], chessman)) {
isOver = true;
}
}
// 如果产生胜者,询问用户是否继续游戏
if (isOver) {
// 如果继续,重新初始化棋盘,继续游戏
if (isReplay(chessman)) {
chessboard.initBoard();
chessboard.printBoard();
continue;
}
// 如果不继续,退出程序
break;
}
chessboard.printBoard();
System.out.println("请输入您下棋的坐标,应以x,y的格式输入:");
}
}
/**
* 是否重新开始下棋。
*
* @param chessman
* "●"为用户,"○"为计算机。
* @return 开始返回true,反则返回false。
*/
public boolean isReplay(String chessman) throws Exception {
chessboard.printBoard();
String message = chessman.equals(Chessman.BLACK.getChessman()) ? "恭喜您,您赢了,"
: "很遗憾,您输了,";
System.out.println(message + "再下一局?(y/n)");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
if (br.readLine().equals("y")) {
// 开始新一局
return true;
}
return false;
}
/**
* 计算机随机下棋
*/
public int[] computerDo() {
int posX = (int) (Math.random() * (Chessboard.BOARD_SIZE - 1));
int posY = (int) (Math.random() * (Chessboard.BOARD_SIZE - 1));
String[][] board = chessboard.getBoard();
while (board[posX][posY] != "十") {
posX = (int) (Math.random() * (Chessboard.BOARD_SIZE - 1));
posY = (int) (Math.random() * (Chessboard.BOARD_SIZE - 1));
}
int[] result = { posX, posY };
return result;
}
/**
* 判断输赢
*
* @param posX
* 棋子的X坐标。
* @param posY
* 棋子的Y坐标
* @param ico
* 棋子类型
* @return 如果有五颗相邻棋子连成一条直接,返回真,否则相反。
*/
public boolean isWon(int posX, int posY, String ico) {
// 直线起点的X坐标
int startX = 0;
// 直线起点Y坐标
int startY = 0;
// 直线结束X坐标
int endX = Chessboard.BOARD_SIZE - 1;
// 直线结束Y坐标
int endY = endX;
// 同条直线上相邻棋子累积数
int sameCount = 0;
int temp = 0;
// 计算起点的最小X坐标与Y坐标
temp = posX - WIN_COUNT + 1;
startX = temp < 0 ? 0 : temp;
temp = posY - WIN_COUNT + 1;
startY = temp < 0 ? 0 : temp;
// 计算终点的最大X坐标与Y坐标
temp = posX + WIN_COUNT - 1;
endX = temp > Chessboard.BOARD_SIZE - 1 ? Chessboard.BOARD_SIZE - 1
: temp;
temp = posY + WIN_COUNT - 1;
endY = temp > Chessboard.BOARD_SIZE - 1 ? Chessboard.BOARD_SIZE - 1
: temp;
// 从左到右方向计算相同相邻棋子的数目
String[][] board = chessboard.getBoard();
for (int i = startY; i < endY; i++) {
if (board[posX][i] == ico && board[posX][i + 1] == ico) {
sameCount++;
} else if (sameCount != WIN_COUNT - 1) {
sameCount = 0;
}
}
if (sameCount == 0) {
// 从上到下计算相同相邻棋子的数目
for (int i = startX; i < endX; i++) {
if (board[i][posY] == ico && board[i + 1][posY] == ico) {
sameCount++;
} else if (sameCount != WIN_COUNT - 1) {
sameCount = 0;
}
}
}
if (sameCount == 0) {
// 从左上到右下计算相同相邻棋子的数目
int j = startY;
for (int i = startX; i < endX; i++) {
if (j < endY) {
if (board[i][j] == ico && board[i + 1][j + 1] == ico) {
sameCount++;
} else if (sameCount != WIN_COUNT - 1) {
sameCount = 0;
}
j++;
}
}
}
return sameCount == WIN_COUNT - 1 ? true : false;
}
public static void main(String[] args) throws Exception {
GobangGame gb = new GobangGame(new Chessboard());
gb.start();
}
}
运行效果图:
资源与学习共享下:
分享到:
相关推荐
【JAVA小程序:JAVA五子棋小游戏】 JAVA是一种广泛使用的编程语言,特别适合开发桌面应用程序,如小游戏。五子棋是一款简单而有趣的双人对战游戏,非常适合初学者进行编程实践。在这个项目中,我们将深入探讨如何用...
【Java五子棋小游戏】是一款基于Java编程语言开发的简单娱乐项目,旨在提供一个100x100网格的棋盘,供玩家体验五子棋的乐趣。在这款游戏中,两个玩家轮流在棋盘上放置黑白棋子,目标是形成任意方向(横、竖、斜)上...
【五子棋java小游戏源码】是一款基于Java编程语言开发的简单却功能强大的桌面游戏。在这款游戏中,玩家可以体验到经典的五子棋玩法,通过编程实现,它展现了Java在游戏开发中的应用潜力。 首先,从编程语言的角度看...
【Java实现五子棋小游戏】是一个适合初学者的项目,旨在帮助那些正在学习Java编程的人提升技能并理解面向对象编程的基本概念。这个小游戏是通过Java语言编写的,它提供了两个玩家之间的互动,允许他们在虚拟棋盘上...
Java五子棋小游戏代码分析 Java五子棋小游戏代码是一个使用Java语言编写的五子棋小游戏,游戏中包括游戏开始、重置游戏、棋盘展示、棋子颜色选择等功能。本文将对游戏代码进行详细分析,揭示游戏的工作机理和实现...
【五子棋小游戏(JAVA)】是一个利用JAVA编程语言实现的桌面游戏项目,它涵盖了GUI图形用户界面的设计以及简单的AI算法。在这个项目中,开发者旨在为玩家提供一个互动且易于理解的五子棋游戏体验。 首先,让我们...
随着计算机的广泛使用,小游戏成为日常生活中的一部分,尤其适合工作间隙的休闲娱乐。五子棋游戏因其简单易懂、策略性强的特点,被选为本次课程设计的主题。开发者需要创建一个15x15的棋盘,玩家可以设置时间限制、...
Java五子棋小游戏是一款基于Java编程语言开发的桌面游戏,主要体现了Java的图形用户界面(GUI)设计和事件处理机制。下面将详细讲解这个项目所涉及的Java知识点。 1. **Swing库**:Java五子棋游戏通常使用Java ...
【基于Java开发的五子棋小游戏】是一款利用Java编程语言实现的桌面娱乐应用程序,它为用户提供了一个简单且有趣的五子棋对弈环境。在这款游戏中,玩家可以选择与计算机AI进行对抗,或者与朋友进行双人对战,体验...
【基于Java的五子棋小游戏源码】是一个学习和实践Java编程的优秀项目,它将游戏开发与基础编程技能相结合,让开发者能够更好地理解和运用面向对象编程思想。五子棋是一种双人对弈的策略游戏,规则简单但变化丰富,...
在本教程中,我们将深入探讨如何使用Java编程语言来实现一个五子棋游戏。五子棋,也称为Gomoku,是一种两人对弈的策略型棋类游戏,目标是在棋盘上连接五个相同颜色的棋子,无论是横、竖还是斜线。下面,我们将详细...
本案例"双人五子棋java小案例"就是一个基于Java实现的基础项目,它展示了如何利用Java来设计和实现一个简单的双人对战五子棋游戏。下面将详细探讨这个项目的相关知识点。 首先,我们需要了解五子棋的基本规则。...
《Java手机游戏五子棋详解》 五子棋是一种古老而深奥的棋类游戏,深受全球玩家喜爱。在IT领域,将这种游戏转化为手机应用是常见的编程实践,特别是对于初学者来说,它是一个很好的学习项目。在这个项目中,我们将...
在本项目中,我们讨论的是一个使用Java编程语言实现的五子棋小游戏。这是一个典型的桌面游戏,玩家通过在棋盘上交替放置黑白棋子,目标是先形成五个连续的同色棋子(横向、纵向或对角线)来赢得比赛。下面我们将详细...
【JAVA编的五子棋游戏】是一款基于Java编程语言开发的桌面游戏,它允许两位玩家在二维棋盘上轮流放置黑白两色的棋子,目标是先形成任意方向(横、竖、斜)连续五个同色棋子的一方获胜。这款五子棋游戏的实现涉及了多...
Java五子棋小游戏,GUI 这款五子棋小游戏基于Java的GUI编写,旨在提供简单而有趣的游戏体验。五子棋是一种传统的二人策略棋类游戏,玩家通过在棋盘上下黑白两色棋子,竞争先在横向、纵向或斜向连成五个棋子的玩法。...
【描述】中提到的"用JAVA写的五子棋小游戏,实现简单的鼠标事件触发",意味着这个游戏的核心功能是通过监听和响应鼠标点击事件来实现的。当用户在棋盘上点击时,程序会检测该位置是否可以合法放置棋子,并更新游戏...
本五子棋游戏小程序仅为简单的单机五子棋,基本功能需求:可两人对下(用鼠标操作),能判断输赢。 1、下棋操作功能需求: (1)实现鼠标可操作黑白子轮流生成并落子。 (2)当相同颜色的棋子连成五子时,能弹出判断...