**题目要求:**实现一个控制台下五子棋的程序。用一个二维数组模拟一个15*15路的五子棋棋盘,把每个元素赋值位“┼”可以画出棋盘, “○”代表该交叉点下了一颗白棋子,“●”代表该交叉点下了一颗黑棋子。每次用户输入要下棋的坐标,然后程序显示出下完后的棋盘,默认黑子先行。
遇到问题:
不知道如何用代码实现判断哪一方先赢。
(内心os:在网上搜的结果给出的代码完成的功能太多了,我这种渣渣的初学者根本看不懂。)
--------------------分割线------------------------------9.21号---------------------------
采用了最简单的方法来完成,每输入一个点的坐标就进行遍历,看是否有五子相连的;一开始想不明白的问题有:不知道怎末判断是不是五子相连;把五子相连的判断函数写出来之后不知道main()函数怎末写了,每输入一个点坐标就进行判断,需要循环,循环条件是什莫呢?while(!judge(x,y))?当然不对,因为这时候都没有输入坐标怎末调用方法呢,一开始写的时候把输入黑子坐标及白子坐标分开来写成两个方法了,后来发现这样不行,因为main方法里就没有点的坐标了,这样judge方法也不能调用了,于是在main方法里定义了x和Y,然后输入点的坐标,用了一个t值来控制循环。
代码如下:
/**
* 五子棋游戏,二维数组
* 五子相连判断算法
* 每输入一个点,就遍历判断一次输赢
*/
package shiyan5;
import java.util.Scanner;
public class shiyan5 {
public static String [][]arr;//全局变量
public static final String BLACK_CHESS="●";
public static final String WHITE_CHESS="○";//棋子
public static void main(String [] args) {
int x;
int y;
int t=0;
init();
while(t==0) {
System.out.println("输入黑子坐标");
Scanner sc=new Scanner(System.in);
System.out.print("请输入x:");
x=sc.nextInt();
System.out.print("请输入y:");
y=sc.nextInt();
black(x,y);
if(!judge(x,y)) {
t=0;
}else {
t=1;
}
System.out.println("输入白子坐标");
System.out.print("请输入x:");
x=sc.nextInt();
System.out.print("请输入y:");
y=sc.nextInt();
white(x,y);
if(!judge(x,y)) {
t=0;
}else {
t=1;
}
}
}
/**
* 对棋盘进行初始化
*/
public static void init() {
arr=new String[15][15];
for(int i=0;i<arr.length;i++) {
for(int j=0;j<arr[i].length;j++) {
arr[i][j]="+";
}
}
}
public static void show() {
for(int i=0;i<arr.length;i++) {
for(int j=0;j<arr[i].length;j++) {
System.out.print(" "+arr[i][j]);
}
System.out.println();
}
}
/*
* 输入黑子坐标
*/
public static void black(int x,int y) {
arr[x][y]=BLACK_CHESS;
show();
}
/*
* 输入白子的坐标
*/
public static void white(int x,int y) {
arr[x][y]=WHITE_CHESS;
show();
}
/*
* 判断输赢
*/
public static boolean judge(int x,int y) {
int i;
int j;
int count=0;//计数
int winflag=1;
//垂直方向
//向上读取
for(i=x-1,j=y;i>=0&&count++<5;i--) {
if(arr[x][y].equals(arr[i][j])) {
winflag++;
}else {
break;
}
}
//向下读取
count=0;
for(i=x+1,j=y;i<15&&count++<5;i++) {
if(arr[x][y].equals(arr[i][j])) {
winflag++;
}else {
break;
}
}
count=0;
if(winflag>=5) {
System.out.println(arr[x][y]+"胜利");
return true;
}else {
winflag=1;
}
//水平方向
//向右读取
for(i=x,j=y+1;j<15&&count++<5;j++) {
if(arr[x][y].equals(arr[i][j])) {
winflag++;
}else {
break;
}
}
count=0;
//向左读取
for(i=x,j=y-1;j>=0&&count++<5;j--) {
if(arr[x][y].equals(arr[i][j])) {
winflag++;
}else {
break;
}
}
count=0;
if(winflag>=5) {
System.out.println(arr[x][y]+"胜利");
return true;
}else {
winflag=1;
}
//主对角线方向
//右下
for(i=x+1,j=y+1;i<15&&j<3&&count++<5;i++,j++) {
if(arr[x][y].equals(arr[i][j])) {
winflag++;
}else {
break;
}
}
count=0;
//左上
for(i=x-1,j=y-1;i>=0&&j>=0&&count++<5;i--,j--) {
if(arr[x][y].equals(arr[i][j])) {
winflag++;
}else {
break;
}
}
count=0;
if(winflag>=5) {
System.out.println(arr[x][y]+"胜利");
return true;
}else {
winflag=1;
}
//斜对角线方向
//右上
for(i=x-1,j=y+1;i>=0&&j<15&&count++<5;i--,j--) {
if(arr[x][y].equals(arr[i][j])) {
winflag++;
}else {
break;
}
}
count=0;
for(i=x+1,j=y-1;i<15&&y>=0&&count++<5;i++,j--) {
if(arr[x][y].equals(arr[i][j])) {
winflag++;
}else {
break;
}
}
count=0;
if(winflag>=5) {
System.out.println(arr[x][y]+"胜利");
return true;
}else {
winflag=1;
}
return false;//所有方向读取完,没有
}
}
---------------------分割线------------------------------------------
学习java的路刚刚开始,要继续加油呀,
2019.9.21