package com.lagou.task09;
import javax.swing.plaf.synth.SynthGraphicsUtils;
import java.util.Scanner;
/**
* 、2. 编程实现控制台版并支持两人对战的五子棋游戏。
* (1)绘制棋盘 - 写一个成员方法实现
* (2)提示黑方和白方分别下棋并重新绘制棋盘 - 写一个成员方法实现。
* (3)每当一方下棋后判断是否获胜 - 写一个成员方法实现。
* (4)提示: 采用二维数组来模拟并描述棋盘,棋盘如下:
* */
public class Test2 {
/*定义一个长度为[17][17]的整型二维数组*/
private String[][] Array=new String[17][17];
/*获取数组*/
public String[][] getArray() {
return Array;
}
/*初始化棋盘*/
public void initArray(){
for(int i=0;i<Array.length;i++){
for(int j=0;j<Array[i].length;j++){
if(i==0){
if(j==0){
Array[i][j]=" ";
}else{
Array[i][j] = Integer.toHexString(j-1);
}
}
else if(j==0){
if(i==0){
Array[i][j]=" ";
}else {
Array[i][j] = Integer.toHexString(i - 1);
}
}
else {
Array[i][j] = "+";
}
}
}
}
/*显示棋盘*/
public void show(){
for(int i=0;i<Array.length;i++){
for(int j=0;j<Array[i].length;j++){
System.out.print(Array[i][j]+" ");
}
System.out.println();
}
}
/*给数组赋值 指定位置 A 黑方白方 */
public void setArray(int line,int row,boolean flag1){
Array[line][row]=flag1?"A":"B";
}
/***
*落子之后首先先判断在当前行中是否可以获胜:
* @param line 落子的列数···········
* @param row 落子的行数
* @return
*/
public boolean isVictoryRow(int line,int row,boolean flag){
int minRow = row - 4;
int maxRow = row + 4;
String param=flag ? "A" : "B";
//遍历九个格子若有五个相同颜色的棋子连线则为胜
int sum = 0;
if(minRow < 0)
minRow = 0;
if (maxRow >= 16)
maxRow = 16;
for(int i = minRow ; i <= maxRow ; i++){
String piece = Array[line][i];
if(piece == param){
sum ++;
if(sum ==5) //五子连线判断 获胜
return true;
}else{
sum = 0; //若不为同颜色 将sum置为0
}
}
return false;
}
/***
*落子之后首先先判断在当前列中是否可以获胜:
* @param line 落子的列数
* @param row 落子的行数
* @return
*/
public boolean isVictoryLine(int line,int row,boolean flag){
int minLine = line - 4;
int maxLine = line + 4;
String param=flag ? "A" : "B";
//遍历九个格子若有五个相同颜色的棋子连线则为胜
int sum = 0;
//当落子的左边或右边到达边界时,置为0或14
if(minLine < 0)
minLine = 0;
if (maxLine >= 16)
maxLine = 16;
for(int i = minLine ; i <= maxLine ; i++){
String piece = Array[i][row];
if(piece == param){
sum ++;
//五子连线判断 获胜
if(sum ==5)
return true;
}else{
//若不为同颜色 将sum置为0
sum = 0;
}
}
return false;
}
/***
*判断右斜(\)是否获胜:
* @param line 落子的列数
* @param row 落子的行数
* @return
*/
public boolean isVictoryRight(int line,int row,boolean flag){
int sum = 0;
String param=flag ? "A" : "B";
/*判断有效值 4 和 -4 代表棋子的 循环 从左下角 到右上角 一次递减 */
for(int i = 4 ; i > -4 ; i--){
/*判断有效值*/
if(line+i>0 && line+i<16 && row+i>0 && row+i<16)
/*判断 黑方还是白方 有几个成员*/
if(Array[line+i][row+i] == param){
sum ++;
}else{
sum = 0;
}
if(sum == 5)
return true;
}
return false;
}
/***
*判断左斜(/)是否获胜:
* @param line 落子的列数
* @param row 落子的行数
* @return
*/
public boolean isVictoryLeft(int line,int row,boolean flag){
int sum = 0;
String param=flag ? "A" : "B";
for(int i = -4 ; i < 4 ; i++){
if(line+i>0 && line+i<16 && row+i>0 && row+i<16)
if(Array[line+i][row+i] == param){
sum ++;
}else{
sum = 0;
}
if(sum == 5)
return true;
}
return false;
}
//判断是否获胜
public boolean isVictory(int line,int row,boolean falg){
if(isVictoryRow(line,row,falg) || isVictoryLine(line,row,falg) || isVictoryRight(line,row,falg) || isVictoryLeft(line,row,falg))
return true;
return false;
}
public static void main(String[] args) {
/*创建对象*/
Test2 t2=new Test2();
/*初始化数组*/
t2.initArray();
boolean flag=true;
boolean flag1=false;
while(flag){
/*键盘输入*/
Scanner sc=new Scanner(System.in);
System.out.println( !flag1 ? "请黑方下棋" : "请白下棋");
/*获取列舒*/
int line=sc.nextInt();
//获取行数
int row=sc.nextInt();
/*判断输入数值的 正确性*/
if(line<=0 || line >16 || row<=0 || row >16){
System.out.println("下错位置错了");
}else{
/*下棋*/
String[][] array = t2.getArray();
boolean retVal = "+".equals(array[line][row]);
/*判断该当前位置有旗子*/
if(!retVal){
System.out.println("这个地方有旗子 换个地方试试");
}else{
flag1=!flag1;
/*设置当前位置棋子*/
t2.setArray(line,row,flag1);
/*显示棋盘*/
t2.show();
/*判断当前是黑方(A)胜利还是白方(B)胜利*/
boolean Victory = t2.isVictory(line,row,flag1);
/*满足条件停止循环*/
if(Victory){
System.out.println(flag1?"黑旗子战胜":"白棋战胜");
flag=false;
}
}
}
}
}
}