package com.lddx.game;
import java.util.Scanner;
//五子棋游戏
/*
* 做出棋盘,实现黑白双方落子,实现黑白双方重复落子的功能,实现黑白双方胜利的功能
*
*/
public class wuziqi {
/**
* @param args
*/
//静态初始化二维数组,表示棋盘
/*
* 语法:数据类型[][] 数组名={数组1,数组2......};
*/
/*static char[][] chess={
{' ','0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'},
{'0','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*'},
{'1','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*'},
{'2','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*'},
{'3','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*'},
{'4','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*'},
{'5','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*'},
{'6','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*'},
{'7','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*'},
{'8','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*'},
{'9','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*'},
{'a','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*'},
{'b','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*'},
{'c','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*'},
{'d','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*'},
{'e','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*'},
{'f','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*','*'}};*/
//动态初始化二维数组 棋盘
static char[][] chess=new char[17][17];
//自定义方法--往棋盘填充棋盘内容
public static void fillChess(){
char[] c={' ','0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
for(int i=0;i<chess.length;i++){
for(int j=0;j<chess[i].length;j++){//j表示访问数组每一行的列
chess[i][j]='*';
}
}
//chess[0]=c;
for(int m=0;m<c.length;m++){
chess[m][0]=chess[0][m]=c[m];
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
//使用循环将数组chess中的内容输出
// 数组名。length 二维数组的行
//数组名【下标】.length 二维数组中的某一列
// for(int i=0;i<chess.length;i++){
// for(int j=0;j<chess[i].length;j++){
// System.out.print(chess[i][j]+" ");
// }
// System.out.println();
// }
fillChess();
printChess();
boolean flag=true;
//flag表示控制和白方的开关,设定flag的值为true,控制黑方落子
//设定flag的值为false,控制白方落子
while(true){
if(flag){//控制黑方落子
//黑方落子
System.out.println("请黑方落子:");
//调用方法实现黑方从控制台输入
String strBlack=sc.next();
System.out.println("黑方输入的内容为:"+strBlack);
//charAt(下标)根据下标将字符串拆分成为字符
/*
* "abcdef"
* 下标 012345 charAt(2)--》'c'
* 将黑方输入的内容拆分“35” “af”
*/
char cB1=strBlack.charAt(0);
char cB2=strBlack.charAt(1);
System.out.println("行是:"+cB1);
System.out.println("列是:"+cB2);
/*
* 假设黑方输入的是4行8列
* 对应的数组的行下标是5,列下标是9
*/
//chess[cB1][cB2]='@';
int numA=isHaveChess(cB1,cB2);
if(numA==1){
System.out.println("该位置上已经有棋子了,请重新输入");
flag=true;
}else{
updateBlackChess(cB1,cB2);
// for(int i=0;i<chess.length;i++){
// for(int j=0;j<chess[i].length;j++){
// System.out.print(chess[i][j]+" ");
// }
// System.out.println();
// }
printChess();
if(isBlackWin()){
System.out.println("恭喜你,黑方胜利!");
break;//结束循环
}
flag=false;
}
// updateBlackChess(cB1,cB2);
//将棋盘的内容重新输出一遍
// for(int i=0;i<chess.length;i++){
// for(int j=0;j<chess[i].length;j++){
// System.out.print(chess[i][j]+" ");
// }
// System.out.println();
// }
// printChess();
//flag=false;
}
if(!flag){//控制白方落子
System.out.println("请白方落子:");
String strWhite=sc.next();
System.out.println("白方输入的内容为:"+strWhite);
//charAt(下标)根据下标将字符串拆分成为字符
/*
* "abcdef"
* 下标 012345 charAt(2)--》'c'
* 将黑方输入的内容拆分“35” “af”
*/
char cW1=strWhite.charAt(0);
char cW2=strWhite.charAt(1);
System.out.println("行是:"+cW1);
System.out.println("列是:"+cW2);
//chess[11][16]='0';
int numB=isHaveChess(cW1,cW2);
if(numB==1){
System.out.println("该位置上已经有棋子了,请重新输入");
flag=false;
}else{
updateWhiteChess(cW1,cW2);
// for(int i=0;i<chess.length;i++){
// for(int j=0;j<chess[i].length;j++){
// System.out.print(chess[i][j]+" ");
// }
// System.out.println();
// }
printChess();
if(isWhiteWin()){
System.out.println("恭喜你,白方胜利!");
break;//结束循环
}
flag=true;
}
}
}
}
public static void printChess(){
for(int i=0;i<chess.length;i++){
for(int j=0;j<chess[i].length;j++){
System.out.print(chess[i][j]+" ");
}
System.out.println();
}
}
//自定义方法--根据黑方在控制台的行和列,找出对应的行下标和列下标,并在对应的行下标和列下标的位置上将*改成@
//参数:c1和c2表示控制台输入的行和列
public static void updateBlackChess(char c1,char c2){
// int x=0,y=0;//变量x和y表示根据输入的行和列找到的行下标和列下标
// char[] cr={' ','0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
// for(int i=0;i<cr.length;i++){
// if(cr[i]==c1){
// x=i;
// }
// if(cr[i]==c2){
// y=i;
// }
// }
//findLocation(c1,c2);
chess[findLocation(c1,c2)[0]][findLocation(c1,c2)[1]]='@';
}
public static void updateWhiteChess(char c1,char c2){
// int x=0,y=0;//变量x和y表示根据输入的行和列找到的行下标和列下标
// char[] cr={' ','0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
// for(int i=0;i<cr.length;i++){
// if(cr[i]==c1){
// x=i;
// }
// if(cr[i]==c2){
// y=i;
// }
// }
chess[findLocation(c1,c2)[0]][findLocation(c1,c2)[1]]='0';
}
public static int[] findLocation(char c1,char c2){
int[] loc=new int[2];
int x=0,y=0;//变量x和y表示根据输入的行和列找到的行下标和列下标
char[] cr={' ','0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
for(int i=0;i<cr.length;i++){
if(cr[i]==c1){
x=i;
}
if(cr[i]==c2){
y=i;
}
}
loc[0]=x;
loc[1]=y;//将存有行列下标的数组返回
return loc;
}
//自定义方法--根据在控制台输入的行和列,判断该位置上是否为0或者@
//该方法如果返回1,表示该位置上有棋子;如果返回0,表示该位置上没有棋子
public static int isHaveChess(char c1,char c2){
//思路:1)根据控制台输入的行c1和列c2先找出对应的行下标和列下标
//a f --》 11 16 3 4--》 4 5
/*
* 2)根据找出的行下标和列下标判断该位置上是0,@还是*
* 3)是0,@返回1 是*返回0
*/
int[] loc=findLocation(c1,c2);
int x=loc[0];
int y=loc[1];
//x和y是我找到的行下标和列下标
if(chess[x][y]=='*'){//该位置上没有棋子的情况
return 0;
}else{//该位置上有棋子的情况
return 1;
}
}
//定义方法--判断黑方胜利
public static boolean isBlackWin(){
//横向是否有连续5个@
for(int i=1;i<chess.length;i++){
//i表示行,取值为1-16
for(int j=1;j<chess[i].length-4;j++){
if(chess[i][j]=='@'&&chess[i][j+1]=='@'&&chess[i][j+2]=='@'&&chess[i][j+3]=='@'&&chess[i][j+4]=='@')
return true;
}
}
//纵向是否有连续5个@
for(int j=1;j<chess[0].length;j++){
for(int i=1;i<chess.length-4;i++){
if(chess[i][j]=='@'&&chess[i+1][j]=='@'&&chess[i+2][j]=='@'&&chess[i+3][j]=='@'&&chess[i+4][j]=='@')
return true;
}
}
//正斜是否有连续5个@
for(int i=1;i<chess.length-4;i++){//表示取值1-12
for(int j=5;j<chess[i].length;j++){
if(chess[i][j]=='@'&&chess[i+1][j-1]=='@'&&chess[i+2][j-2]=='@'&&chess[i+3][j-3]=='@'&&chess[i+4][j-4]=='@')
return true;
}
}
//反斜是否有5个连续@
for(int i=1;i<chess.length-4;i++){//表示取值1-12
for(int j=1;j<chess[i].length-4;j++){
if(chess[i][j]=='@'&&chess[i+1][j+1]=='@'&&chess[i+2][j+2]=='@'&&chess[i+3][j+3]=='@'&&chess[i+4][j+4]=='@')
return true;
}
}
return false;
}
public static boolean isWhiteWin(){
//横向是否有连续5个@
for(int i=1;i<chess.length;i++){
//i表示行,取值为1-16
for(int j=1;j<chess[i].length-4;j++){
if(chess[i][j]=='0'&&chess[i][j+1]=='0'&&chess[i][j+2]=='0'&&chess[i][j+3]=='0'&&chess[i][j+4]=='0')
return true;
}
}
//纵向是否有连续5个@
for(int j=1;j<chess[0].length;j++){
for(int i=1;i<chess.length-4;i++){
if(chess[i][j]=='0'&&chess[i+1][j]=='0'&&chess[i+2][j]=='0'&&chess[i+3][j]=='0'&&chess[i+4][j]=='0')
return true;
}
}
//正斜是否有连续5个@
for(int i=1;i<chess.length-4;i++){//表示取值1-12
for(int j=5;j<chess[i].length;j++){
if(chess[i][j]=='0'&&chess[i+1][j-1]=='0'&&chess[i+2][j-2]=='0'&&chess[i+3][j-3]=='0'&&chess[i+4][j-4]=='0')
return true;
}
}
//反斜是否有5个连续@
for(int i=1;i<chess.length-4;i++){//表示取值1-12
for(int j=1;j<chess[i].length-4;j++){
if(chess[i][j]=='0'&&chess[i+1][j+1]=='0'&&chess[i+2][j+2]=='0'&&chess[i+3][j+3]=='0'&&chess[i+4][j+4]=='0')
return true;
}
}
return false;
}
}
java编写控制台五子棋小程序
猜你喜欢
转载自blog.csdn.net/qq_25368751/article/details/84326297
今日推荐
周排行