五子棋项目设计文档
项目介绍:
本次设计是基于知识点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,无棋子为0
public 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;
}
}