Java之面向对象编程

五子棋(控制台版)是「面向对象编程」中经典的小项目,下面我将提供一种解决视角,仅供参考。

题目描述:

编程实现控制台版并支持两人对战的五子棋游戏。

(1)绘制棋盘 - 写一个成员方法实现

(2)提示黑方和白方分别下棋并重新绘制棋盘 - 写一个成员方法实现。

(3)每当一方下棋后判断是否获胜 - 写一个成员方法实现。

(4)提示: 采用二维数组来模拟并描述棋盘,棋盘如下:

注意点:

  • 五子棋棋盘有且只有一张:单例模式实现
  • 绘制棋盘函数:按行打印二维数组,双层for循环实现
  • 判断落子是否合理:落子是否超出界限,落子是否已存在
  • 胜利与否的判断:四个方向的判断
  • 每个方向的判断方法:9个字符的数组中是否存在5个连续的与当前棋子一样的字符

Gobang类:

import java.util.Scanner;public class Gobang {// 初始化成员变量,落子区域:16*16// 用单例模式实现有且只有一个棋盘private char[][] chessboard = new char[17][17];private static Gobang gb = new Gobang();// 私有化无参构造方法: 绘制棋盘且提示黑子先手private Gobang() {for(int i = 0; i < 17; i++) {for(int j = 0; j < 17; j++) {if (0 == i && 0 == j) {chessboard[i][j] = (char)32;} else if (0 == i && j <= 10) { //控制第一行的情况chessboard[i][j] = (char)(j - 1 + 48);} else if (0 == i && j <= 16) {chessboard[i][j] = (char)(j - 11 + 97);} else if (0 == j && i <= 10) { // 控制第一列的情况chessboard[i][j] = (char)(i - 1 + 48) ;} else if (0 == j && i <= 16) {chessboard[i][j] = (char)(i - 11 + 97);} else {chessboard[i][j] = (char)43;}}}drawChessboard(true);}// 单例模式:从类层级获取棋盘public static Gobang getGobang() {return gb;}// 绘制棋盘的成员方法public void drawChessboard(boolean flag) {System.out.println("--------------------趣味五子棋游戏-------------------");System.out.println("-----------------作者:Vigoroushui------------------");for(int i = 0; i < 17; i++){for(int j = 0; j < 17; j++) {System.out.print(chessboard[i][j]);System.out.print("  ");}System.out.println();}if(true == flag) {System.out.println("--------------------轮到黑方下棋--------------------");} else {System.out.println("--------------------轮到白方下棋--------------------");}}// 判断落子合理性的成员方法public String judgeRationality(String n) {int judge = 0;// 判断当前落子是否超出界限 [0,9]&&[a,f]for(int i = 1; i < 17; i++) {if(String.valueOf(chessboard[0][i]).equals(n)) {judge = 1;break;}}// 如果落子越界,给定"outer"标示符if(1 != judge) {return "outer";}return n;}// 开始五子棋游戏的成员方法public void playChess() {boolean flag = true; //用于控制黑白两方落子的标示符,true代表黑方落子,false代表白方落子Scanner sc = new Scanner(System.in);while(true) {//合理值的判断System.out.println("请输入您要落子的行位置和列位置(如: a 4):");int cow, column;while(true) {String a = judgeRationality(sc.next());String b = judgeRationality(sc.next());// 判断落子是否越界if ("outer".equals(a) || "outer".equals(b)) {System.out.println("您落子落到棋盘外面去了,请重新落子:");}else {// 将输入的值转为二维数组对应的行列下标cow = (int) a.charAt(0) + 1 - 48;column = (int) b.charAt(0) + 1 - 48;if (cow >= 11) {cow = (int) a.charAt(0) + 11 - 97;}if (column >= 11) {column = (int) b.charAt(0) + 11 - 97;}//判断落子是否已存在if ('&' == chessboard[cow][column] || '#' == chessboard[cow][column]) {System.out.println("您落子的位置已有棋子,请重新落子:");}else {break;}}}// 落子if(flag) {chessboard[cow][column] = (char) 38; // 用 & 代表黑方落子} else {chessboard[cow][column] = (char) 35; // 用 # 代表白方落子}// 判断是否胜利,若胜利,则退出循环boolean win = isWin(cow, column);if(win && flag){System.out.println("恭喜黑子获胜!");drawChessboard(true);break;}else if(win && !flag) {System.out.println("恭喜白子获胜!");drawChessboard(false);break;}// 交换对手并重新绘制棋盘flag = !flag;drawChessboard(flag);}}// 判断是否胜利的成员方法public boolean isWin(int cow, int column) {int highBound = 16;int lowBound = 1;// 每次落子连成线只可能有4种情况: 横、纵、左斜、右斜// 创建4个一维数组分别保存四个方向上9个子char[] cowChess = {'*', '*', '*', '*', '*', '*', '*', '*', '*'};char[] columnChess = {'*', '*', '*', '*', '*', '*', '*', '*', '*'};char[] leftDiagonal = {'*', '*', '*', '*', '*', '*', '*', '*', '*'};char[] rightDiagonal = {'*', '*', '*', '*', '*', '*', '*', '*', '*'};rightDiagonal[4] = leftDiagonal[4] = columnChess[4] = cowChess[4] = chessboard[cow][column];// 生成4个方向的成线数组, 例如:横方向 + + + + & & + + +for (int i = 1; i <= 4; i++) {// 生成横方向的成线情况if (column - i >= lowBound) {cowChess[4 - i] = chessboard[cow][column - i];}if (column + i <= highBound) {cowChess[4 + i] = chessboard[cow][column + i];}// 生成纵方向的成线情况if (cow - i >= lowBound) {columnChess[4 - i] = chessboard[cow - i][column];}if (cow + i <= highBound) {columnChess[4 + i] = chessboard[cow + i][column];}// 生成左斜方向上的成线情况if (cow - i >= lowBound && column - i >= lowBound) {leftDiagonal[4 + i] = chessboard[cow - i][column - i];}if (cow + i <= highBound && column + i <= highBound) {leftDiagonal[4 - i] = chessboard[cow + i][column + i];}// 生成右斜方向上的成线情况if (cow - i >= lowBound && column + i <= highBound) {rightDiagonal[4 + i] = chessboard[cow - i][column + i];}if (column - i >= lowBound && cow + i <= highBound) {rightDiagonal[4 - i] = chessboard[cow + i][column - i];}}// 判断4个方向是否存在五子连珠的情况boolean resCowChess = fiveSons(cowChess, cow, column);boolean resColumnChess = fiveSons(columnChess, cow, column);boolean resLeftDiagonal = fiveSons(leftDiagonal, cow, column);boolean resRightDiagonal = fiveSons(rightDiagonal, cow, column);// 若有一个方向上的存在五子连珠的情况,则胜利if(resCowChess || resColumnChess || resLeftDiagonal || resRightDiagonal) {return true;}else {return false;}}// 判断五子连珠的方法,形参为有9个字符的数组(对应四个方向), 当前落子的行和列// 该方法只用于isWin()成员方法中,本质是一维数组中找连续相同的字串private boolean fiveSons(char[] sons, int cow, int column) {int count = 1; // 统计连续子的个数for(int i = 0; i < 5;) {if (sons[i] == chessboard[cow][column]) {for (int j = i + 1; j < 9; j++) {if(sons[j] == sons[j - 1]) {count += 1;if(5 == count) return true; // 若找到五子连珠的情况,则返回胜利标示符true}else {count = 1;i = j;break;}}}i++;}return false;}
}

GobangTest类:

public class GobangTest {public static void main(String[] args) {Gobang g = Gobang.getGobang();g.playChess();Gobang g2 = Gobang.getGobang(); // g和g2指向同一个棋盘}
}

后记:

本文代码所用的开发环境为IntelliJ IDEA,代码块中每一步均有详细的注释。整个项目涉及到的核心知识点为:单例模式的实现、二维数组的使用、类的使用(构造方法、成员变量、成员方法)

Java系列——五子棋的实现相关推荐

  1. 我爱Java系列---【 maven依赖版本冲突的解决方法】

    我爱Java系列---[ maven依赖版本冲突的解决方法] 参考文章: (1)我爱Java系列---[ maven依赖版本冲突的解决方法] (2)https://www.cnblogs.com/hu ...

  2. Java系列笔记(1) - Java 类加载与初始化

    2019独角兽企业重金招聘Python工程师标准>>> 目录 类加载器 动态加载 链接 初始化 示例 类加载器 在了解Java的机制之前,需要先了解类在JVM(Java虚拟机)中是如 ...

  3. 跟老杨学java系列(一)前传

    跟老杨学java系列(一)前传 首先声明一下哈,本人文笔水平有限,不喜勿喷.欢迎大家留言探讨技术问题.其他问题概不回复. 上台来首先做个自我介绍(~~偷师相声开场白),本人从事IT开发行业快二十个年头 ...

  4. java sftpv3client_Ganymed SSH-2 for Java系列8之SFTPv3Client说明

    Ganymed SSH-2 for Java系列8之SFTPv3Client说明: SFTPv3Client是SSH for java的一个SFTP(协议版本 3), 客户端通过SSH-2连接的一个简 ...

  5. Java系列笔记(4) - JVM监控与调优【转】

    Java系列笔记(4) - JVM监控与调优[转] 目录 参数设置 收集器搭配 启动内存分配 监控工具和方法 调优方法 调优实例       光说不练假把式,学习Java GC机制的目的是为了实用,也 ...

  6. java制作五子棋的论文,基于java的五子棋的设计与实现.docx

    摘要:随着社会的不断发展,我们的科技也不断的进步,现在我们的计算机也与我们的生活息息相关,这个时候 Internet能够让我们快速的知道自己想了解的知识.根据计算机的发展过程我们发现如今计算机应用的现 ...

  7. php数据库可转java数据库,php转java 系列2 Spring boo 链接数据库jdbc

    php转java 系列2 Spring boo 链接数据库jdbc JDBC 首先创建一个新项目,在创建项目时要注意导入依赖, 在项目创建成功后就会看到在 pom.xml 文件中找到,但是如果在创建项 ...

  8. Java系列笔记(3) - Java 内存区域和GC机制

    目录 Java垃圾回收概况 Java内存区域 Java对象的访问方式 Java内存分配机制 Java GC机制 垃圾收集器 Java垃圾回收概况 Java GC(Garbage Collection, ...

  9. 五子棋java设计引言_基于JAVA的五子棋游戏系统设计与实现报告.doc

    PAGE \* MERGEFORMAT PAGE \* MERGEFORMAT I 基于JAVA的五子棋游戏系统设计与实现 专 业 电子信息工程 学 生 董永杰 指导教师 曾玉 摘要 PAGE \* ...

最新文章

  1. 查看CPU是i386架构和x86_64架构
  2. Linux中的文件复制:cp和scp
  3. 分析Cocos2d-x横版ACT手游源码 1、公共
  4. 为何大多数人做出来的图表只是一坨屎?
  5. docker inspect 获取 容器 镜像 元数据 简介
  6. c++中#include“stdafx.h”
  7. 湖南加速恢复,“望城速度”强势打样
  8. 初识ABP vNext(11):聚合根、仓储、领域服务、应用服务、Blob储存
  9. 马云宣布退休计划后,阿里巴巴组织架构再次全面升级
  10. 国内访问 Atom 源很慢 解决方案
  11. Linux网络编程复习笔记
  12. Anaconda换源及常用命令
  13. 药品管理系统java_基于Java的药品管理系统
  14. python词云图背景_python词云图之WordCloud
  15. 现代公司制度的法理学基础 (贾登勋 王勇)
  16. Barsetto百胜图全自动美式磨豆咖啡机测评
  17. es6 arry fill
  18. 关于重装系统后没有以太网和wifi的问题解决
  19. 恶心的英特尔的RST驱动
  20. 董明珠的“接班人”出现了!这个22岁小姑娘,凭什么?

热门文章

  1. 350篇天涯论坛经典贴子合集分享(持续更新中ing)
  2. Bounding-box regression in RCNN/Faster-RCNN/SSD
  3. 散列函数的应用及其安全性 付淅 2016012063
  4. 5G消息+应急服务,不止于预警通知
  5. 《机房收费系统》软件需求说明书
  6. 售后服务系统预约工单方便客户报修?
  7. PennyLane 量子神经网络QNN预测sin函数
  8. 驾考记录之科目二(2021-04-26)(上海旗忠考场)
  9. 云学院带你入门云计算:如何理解IaaS、 PaaS、SaaS
  10. c#中new的三个作用