五子棋功能分析
步骤:1:使用二维数组存储五子棋棋盘功能(初始化,)
2:用黑星和白星表示输入(基本判断:棋子重复,棋子是否越界) 把基本判断定义成方法直接使用
2.1:一直下棋,黑白替换;while(flag)
3:判断输赢;
3.1:左右找 上下找 斜着找
*字符串的二维数组不可以用tostring打印
前期定义
棋盘的格子用十字来表示
白星星和黑星星用来代表棋子
static String[][] qp = new String[15][15]; //{{null,null},{null,null}}
static String[] num = {"⒈","⒉","⒊","⒋","⒌","⒍","⒎","⒏","⒐","⒑","⒒","⒓","⒔","⒕","⒖"};
static String line = "十";
static String white = "☆";
static String black = "★";
static boolean flag = true;//白棋子是true
static int[][] position = new int[14][14];//判断是否走过的路
主方法
public static void main(String[] args) {
ClassWork05.initialChess();
ClassWork05.playChess();
}
初始化棋盘
用两个for循环来放十字
//初始化棋盘----------------------
public static void initialChess(){
for (int i = 0; i < qp.length; i++) {
for (int j = 0; j < qp[i].length; j++) {
if(i == qp.length - 1){//给最后一行放数字
qp[i][j] = num[j];
}else if(j == qp[i].length - 1){//给最后一列放数字
qp[i][j] = num[i];
}else{
qp[i][j] = line;
}
}
}
}
棋盘输出
遍历输出
//输出棋盘----------------------------
public static void printChess(){
for (int i = 0; i < qp.length; i++) {
for (int j = 0; j < qp[i].length; j++) {
System.out.print(qp[i][j]);
}
System.out.println();
}
}
开始下棋
下棋是来回的所以肯定要循环
先判断下棋的位置是否合理
用flag表示黑白棋轮着下
下棋位置合理后,调用判断输赢的方法,判断是否胜利
//开始下棋-------------------
public static void playChess() {
Scanner Myscanner = new Scanner(System.in);
while (true) {
//输出原始棋盘,并且开始下棋
ClassWork05.printChess();
//黑白轮着下棋
if(flag == true){
System.out.println("请白棋开始下棋~");
}else{
System.out.println("请黑棋开始下棋~");
}
//输入行数和列数
System.out.println("请输入行数~");
int x = Myscanner.nextInt() - 1;
System.out.println("请输入列数~");
int y = Myscanner.nextInt() - 1;
//判断是否下棋范围是否合理---请注意两个判断有先后!!!(范围和重复走)
if(x >= 14 || x < 0 || y >= 14 || y < 0){
System.out.println("超出范围,请重新输出(1-14)~");
continue;
}
//把位置存放在数组位置上 1表示走过
//本人想法是用一个二维数组把走过的位置记录起来,然后看是否当前走的路是否是二维数组里存过1
//老师想法:
if(position[x][y] == 1){
System.out.println("该位置已经走过,请重新输出~");
continue;
}else{
position[x][y] = 1;
}
//赋值下棋 并且交换下棋
if (flag) {
qp[x][y] = white;
boolean key = ClassWork05.iswin(x,y,white);
if(key){
ClassWork05.printChess();
break;
}
flag = !flag;
} else {
qp[x][y] = black;
boolean key = ClassWork05.iswin(x,y,black);
if(key){
ClassWork05.printChess();
break;
}
flag = !flag;
}
}
if (flag == true) {
System.out.println("恭喜白棋胜利~");
}else{
System.out.println("恭喜黑棋胜利~");
}
}
判断输赢
四种情况
左右成五个
上下成五个
/斜着成五个
\斜着成五个
每判断一种计数count都要归零
遇到非相同棋子 直接退出循环
//判断输赢
public static boolean iswin(int x,int y,String star){
//先判断左右是否可以能赢1
int count = 0;
//左右查,先向左查
for (int i = y - 1; i >= 0; i--) {
if(star.equals(qp[x][i])) {
count++;
}else break;
}
if(count == 4){
return true;
}
//左不够那就向右查
for (int i = y + 1; i < qp[y].length - 1; i++) {
if(star.equals(qp[x][i])) {
count++;
}else break;
}
if(count == 4){
return true;
}
//上下查,先向上
count = 0;
for (int i = x - 1; i >= 0; i--) {
if(star.equals(qp[i][y])) {
count++;
}else break;
}
if(count == 4){
return true;
}
//上不够那就向下查
for (int i = x + 1; i < qp[x].length - 1; i++) {
if(star.equals(qp[i][y])) {
count++;
}else break;
}
if(count == 4){
return true;
}
//判断斜着 这样样式\ 先向左上 只用一个循环 给里面放两个变量
count = 0;
for (int i = x - 1, j = y - 1; i >= 0 && j >= 0; i--,j--) {
if (star.equals(qp[i][j])) {
count++;
}else break;
}
if(count == 4){
return true;
}
//左上不够那就向右下查
for (int i = x + 1,j = y + 1; i < qp.length - 1 && j < qp[i].length - 1; i++,j++) {
if (star.equals(qp[i][j])) {
count++;
}else break;
}
if(count == 4){
return true;
}
//判断斜着 这样样式 / 先向右上
count = 0;
for (int i = x - 1, j = y + 1; i >= 0 && j < qp[i].length - 1; i--,j++) {
if (star.equals(qp[i][j])) {
count++;
}else break;
}
if(count == 4){
return true;
}
//右上不够那就向左下查
for (int i = x + 1, j = y - 1; i < qp.length - 1 && j >= 0; i++,j--) {
if (star.equals(qp[i][j])) {
count++;
}else break;
}
if(count == 4){
return true;
}
return false;
}