题目
编程实现控制台版并支持两人对战的五子棋游戏。
(1)绘制棋盘 - 写一个成员方法实现
(2)提示黑方和白方分别下棋并重新绘制棋盘 - 写一个成员方法实现。
(3)每当一方下棋后判断是否获胜 - 写一个成员方法实现。
思路分析
- 用二维数组实现期盼的绘制,用’+'代表空棋盘
- 用0代表黑子,1代表白子
- 从控制台输入xy轴位置,判断是否为+
- 分上下、左右、左斜、右斜四个方向判断是否连子成功,四个方向逐一判断,,碰黑子,黑子计数+1,白子清零;碰白子,白子计数+1,黑子清零;碰空白,黑白子计数都清零
代码示例
package com.lagou.homework;
import org.w3c.dom.ls.LSOutput;
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Scanner;
/**
* @author pp_x
* 2. 编程实现控制台版并支持两人对战的五子棋游戏。
*
* (1)绘制棋盘 - 写一个成员方法实现
*
* (2)提示黑方和白方分别下棋并重新绘制棋盘 - 写一个成员方法实现。
*
* (3)每当一方下棋后判断是否获胜 - 写一个成员方法实现。
*/
public class HomeWork2_2 {
static char[][] arr = new char[16][16];//定义一个二维数组作为棋盘
//棋盘初始化的成员方法
public static void init() {
for (int i = 0; i < 16; i++) {
for (int j = 0; j < 16; j++) {
arr[i][j] = '+';//没有下子的位置
}
System.out.println();
}
draw();
}
//绘制棋盘的成员方法
public static void draw() {
for (int i = 0; i < 16; i++) {
for (int j = 0; j < 16; j++) {
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
}
//下棋的方法 控制台输入下棋位置 并判断该处有没有棋子且是否在棋盘范围内
public static void play() {
while (true) {
Scanner sc = new Scanner(System.in);
//黑方先操作
System.out.println("黑子下子ing...");
System.out.println("黑子子想下在第几行:");
int x1 = sc.nextInt();
System.out.println("黑子想下在第几列:");
int y1 = sc.nextInt();
while (true) {
if (x1 > 15 || y1 > 15 || x1<0 || y1<0) {
System.out.println("该位置不在棋盘范围,请重新下子");
System.out.println("黑方下子ing....");
System.out.println("黑子想下在第几行:");
x1 = sc.nextInt();
System.out.println("黑子想下在第几列:");
y1 = sc.nextInt();
} else if (arr[x1][y1] != '+') {
System.out.println("该位置已有棋子,请重新下子");
System.out.println("黑方下子ing....");
System.out.println("黑子想下在第几行:");
x1 = sc.nextInt();
System.out.println("黑子想下在第几列:");
y1 = sc.nextInt();
}
else {
break;
}
}
arr[x1][y1] = '0';//黑子为0
draw();
if (ifWin(x1, y1)) {
System.out.println("黑子胜利!!");
break;
}
//白子操作
System.out.println("白方下子ing....");
System.out.println("白子想下在第几行:");
int x2 = sc.nextInt();
System.out.println("白子想下在第几列:");
int y2 = sc.nextInt();
while (true) {
if (x2 > 15 || y2 > 15 || x2 <0 || y2 <0) {
System.out.println("不在棋盘内,请重新下子");
System.out.println("白方下子ing....");
System.out.println("白子想下在第几行:");
x2 = sc.nextInt();
System.out.println("白子想下在第几列:");
y2 = sc.nextInt();
} else if (arr[x2][y2] != '+') {
System.out.println("此处有子,请重新下子");
System.out.println("白方下子ing....");
System.out.println("白子想下在第几行:");
x2 = sc.nextInt();
System.out.println("白子想下在第几列:");
y2 = sc.nextInt();
} else {
break;
}
}
arr[x2][y2] = '1';//白子为1
draw();
if (ifWin(x2, y2)) {
System.out.println("白子胜利!!");
break;
}
}
}
//判断该遍历 行 、 列 、左斜、 右斜 如果遇到'0' 黑子计数+1 白子计数清零; 如果遇到1 白子计数+1 黑子技术清零; 如果遇到+ 两者都清零;
public static boolean ifWin(int a, int b) {
boolean flag = false;
int countwhite = 0;//白子计数
int countblock = 0;//黑子计数
//上下方向
for (int i = a - 4; i <= a + 4; i++) {
if (i < 16 && i >= 0) {
if (arr[i][b] == '0') {
countblock++;
countwhite = 0;
if (countblock == 5) {
return flag = true;
}
} else if (arr[i][b] == '1') {
countwhite++;
countblock = 0;
if (countwhite == 5) {
return flag = true;
}
} else if (arr[i][b]=='+'){
countwhite= 0;
countblock = 0;
}
}
}
countwhite = 0;
countblock = 0;
System.out.println(countblock+" "+countwhite);
System.out.println();
//左右方向
for (int i = b - 4; i <= b + 4; i++) {
if (i < 16 && i >= 0) {
if (arr[a][i] == '0') {
countblock++;
countwhite = 0;
if (countblock == 5) {
return flag = true;
}
} else if (arr[a][i] == '1') {
countwhite++;
countblock = 0;
if (countwhite == 5) {
return flag = true;
}
} else if (arr[a][i] =='+'){
countwhite= 0;
countblock = 0;
}
}
}
countwhite = 0;
countblock = 0;
System.out.println(countblock+" "+countwhite);
// 左上到右下
for (int i = -4; i <= 4; i++) {
if (a + i < 16 && b + i < 16 && a + i >= 0 && b + i >= 0) {
//
if (arr[a + i][b + i] == '0') {
countblock++;
countwhite = 0;
if (countblock == 5) {
return flag = true;
}
} else if (arr[a + i][b + i] == '1') {
countwhite++;
countblock = 0;
if (countwhite == 5) {
return flag = true;
}
} else if (arr[a + i][b + i]=='+'){
countwhite= 0;
countblock = 0;
}
}
}
countwhite = 0;
countblock = 0;
System.out.println(countblock+" "+countwhite);
//右上到左下
for (int i = -4; i <= 4; i++) {
if (a - i < 16 && b + i < 16 && a - i >= 0 && b + i >= 0) {
if (arr[a - i][b + i] == '0') {
countblock++;
countwhite = 0;
if (countblock == 5) {
return flag = true;
}
} else if (arr[a - i][b + i] == '1') {
countwhite++;
countblock = 0;
if (countwhite == 5) {
return flag = true;
}
} else if (arr[a - i][b + i]=='+'){
countwhite= 0;
countblock = 0;
}
}
}
System.out.println(countblock+" "+countwhite);
return flag;
}
public static void main(String[] args) {
init();//初始化
play();//开始游戏
}
}