简化版五子棋(在控制台操作)
思考:
1.规则:五子棋 黑白棋 谁先连成5个子 谁就赢
2.棋盘 我们用什么去表示棋盘?
+++++++
+++++++
+++++++
那也就是说我们需要创建一个String的二维数组来表示棋盘
3.如何下棋呢?
目前我们的程序是控制台程序,不能说是用点击的方式进行下棋
只能是输入棋子的坐标进行下棋
输入 (1,1) 指的就是在(0,0)处下一个棋子
输入 (4,3) 指的就是在(3,2)处下一个棋子
4.初始化棋盘 initBoard()
5.打印棋盘 printBoard()
6.开始游戏 startGame()
7.下棋(黑白) putDownChess()
8.判断输赢 isGameOver()
上述方法都会去调用棋盘board数据
如果每次讲board当做参数传递个函数的时候 会显得比较麻烦
我们可以将board数据定义为全局变量 任何函数都可以访问的变量
import java.util.*;
class Demo05_15{
/*
五子棋 黑白棋 谁先连成5个子 谁就赢
棋盘 我们用什么去表示棋盘
+++++++
+++++++
+++++++
那也就是说我们需要创建一个String的二维数组来表示棋盘
如何下棋呢?
目前我们的程序是控制台程序,不能说是用点击的方式进行下棋
只能是输入棋子的坐标进行下棋
输入 1,1 指的就是在(0,0)处下一个棋子
初始化棋盘 initBoard()
打印棋盘 printBoard()
开始游戏 startGame()
下棋(黑白) putDownChess()
判断输赢 isGameOver()
上述方法都会去调用棋盘board数据
如果每次讲board当做参数传递个函数的时候 会显得比较麻烦
我们可以将board数据定义为全局变量 任何函数都可以访问的变量
全局变量定义在函数的外面 类的里面 必须public static开头
*/
//全局变量 棋盘 方便函数直接调用 而不需要依次传参
public static String[][] board; //定义为是15*15的棋盘
public static String BLACK_CHESS="O"; //用"0"表示黑棋
public static String WHITE_CHESS="X"; //用"X"表示白棋
public static Scanner scanner=new Scanner(System.in);
public static void main(String[] args){ //主函数
//1.初始化棋盘
initBoard();
//2.打印棋盘
printBoard();
//3.开始游戏
startGame();
}
public static void startGame(){ //开始游戏的函数
/*
黑方 白方 轮流 下棋
*/
int player=0; //player 偶数 黑 ;奇数 白
while(true){
if(player%2==0){ //黑方下棋
System.out.print(">>>请黑方下棋:");
if(!putDownChess(BLACK_CHESS)){
continue;
}
}else{ //白方下棋
System.out.print(">>>请白方下棋:");
if(!putDownChess(WHITE_CHESS)){
continue;
}
}
if(isGameOver()){
break;
}
player++;
}
}
public static boolean isGameOver(){ //判断是否结束游戏,判断输赢或和棋
for(int i=0;i<m.length;i++){
for(int j=0;j<m[i].length;j++){
//向右是否有连续五个数相等
if(j<=m[i].length-5){ //最多判断到该行长度-5,再往后没有五个数了
boolean flag=true; //默认能找到连续五个数相等
for(int c=j+1;c<=j+4;c++){ //若有一个数不行等,循环结束,即该数向右连续五个数不相等
if(m[i][j]!=m[i][c]){
flag=false;
break;
}
}
if(flag){ //如果循环正常结束,说明该数向右连续五个数相等
return true;
}
}
//向下是否有连续五个数相等
if(i<=m.length-5){ //最多判断到该列长度-5,再往下没有五个数了
boolean flag=true;
for(int r=i+1;r<=i+4;r++){
if(m[i][j]!=m[r][j]){ //若有一个数不行等,循环结束,即该数向右连续四个数不相等
flag=false;
break;
}
}
if(flag){
return true;
}
}
//向右下是否有连续四个数相等
if(i<=m.length-5&&j<=m[0].length-5){
boolean flag=true;
for(int r=i+1,c=j+1;r<=i+4;r++,c++){
if(m[i][j]!=m[r][c]){
flag=false;
break;
}
}
if(flag){
return true;
}
}
//向右上是否有连续五个数相等
if(i>=4&&j<=m[0].length-5){
boolean flag=true;
for(int r=i-1,c=j+1;c<=j+4;r--,c++){
if(m[i][j]!=m[r][c]){
flag=false;
break;
}
}
if(flag){
return true;
}
}
}
}
return false;//四个方向都没有连续的
System.out.println("无处可下棋,和棋");
public static boolean putDownChess(String chess){
//用户输入的 (1,1) -> (0,0)
//1 B
int x=scanner.nextInt()-1;
int y=scanner.next().charAt(0)-'A';
if(!board[x][y].equals("+")){ //判断要下的地方是否已有棋子
System.out.println(">>>此处已有棋子,请重新下棋");
//另外一种处理方式 就是讲player定义为全局 此处player--即可
return false;//意味着下棋不成功
}
board[x][y]=chess;
printBoard();
return true; //意味着下棋成功
}
public static void printBoard(){ //在左侧和上侧标注上数字与字母,方便读取行数与列数
System.out.print(" ");
for(int i=0;i<=14;i++){
System.out.print((char)('A'+i)+" ");
}
System.out.println();
for(int i=0;i<board.length;i++){
System.out.printf("%2d ",i+1);
for(int j=0;j<board[i].length;j++){
System.out.print(board[i][j]+" ");
}
System.out.println();
}
}
public static void initBoard(){ //初始化(打印)棋盘,全打印成"+"
board=new String[15][15];
for(int i=0;i<board.length;i++){
for(int j=0;j<board[i].length;j++){
board[i][j]="+";
}
}
}
}
代码仅供参考!!!!!!!