package com.test;

 public class Chessboard {
     //定义二维数组作为棋盘
     private String[][] board;
     //定义棋盘大小
     public static final int BOARD_SIZE=22;

     //初始化棋盘
     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]="十";
             }
         }
     }
     //test函数的意义不明
     public void test(){
         Object[][] array=new Object[10][10];
         for(int i=0;i<array.length;i++){
             for(int j=0;j<array.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");
         }
     }
     //放置棋子
     public void setBoard(int posX,int posY,String chessman){
         this.board[posX][posY]=chessman;
     }
     //返回棋盘
     public String [][] getBoard(){
         return this.board;
     }

 }

Chessboard.java

 package com.test;

 public enum Chessman {
     BLACK("●"),WHITE("○");
     //设置两个静态棋子属性
     //等同于public static final Chessman BLACK=new Chessman("●")
     private String chessman;
     //设置后可通过.BLACK.chessman进行设置棋子种类
     private Chessman(String chessman){
         this.chessman=chessman;
     }
     //返回棋子
     public String getChessman(){
         return this.chessman;
     }
 }

Chessman.java

以上为棋盘类(Chessboard),棋子类(Chessman,枚举类)

最后是游戏类GobangGame.java

 package com.test;

 import java.io.BufferedReader;//输入
 import java.io.InputStreamReader;//输出

 public class GobangGame {
     private final int WIN_COUNT=5;//设置获胜棋子数
     private int posX=0;
     private int posY=0;
     private Chessboard chessboard;//Chessboard类的一个实例

     //将chessboard实例调用
     public GobangGame(Chessboard chessboard){
             this.chessboard=chessboard;
     }
     //接收inputStr里面的x,y值,并赋给posX/Y
     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("pls input position like num,num");
             return false;
         }
         if(posX<0||posX>=Chessboard.BOARD_SIZE||posY<0||posY>=Chessboard.BOARD_SIZE){
             chessboard.printBoard();
             System.out.println("reinput");
             return false;
         }
         //接收chessboard
         String[][] board=chessboard.getBoard();

         if(board[posX][posY]!="十"){
             chessboard.printBoard();
             System.out.println("re input");
             return false;
         }
         return true;
     }
     //游戏主流程函数,配图
     public void start()throws Exception{
         boolean isOver=false;
         chessboard.initBoard();
         chessboard.printBoard();
         BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
         String inputStr=null;
         //若输入不为空,开始循环
         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("pls input the num");
         }
     }
     //是否重新开始游戏
     public boolean isReplay(String chessman)throws Exception{
         chessboard.printBoard();
         String message=chessman.equals(Chessman.BLACK.getChessman())? "you win":"you lose";
         System.out.println(message+"paly again?(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;
     }
     //胜利判定(方法为在当前所下棋子周围进行检查,非遍历棋盘法)
     public boolean isWon(int posX,int posY,String ico){
         int startX=0;//直线开始X坐标
         int startY=0;//直线开始Y坐标
         int endX=Chessboard.BOARD_SIZE-1;//直线结束X坐标
         int endY=endX;//直线结束Y坐标
         int sameCount=0;//同条直线上相邻棋子数
         int temp=0;
         //计算棋子的最小X坐标和Y坐标
         temp=posX-WIN_COUNT+1;
         startX=temp<0?0:temp;//若小于0,则为0
         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();//开始程序
     }
 }
     

其中的start()函数写了多个if语句,可读性较差。附上流程图(^…^!手写渣)

-END

-^^^^^^^^^^^^^^^^^^

-人世几回伤往事,山形依旧枕寒流。

-2016-09-06

疯狂Java讲义 第一章控制台五子棋(代码分析)的更多相关文章

  1. 《疯狂java讲义》笔记 1-5章

    1.编译语言和解释语言理解,摘自李刚老师的<疯狂Java讲义>第三版: 就是说,Java和.net都是编译型有事解释型语言.编译型就是根据不同平台编译成不同的可执行机器码,编译过程中会进行 ...

  2. 《疯狂Java讲义第4版》PDF+代码+课件 电子书pdf 分享

    <疯狂Java讲义(第4版)>是<疯狂Java讲义>的第4版,第4版保持了前3版系统.全面.讲解浅显.细致的特性,全面新增介绍了Java 9的新特性. <疯狂Java讲义 ...

  3. 0038 Java学习笔记-多线程-传统线程间通信、Condition、阻塞队列、《疯狂Java讲义 第三版》进程间通信示例代码存在的一个问题

    调用同步锁的wait().notify().notifyAll()进行线程通信 看这个经典的存取款问题,要求两个线程存款,两个线程取款,账户里有余额的时候只能取款,没余额的时候只能存款,存取款金额相同 ...

  4. 疯狂JAVA讲义---第十二章:Swing编程(五)进度条和滑动条

    http://blog.csdn.net/terryzero/article/details/3797782 疯狂JAVA讲义---第十二章:Swing编程(五)进度条和滑动条 标签: swing编程 ...

  5. 疯狂JAVA讲义第三章之数组篇

    package test;   /** * Desription: * @author orangebook *<br/>网站:<a href="http://www.cr ...

  6. udp协议基础(转自疯狂java讲义)

    第17章  网络编程 17.4  基于UDP协议的网络编程 UDP协议是一种不可靠的网络协议,它在通信实例的两端各建立一个Socket,但这两个Socket之间并没有虚拟链路,这两个Socket只是发 ...

  7. 《疯狂java讲义》读后感

    <疯狂java讲义·第三版>,全书共851页,18章. 目录如下: 第1章 Java语言概述与开发环境 第2章 理解面向对象 第3章 数据类型和运算符 第4章 流程控制与数组 第5章 面向 ...

  8. 【Java】-NO.16.EBook.4.Java.1.007-【疯狂Java讲义第3版 李刚】- Java基础类

    1.0.0 Summary Tittle:[Java]-NO.16.EBook.4.Java.1.007-[疯狂Java讲义第3版 李刚]-  Java基础类 Style:EBook Series:J ...

  9. 【Java】-NO.16.EBook.4.Java.1.008-【疯狂Java讲义第3版 李刚】- 集合/容器

    1.0.0 Summary Tittle:[Java]-NO.16.EBook.4.Java.1.008-[疯狂Java讲义第3版 李刚]- 集合 Style:EBook Series:Java Si ...

随机推荐

  1. UVA 10806 Dijkstra, Dijkstra.

    题意: 从起点走到终点,然后从终点走到起点,其中不能同时走过相同的一条边,问你最小路径长度.先输入终点n,起点为1,接下来输入m,代表有m条边.每条边由起点,终点,长度组成. 分析: 求最小长度,还限 ...

  2. 利用JPEGImageEncoder进行简单的图片压缩

    import java.awt.Dimension; import java.awt.Image; import java.awt.image.BufferedImage; import java.i ...

  3. C#中大List的内存分配

    之前在开发中只用到List的时候几乎就是拿过来就用,从来没有考虑过List的内存分配问题,试想一个有10万元素的List的在构造和添加元素时内存是如何变化的呢?在MSDN上关于List的Capacit ...

  4. REST总结

    REST是Roy Thomas Fielding博士于2000年在他的博士论文中阐述的一种架构风格和设计原则.REST并非一种协议或者标准,事实上它只是阐述了HTTP协议的设计初衷:现在HTTP在网络 ...

  5. MVC和传统的以模板为中心的web架构比较

    特性 以模板为中心 MVC架构 页面产生方式 运行并替换标签中的语句 由模板引擎生产HTML页面 路径解析 映射到文件系统路径,也可以通过rewrite等技术来重定向 由控制器定义,并可以通过路由系统 ...

  6. PHP基础之 define() 函数

    定义和用法 define() 函数定义一个常量. 常量类似变量,不同之处在于: 在设定以后,常量的值无法更改 常量名不需要开头的美元符号 ($) 作用域不影响对常量的访问 常量值只能是字符串或数字 语 ...

  7. (转)(VS2013 )由于应用程序配置不正确,程序未能启动”--原因及解决方法

    今天把别人的程序拿过来编译时通过,但是运行的时候,提示:由于应用程序配置不正确,程序未能启动 搜了一下,各种方法.最终通过下面的方法解决的. 项目--->配置属性---->链接器----& ...

  8. mysql学习(补充)

    修改表名 rename table olderName to newerName; \c 结束不执行 设置字符集 set names gbk; mysql类型 数值型 属性修饰符 zerofill u ...

  9. Error:(108) No resource identifier found for attribute 'style' in package 'android'

    Error:(108) No resource identifier found for attribute 'style' in package 'android' 解决方案: 这是错误的写法: a ...

  10. Swift笔记4

    字符 var str = " hello world " var kong = "" 或者 var  kong  = string()   //定义一个空的字符 ...