目录
JAVA五子棋
纯面向对象版本
五子棋类:
public class GoBang {
//长度
private int len = 20;
//棋盘容器
private String[][] goBang = new String[len][len];
//坐标的容器
private String[] nums = {"⒈","⒉","⒊","⒋","⒌","⒍","⒎","⒏","⒐","⒑","⒒","⒓","⒔","⒕","⒖","⒗","⒘","⒙","⒚","⒛"};
//棋盘符号
private String add = "╋";
private String black = "■";
private String white = "○";
/**
* 无参构造并初始化期盼数据以及打印棋盘
*/
public GoBang(){
init();
print();
}
//初始化棋盘数据
private void init(){
for (int i = 0; i < goBang.length; i++) {//i - 表示行数
for (int j = 0; j < goBang[i].length; j++) {//j - 表示列数
if(j == len-1){//每一行的最后一列,设置行数的坐标
goBang[i][j] = nums[i];
}else if(i == len-1){//最后一行,设置列数的坐标
goBang[i][j] = nums[j];
}else{
goBang[i][j] = add;
}
}
}
}
//打印棋盘
public void print(){
for (String[] ss : goBang) {
for (String e : ss) {
System.out.print(e);
}
System.out.println();
}
}
/**
*
* @param x 行
* @param y 列
* @param flag ture为白棋 false黑棋
* @return 状态码
* -1超出棋盘范围
* -2棋盘已落棋子
* 1落子成功
*/
public int play(int x,int y ,boolean flag){
if(x<0 || x>len-2 || y<0 || y>len-2){
return -1;
}
if(!goBang[x][y].equals(add)){
return -2;
}
goBang[x][y] = (flag)?black:white;
return 1;
}
/**
* @param x 行
* @param y 列
* @param flag ture为白棋 false黑棋
* @return num表示右边及落下位置的棋子和
*/
private int right(int x,int y,boolean flag){
int num =1;
for(int i=y;i<=18;i++){
boolean bool =goBang[x][i+1].equals((flag)?black:white);
if(bool==true){
num++;
}else{
break ;
}
}
return num;
}
/**
* @param x 行
* @param y 列
* @param flag ture为白棋 false黑棋
* @return num 表示 落子的左边及落下位置的棋子和
*/
private int left(int x,int y,boolean flag){
int num =1;
for(int i=y;i>=1;i--){
boolean bool =goBang[x][i-1].equals((flag)?black:white);
if(bool==true){
num++;
}else{
break ;
}
}
return num;
}
/**
* @param x 行
* @param y 列
* @param flag ture为白棋 false黑棋
* @return num 表示 落子的下边及落下位置的棋子和
*/
private int down(int x,int y,boolean flag){
int num =1;
for(int i=x;i<=18;i++){
boolean bool =goBang[i+1][y].equals((flag)?black:white);
if(bool==true){
num++;
}else{
break ;
}
}
return num;
}
/**
* @param x 行
* @param y 列
* @param flag ture为白棋 false黑棋
* @return num 表示 落子的上边及落下位置的棋子和
*/
private int up(int x,int y,boolean flag){
int num =1;
for(int i=x;i>=1;i--){
boolean bool =goBang[i-1][y].equals((flag)?black:white);
if(bool==true){
num++;
}else{
break ;
}
}
return num;
}
/**
* @param x 行
* @param y 列
* @param flag ture为白棋 false黑棋
* @return num 表示 落子的右下边及落下位置的棋子和
*/
private int rightAndDown(int x,int y,boolean flag){
int num =1;
int j=x;
int i=y;
for(;i<=18 && j<=18;){
boolean bool =goBang[j+1][i+1].equals((flag)?black:white);
if(bool==true){
num++;
}else{
break ;
}
j++;
i++;
}
return num;
}
/**
* @param x 行
* @param y 列
* @param flag ture为白棋 false黑棋
* @return num 表示 落子的左上边及落下位置的棋子和
*/
private int leftAndUp(int x,int y,boolean flag){
int num =1;
int j=x;
int i=y;
for(;i>=1 && j>=1;){
boolean bool =goBang[j-1][i-1].equals((flag)?black:white);
if(bool==true){
num++;
}else{
break ;
}
j--;
i--;
}
return num;
}
/**
* @param x 行
* @param y 列
* @param flag ture为白棋 false黑棋
* @return num 表示 落子的左下边及落下位置的棋子和
*/
private int leftAndDown(int x,int y,boolean flag){
int num =1;
int j=x;
int i=y;
for(;i>=1 && j<=18;){
boolean bool =goBang[j+1][i-1].equals((flag)?black:white);
if(bool==true){
num++;
}else{
break ;
}
j++;
i--;
}
return num;
}
/**
* @param x 行
* @param y 列
* @param flag ture为白棋 false黑棋
* @return num 表示 落子的右上边及落下位置的棋子和
*/
private int rightAndup(int x,int y,boolean flag){
int num =1;
int j=x;
int i=y;
for(;j>=1 && i<=18;){
boolean bool =goBang[j-1][i+1].equals((flag)?black:white);
if(bool==true){
num++;
}else{
break ;
}
j--;
i++;
}
return num;
}
/**
*
* @param x
* @param y
* @param flag ture为白棋 false黑棋
* @return 赢了返回ture 输了返回false
*/
public boolean isWin(int x,int y ,boolean flag){
int right =right(x, y, flag); //落子的右边及落下位置的棋子和
int left =left(x, y, flag); //落子的左边及落下位置的棋子和
int down =down(x, y, flag); //落子的下边及落下位置的棋子和
int up =up(x,y,flag); //落子的上边及落下位置的棋子和
int rightAndup=rightAndup(x,y,flag); //落子的右上边及落下位置的棋子和
int leftAndDown =leftAndDown(x,y,flag); //落子的左下边及落下位置的棋子和
int rightAndDown=rightAndDown(x,y,flag); //落子的右下边及落下位置的棋子和
int leftAndUp =leftAndUp(x,y,flag); //落子的左上边及落下位置的棋子和
/*
* (一条直线上棋子的数量-1 ) 是否大于等于五
*/
if(((right+left-1)>=5) || ((down+up-1)>=5) || ((rightAndup+leftAndDown-1)>=5) || ((rightAndDown+leftAndUp-1)>=5)){
System.out.println("恭喜"+((flag)?black:white)+"获得胜利");
return true;
}
return false;
}
}
测试类:
import java.util.Scanner;
public class Test01 {
public static void main(String[] args) {
//创建对象,并初始化数据及打印棋盘
GoBang goBang = new GoBang();
//循环的落子
@SuppressWarnings("all")//正压警告的注解 -- 让这段代码不要报警告
Scanner scan = new Scanner(System.in);
boolean flag = true;//true-黑子 false-白子
while(true){
//输入坐标
System.out.println("请" + ((flag)?"黑":"白") +"子输入坐标:");
int x = scan.nextInt()-1;
int y = scan.nextInt()-1;
//落子
int play= goBang.play(x, y, flag);
if(play==-1){
System.out.println("坐标超出棋盘范围,请重新输入...");
continue;
}else if(play==-2){
System.out.println("坐标上已有棋子,请重新输入...");
continue;
}
//打印棋盘
goBang.print();
//判断输赢
boolean win =goBang.isWin(x, y, flag);
if(win){
break;
}
//置反
flag = !flag;
}
}
}
JAVA五子棋纯方法版本
import java.util.Scanner;
public class Test01 {
public static void main(String[] args) {
/**
* 知识点:五子棋
*
* 提升作业:如何判断五子棋输赢
*/
//长度
int len = 20;
//棋盘容器
String[][] goBang = new String[len][len];
//坐标的容器
String[] nums = {"⒈","⒉","⒊","⒋","⒌","⒍","⒎","⒏","⒐","⒑","⒒","⒓","⒔","⒕","⒖","⒗","⒘","⒙","⒚","⒛"};
//棋盘符号
String add = "╋";
String black = "■";
String white = "○";
//初始化棋盘数据
for (int i = 0; i < goBang.length; i++) {//i - 表示行数
for (int j = 0; j < goBang[i].length; j++) {//j - 表示列数
if(j == len-1){//每一行的最后一列,设置行数的坐标
goBang[i][j] = nums[i];
}else if(i == len-1){//最后一行,设置列数的坐标
goBang[i][j] = nums[j];
}else{
goBang[i][j] = add;
}
}
}
//打印棋盘
for (String[] ss : goBang) {
for (String e : ss) {
System.out.print(e);
}
System.out.println();
}
//循环的落子
@SuppressWarnings("all")//正压警告的注解 -- 让这段代码不要报警告
Scanner scan = new Scanner(System.in);
boolean flag = true;//true-黑子 false-白子
while(true){
//输入坐标
System.out.println("请" + ((flag)?"黑":"白") +"子输入坐标:");
int x = scan.nextInt()-1;
int y = scan.nextInt()-1;
//判断坐标是否超出棋盘范围
if(x<0 || x>len-2 || y<0 || y>len-2){
System.out.println("坐标超出棋盘范围,请重新输入...");
continue;
}
//判断坐标上是否有棋子
if(!goBang[x][y].equals(add)){
System.out.println("坐标上已有棋子,请重新输入...");
continue;
}
//落子
goBang[x][y] = (flag)?black:white;
//打印棋盘
for (String[] ss : goBang) {
for (String e : ss) {
System.out.print(e);
}
System.out.println();
}
if(isWin(x, y, goBang, black, white, flag)){
break;
}
//置反
flag = !flag;
}
}
//右边的
public static int right(int x,int y,String[][] goBang,String black,String white,boolean flag){
int num =1;
for(int i=y;i<=18;i++){
boolean bool =goBang[x][i+1].equals((flag)?black:white);
if(bool==true){
num++;
}else{
break ;
}
}
return num;
}
//左边的
public static int left(int x,int y,String[][] goBang,String black,String white,boolean flag){
int num =1;
for(int i=y;i>=1;i--){
boolean bool =goBang[x][i-1].equals((flag)?black:white);
if(bool==true){
num++;
}else{
break ;
}
}
return num;
}
//下面
public static int down(int x,int y,String[][] goBang,String black,String white,boolean flag){
int num =1;
for(int i=x;i<=18;i++){
boolean bool =goBang[i+1][y].equals((flag)?black:white);
if(bool==true){
num++;
}else{
break ;
}
}
return num;
}
//上面
public static int up(int x,int y,String[][] goBang,String black,String white,boolean flag){
int num =1;
for(int i=x;i>=1;i--){
boolean bool =goBang[i-1][y].equals((flag)?black:white);
if(bool==true){
num++;
}else{
break ;
}
}
return num;
}
//右下
public static int rightAndDown(int x,int y,String[][] goBang,String black,String white,boolean flag){
int num =1;
int j=x;
int i=y;
for(;i<=18 && j<=18;){
boolean bool =goBang[j+1][i+1].equals((flag)?black:white);
if(bool==true){
num++;
}else{
break ;
}
j++;
i++;
}
return num;
}
//左上
public static int leftAndUp(int x,int y,String[][] goBang,String black,String white,boolean flag){
int num =1;
int j=x;
int i=y;
for(;i>=1 && j>=1;){
boolean bool =goBang[j-1][i-1].equals((flag)?black:white);
if(bool==true){
num++;
}else{
break ;
}
j--;
i--;
}
return num;
}
//左下
public static int leftAndDown(int x,int y,String[][] goBang,String black,String white,boolean flag){
int num =1;
int j=x;
int i=y;
for(;i>=1 && j<=18;){
boolean bool =goBang[j+1][i-1].equals((flag)?black:white);
if(bool==true){
num++;
}else{
break ;
}
j++;
i--;
}
return num;
}
//右上
public static int rightAndup(int x,int y,String[][] goBang,String black,String white,boolean flag){
int num =1;
int j=x;
int i=y;
for(;j>=1 && i<=18;){
boolean bool =goBang[j-1][i+1].equals((flag)?black:white);
if(bool==true){
num++;
}else{
break ;
}
j--;
i++;
}
return num;
}
public static boolean isWin(int x,int y,String[][] goBang,String black,String white,boolean flag){
int right = right(x,y,goBang,black,white,flag);
int left = left(x, y, goBang, black, white, flag);
int down =down(x, y, goBang, black, white, flag);
int up =up(x,y,goBang,black,white,flag);
int rightAndDown =rightAndDown(x,y,goBang,black,white,flag);
int leftAndUp =leftAndUp(x,y,goBang,black,white,flag);
int rightAndUp =rightAndup(x,y,goBang,black,white,flag);
int leftAndDown =leftAndDown(x,y,goBang,black,white,flag);
if((right+left-1)>=5 ||(down+up-1)>=5 || (rightAndDown+leftAndUp-1)>=5 || (rightAndUp+leftAndDown-1)>=5){
System.out.println("恭喜"+((flag)?black:white)+"获得胜利");
return true;
}
return false;
}
}