带备注和解释哦。谢谢
package com.neu.test;
import java.util.Scanner;
public class ConnectFour {
private static String[][] qipan = new String[6][7];//棋盘
public static String NULL_DISK = " ";//未下子的状态
public static String RED_DISK = " R ";//未下子的状态
public static String YELLOW_DISK = " Y ";//未下子的状态
private static boolean finished=false;//是否结束
private static Disk disk;
public static void main(String[] args) {
initGrid();
Scanner scan = new Scanner(System.in);
while (true){
System.out.print("请"+disk.remark+"子落子:");
String line = scan.nextLine();
DropDisk(line);
if(finished){
break;
}
}
}
/**
* 落子
* @param loc
*/
private static void DropDisk(String loc){
//TODO 严格点应该再判断输入的数据格式是否符合标准,还有是否超出棋盘区域
String[] locArr = loc.split(" ");
int locX = Integer.valueOf(locArr[0]);
int locY = Integer.valueOf(locArr[1]);
if(qipan[locX][locY].equals(NULL_DISK)){
qipan[locX][locY] = disk.val;
checkWin();
disk = disk.next();
drawGrid();
}else{
System.out.println("该位置已经有棋子!!!!");
}
}
/**
* 检查游戏是否结束
*/
public static void checkWin(){
boolean keep = true;
boolean hasBlank = false;
for(int i=0;i<6;i++){
if(!keep){
break;
}
for(int j=0;j<7;j++){
//向右4个子
try{
String q1 = qipan[i][j];
String q2 = qipan[i][j+1];
String q3 = qipan[i][j+2];
String q4 = qipan[i][j+3];
if(disk.val.equals(q1)&&disk.val.equals(q2)&&disk.val.equals(q3)&&disk.val.equals(q4)){
keep=false;
break;
}
}catch (Exception e){
//数组下标越界,不做处理
}
//向下4个子
try{
String q1 = qipan[i][j];
String q2 = qipan[i+1][j];
String q3 = qipan[i+2][j];
String q4 = qipan[i+3][j];
if(disk.val.equals(q1)&&disk.val.equals(q2)&&disk.val.equals(q3)&&disk.val.equals(q4)){
keep=false;
break;
}
}catch (Exception e){
//数组下标越界,不做处理
}
//右下
try{
String q1 = qipan[i][j];
String q2 = qipan[i+1][j+1];
String q3 = qipan[i+2][j+2];
String q4 = qipan[i+3][j+3];
if(disk.val.equals(q1)&&disk.val.equals(q2)&&disk.val.equals(q3)&&disk.val.equals(q4)){
keep=false;
break;
}
}catch (Exception e){
//数组下标越界,不做处理
}
//右上
try{
String q1 = qipan[i][j];
String q2 = qipan[i+1][j-1];
String q3 = qipan[i+2][j-2];
String q4 = qipan[i+3][j-3];
if(disk.val.equals(q1)&&disk.val.equals(q2)&&disk.val.equals(q3)&&disk.val.equals(q4)){
keep=false;
break;
}
}catch (Exception e){
//数组下标越界,不做处理
}
if(NULL_DISK.equals(qipan[i][j])){
//判断是否还有空位,有就可以继续下
hasBlank = true;
}
}
}
if(!keep){
System.out.println(disk.remark+"子获胜,游戏结束!");
finished = true;
}else{
if(!hasBlank){
System.out.println("棋盘已满,平局,游戏结束!");
finished = true;
}
}
}
/**
* 将下好子的棋盘打印出来
*/
public static void drawGrid(){
for(int i=0;i<6;i++){
System.out.print("|");
for(int j=0;j<7;j++){
System.out.print(qipan[i][j]+"|");
}
System.out.println();
}
}
/**
* 棋盘初始化
*/
private static void initGrid(){
System.out.println("初始化棋盘,请稍后...");
for(int i=0;i<6;i++){
for(int j=0;j<7;j++){
qipan[i][j] = NULL_DISK;
}
}
disk = new Disk();
drawGrid();
System.out.println("棋盘准备完毕!!!");
System.out.println("规则:");
System.out.println("在控制台输入要落子的坐标,两个坐标中间用一个空格隔开,如 2 3 输入完毕后回车键进入下一方落子 ");
System.out.println("--------------------------------------");
}
}
/**
* 棋子
*/
class Disk{
public String val;
public String remark;
public Disk(){
this.remark = "红";
this.val = ConnectFour.RED_DISK;
}
public Disk next(){
Disk nextDisk = new Disk();
if(this.val.equals(ConnectFour.RED_DISK)){
nextDisk.remark = "黄";
nextDisk.val = ConnectFour.YELLOW_DISK;
}
return nextDisk;
};
}
package connect;
import java.util.*;
public class connect
{
public static void main(String args[])
{
int start=0;
int count=0;
int count_max=42;
connect_four one=new connect_four();
one.display_board();
do
{
System.out.println("请白子先行");
Scanner in=new Scanner(System.in);
int cow=in.nextInt();
if(one.judge(cow, 1) == 1)
{
start=1;count++;
}
else
{
start=0;
}
}
while(start==0);
one.display_board();
System.out.println();
int color=2;
do
{
//one.getcolor();
System.out.println("对手出棋");
Scanner in=new Scanner(System.in);
//int raw=in.nextInt();
int cow=in.nextInt();
if(one.judge(cow,color)==0)
{
System.out.println("出棋失败,请重新出棋");
}
else
{
count++;
if(one.is_four(cow, color, 0, 1)==1)
{
if(color==1)
System.out.print("\t\t\t\t圈圈");
else
System.out.print("\t\t\t\t叉叉");
System.out.print("胜出\n");
one.display_board();
System.out.println();
return ;
}
if(color==2)color=1;
else color=2;
}
one.display_board();
}
while(count<count_max);
if(count==count_max)
{
System.out.println("\t\t\t\t\t和局");
one.display_board();
System.out.println();
}
}
}
class connect_four
{
private int flag=0; //
private int max_i=6; //最大行
private int max_j=7; //最大列
private int row; //行值
private int cow; //列值
private int [] []chessboard_status=new int[6][7];//棋盘状态
private int [] a = new int[7]; //列的行值
private int chess_color; //棋子颜色
public connect_four() //构造函数初始化棋盘
{
flag=0;
max_i=6;
max_j=7;
row=0;
cow=0;
for(int i=0;i<max_i;i++)
{
for(int j=0;j<max_j;j++)
{
a[j] = 5;
chessboard_status[i][j]=0;
}
}
}
public int judge(int j,int color)
{
switch(j)
{
case 0: if(a[j]>=0) {chessboard_status[a[j]][j]=color;a[j]--;break;}//二维数
//组存放
else return 0;
case 1: if(a[j]>=0) {chessboard_status[a[j]][j]=color;a[j]--;break;}
else return 0;
case 2: if(a[j]>=0) {chessboard_status[a[j]][j]=color;a[j]--;break;}
else return 0;
case 3: if(a[j]>=0) {chessboard_status[a[j]][j]=color;a[j]--;break;}
else return 0;
case 4: if(a[j]>=0) {chessboard_status[a[j]][j]=color;a[j]--;break;}
else return 0;
case 5: if(a[j]>=0) {chessboard_status[a[j]][j]=color;a[j]--;break;}
else return 0;
case 6: if(a[j]>=0) {chessboard_status[a[j]][j]=color;a[j]--;break;}
else return 0;
default: ;
}
return 1;
}
public int judge_status(int i,int j)
{
if(i>-1&&i<max_i&&j>-1&&j<max_j)
if(chessboard_status[i][j]==0)
return 0;
else if(chessboard_status[i][j]==1)
return 1;//白色
else
return 2;//黑色
else return -1;//位置输入超框
}
public void getcolor()
{
if(flag==1)
System.out.print("白棋");
else
System.out.print("黑棋");
System.out.println("\n");
}
public void display_board()
{
char a=1;
char b=0;
System.out.print(" ");
for(int j=0;j<max_j;j++)
{
System.out.print(j+" ");
}
System.out.println();
for(int i=0;i<max_i;i++)
{
for(int j=0;j<max_j;j++)
{
if(j==0)
System.out.print(i);
switch(chessboard_status[i][j])
{
case 0: System.out.print(" *");break;
case 1: System.out.print(" ○");break;
case 2: System.out.print(" ×");break;
}
}
System.out.println();
}
}
public int is_four(int j,int color,int num,int direction)
{
int m=a[j]+1,n=j;
do
{
switch(direction)
{
case 1: m=m+1;n=n;break;
case 2: m=m+1;n=n-1;break;
case 3: m=m;n=n-1;break;
case 4: m=m-1;n=n-1;break;
case 5: m=m-1;n=n;break;
case 6: m=m-1;n=n+1;break;
case 7: m=m;n=n+1;break;
case 8: m=m-1;n=n-1;break;
default :break;
}
if(judge_status(m,n)==color)
{
num++;
if(num==3)
{
return 1;
}
}
else
{
m=a[j]+1;
n=j;
num=0;
direction++;
}
}while(direction!=9);
if(num==3) return 1;
else return 0;
}
}