疯狂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 ...
随机推荐
- eclipse安装svn插件,在输入url后,一直卡在in progress界面不懂。
今天遇到上面的情况.网上找了半天都没有找到解决的办法.后来,仔细比对了一下我的eclipse版本和svn版本.发现svn版本真的太老了.用上新的svn后,立马就可以用了 svn - http://su ...
- visual studio 2015 修改类class 文件模板
第一步:找到模板文件 路径:C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\ItemTemplates\CSharp\C ...
- Windows Server 2008 R2 IIS重装
背景描述: 在一个刚睡醒午觉后的下午,忽然收到客户反馈,说昨天开始应用特别卡,各种卡各种不好用,忽然想到上次说要优化服务器IIS配置还一直没弄,然后迷迷糊糊的就开始进行客户现场服务器IIS配置优化,涉 ...
- html 调用 activeX(c++)
1.新建MFC ActiveX 2.添加方法 3.找到add函数编写代码 4.在test.idl中找到最后一个uuid 5.编译工程,会自动注册控件 6.html中的代码 <html> & ...
- mysql单表大小的限制
mysql单表大小的限制一.MySQL数据库的MyISAM存储 引擎单表大小限制已经不是有MySQL数据库本身来决定(限制扩大到64pb),而是由所在主机的OS上面的文件系统来决定了.在mysql5. ...
- ckeditor 使用手册
CKEditor使用手册 在使用CKEditor过程中遇到了一些问题,现把它整理成手册,以便随时翻阅. 在页面<head>中引入ckeditor核心文件ckeditor.js <sc ...
- 配置managed server
managed server往往是部署应用程序的server,所以最好在weblgoic上配置上managed server,不要把应用程序直接部署到admin server上. 一.受管服务器的创建 ...
- Servlet Examples
Servlet Examples Servlet Examples 1.Hello World output: code: 1.import java.io.*;2.import javax.serv ...
- java初学者必看经典
配置java环境变量: JAVA_HOME:配置JDK的目录 CLASSPATH:指定到哪里去找运行时需要用到的类代码(字节码) PATH:指定可执行程序的位置 LINUX系统(在" .ba ...
- oracle全文检索笔记
1.删除词法解析器 exec ctx_ddl.drop_preference('my_lexer'); 2.创建中文词法解析器 exec ctx_ddl.create_preference ('my_ ...