五子棋项目设计文档
项目介绍:
本次设计是基于知识点Java类和对象以及数组开发的一个小型五子棋游戏程序。游戏开始时,选择黑棋、白棋开局,将一枚棋子落在棋盘一坐标上,然后轮番落子,如此轮流下子,直到某一方首先在棋盘的竖、横或两斜四方向上的五子连成线,则该方该局获胜。
项目功能:
游戏说明:功能列表如下:
(1)输出棋盘;
(2)提示用户下子;
(3)查看用户是否出界或者落子位置是否被占用;
(4)轮番黑棋白棋选择坐标位置进行下子;
(5)判断游戏是否输赢;
(6)退出游戏。
项目知识点:
Java类和对象、二维数组
项目实现思路:
- 棋盘设计为15*15格,棋盘类型Chess[][] 二维数组,所含属性String chessType; 棋盘首先chessType值是”?”。
- 初始化二维数组
- 玩家选择黑白圈后,开始下棋。输入要下棋子的行列坐标,黑白棋子轮流落子,当一方连成五子或下满棋盘时,游戏结束(连成五子的一方获胜,下满棋盘为和棋)。
- 每一次落子成功后,马上判断以该位置为中心的八个方向:上、下、左、右、左上、左下、右上、右下是否有相同颜色的棋子连成五子,如果连成五子,则游戏结束,输出相应的信息。
- 当游戏一方胜利后显示胜利信息。从程序表面看,这是一个二维平面图,所以数据用二维数组来表示,数组两个下标可以表示棋盘上的位置,数组元素的值代表棋格上的状态,共有三种情况,分别是,?代表白棋,●代表黑棋,?代表格子。
代码实现
Gobang类
import java.util.Arrays;
import java.util.Scanner;
public class Gobang {private CheckBoard[][] checkBoard;private int end;//用于结束开始循环private final int INITSIZE=15;public Gobang(){}//创建棋盘
public void setCheckBoard(){checkBoard=new CheckBoard[INITSIZE][INITSIZE];for(int i=0;i<INITSIZE;i++){for(int j=0;j<INITSIZE;j++){checkBoard[i][j]=new CheckBoard(0,i,j);}}}
//白棋下棋操作
public void white(){Scanner scanner=new Scanner(System.in);System.out.println("轮到白棋");int i=scanner.nextInt();int j=scanner.nextInt();checkBoard[i][j].var=1;if(checkBoard[i][j].win(checkBoard,i,j,INITSIZE,1)){System.out.println("恭喜白棋获胜");end=3;//结束循环}
}
//黑棋下棋操作
public void black(){Scanner scanner=new Scanner(System.in);System.out.println("轮到黑棋");int i=scanner.nextInt();int j=scanner.nextInt();checkBoard[i][j].var=-1;if(checkBoard[i][j].win(checkBoard,i,j,INITSIZE,-1)){System.out.println("恭喜黑棋获胜");end=3;}
}
//打印棋谱
public void print(){for(int i=0;i<INITSIZE;i++){for(int j=0;j<INITSIZE;j++){if(checkBoard[i][j].var==1){System.out.print("?"+" ");}else if (checkBoard[i][j].var==0){System.out.print("?"+" ");}else{System.out.print("?"+" ");}}System.out.println();}
}
//开始下棋操作public void start(){setCheckBoard();end=0;for(;;){if(end!=3){print();white();if(end==3){break;}print();black();}}}
}
CheckBoard类
public class CheckBoard {
// private String piece;private int x;//行private int y;//列public int var;//种类,白色为1,黑色为-1,无棋子为0public CheckBoard(int var,int x,int y){}//改变棋子为白色public void changeWhite(CheckBoard[][] checkBoard,int x,int y){
// checkBoard[x][y].var="○";checkBoard[x][y].var=1;}//改变棋子为黑色public void changeBlack(CheckBoard[][] checkBoard,int x,int y){
// checkBoard[x][y].piece="○";checkBoard[x][y].var=1;}public boolean win(CheckBoard[][] checkBoard,int x, int y,int INITSIZE,int color){int count=0;boolean flag=false;int num=0;//定义一个控制种类的数if(color==1){num=1;//白色}else{num=-1;//黑色}//横向判断for(int i=x-4;i<x+5;i++){if(i<0||x+5>INITSIZE-1){continue;}if(checkBoard[i][y].var==color){count++;}if(count==5){flag=true;}}//纵向判断count=0;for(int j=y-4;j<y+5;j++){if(j<0||y+5>INITSIZE-1){continue;}if(checkBoard[x][j].var==color){count++;}if(count==5){flag=true;}}//左斜判断count=0;for(int i=x-4;i<x+5;i++){if(i<0||x+5>INITSIZE-1){continue;}if(checkBoard[i][i].var==color){count++;}if(count==5){flag=true;}}//右斜判断count=0;for(int i=x-4,j=y+4;i<x+5;i++,j--){if(i<0||x+5>INITSIZE-1||j<0||y+5>INITSIZE-1){continue;}if(checkBoard[i][j].var==color){count++;}if(count==5){flag=true;}}return flag;}}