疯狂Java讲义 第一章控制台五子棋(代码分析)
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讲义 第一章控制台五子棋(代码分析)的更多相关文章
- 《疯狂java讲义》笔记 1-5章
1.编译语言和解释语言理解,摘自李刚老师的<疯狂Java讲义>第三版: 就是说,Java和.net都是编译型有事解释型语言.编译型就是根据不同平台编译成不同的可执行机器码,编译过程中会进行 ...
- 《疯狂Java讲义第4版》PDF+代码+课件 电子书pdf 分享
<疯狂Java讲义(第4版)>是<疯狂Java讲义>的第4版,第4版保持了前3版系统.全面.讲解浅显.细致的特性,全面新增介绍了Java 9的新特性. <疯狂Java讲义 ...
- 0038 Java学习笔记-多线程-传统线程间通信、Condition、阻塞队列、《疯狂Java讲义 第三版》进程间通信示例代码存在的一个问题
调用同步锁的wait().notify().notifyAll()进行线程通信 看这个经典的存取款问题,要求两个线程存款,两个线程取款,账户里有余额的时候只能取款,没余额的时候只能存款,存取款金额相同 ...
- 疯狂JAVA讲义---第十二章:Swing编程(五)进度条和滑动条
http://blog.csdn.net/terryzero/article/details/3797782 疯狂JAVA讲义---第十二章:Swing编程(五)进度条和滑动条 标签: swing编程 ...
- 疯狂JAVA讲义第三章之数组篇
package test; /** * Desription: * @author orangebook *<br/>网站:<a href="http://www.cr ...
- udp协议基础(转自疯狂java讲义)
第17章 网络编程 17.4 基于UDP协议的网络编程 UDP协议是一种不可靠的网络协议,它在通信实例的两端各建立一个Socket,但这两个Socket之间并没有虚拟链路,这两个Socket只是发 ...
- 《疯狂java讲义》读后感
<疯狂java讲义·第三版>,全书共851页,18章. 目录如下: 第1章 Java语言概述与开发环境 第2章 理解面向对象 第3章 数据类型和运算符 第4章 流程控制与数组 第5章 面向 ...
- 【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 ...
- 【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 ...
随机推荐
- css之background的cover和contain的缩放背景图
对于这两个属性,官网是这样解释的: contain 此时会保持图像的纵横比并将图像缩放成将适合背景定位区域的最大大小. 等比例缩放图象到垂直或者水平其中一项填满区域. cover 此时会保持图像的纵横 ...
- <runtime> 的 <assemblyIdentity> 元素和<bindingRedirect> 元素
1.<assemblyIdentity> 元素 包含关于该程序集的标识信息. <assemblyIdentity name="assembly name" pub ...
- C# HTML转换为WORD
使用aspose.words仅需要4句代码,即可搞定. Document doc = new Document(); DocumentBuilder builder = new DocumentBui ...
- CDZSC_2015寒假新人(1)——基础 d
Description These days, I am thinking about a question, how can I get a problem as easy as A+B? It i ...
- 日志管理-将Log4net的配置配置到的独立文件中
转自:http://www.cnblogs.com/zfanlong1314/p/3662679.html使用log4net已经很久了.但从来没有详情了解log4的参数,及具体使用方法.看了周公的博客 ...
- Android 底部Dialog显示
public void showComplainDialog() { ComplainDialog complain_dialog = new ComplainDialog(OrderDetialAc ...
- android studio error configuration with name default not found
Android Studio报错: android studio error configuration with name default not found 在进行sync的时候,提示Error: ...
- Jumpserver
Jumpserver 是一款由python编写开源的跳板机(堡垒机)系统,实现了跳板机应有的功能.基于ssh协议来管理,客户端无需安装agent. 支持常见系统: redhat centos debi ...
- python3.4下遍历文件目录,不需要再特殊处理中文编码
python3.4下遍历文件目录,不需要再特殊处理中文编码 直接使用os.walk来遍历中文目录. os.walk方法返回的是一个三元 tupple(dirpath, dirnames, filena ...
- 今年暑假不AC(贪心)
今年暑假不AC 点我 Problem Description “今年暑假不AC?”“是的.”“那你干什么呢?”“看世界杯呀,笨蛋!”“@#$%^&*%...” 确实如此,世界杯来了,球迷的节日 ...