一、码前分析
- 首先得把棋盘打印出来,使用二维数组储存棋盘信息,和每行每列的标号,这里让棋盘有14行14列
(这里用搜狗输入法里的符号"十"与"⒈","⒉"来表示,因为他们只占一个字符) - 这里用"○"与"●"来分别表示白棋子,与黑棋子,下棋的过程就是棋子覆盖棋盘"十"的过程
- 判断下棋子的位置是否符合规范
- 要有判断输赢的方法
二、代码演示
public class Homework {
static String[][] qp = new String[15][15];//由于棋盘最后一行与最后一列要放行列编号,所以此处要15*15的二维数组
static String line = "十";
static String black = "●";
static String white = "○";
static String [] num = new String[]{
"⒈","⒉","⒊","⒋","⒌","⒍","⒎","⒏","⒐","⒑","⒒","⒓","⒔","⒕","⒖"};
static Scanner sr = new Scanner(System.in);
public static void main(String[] args) {
Homework.initQp();
Homework.printQp();
Homework.startXiaQi();
}
//初始化棋盘的代码
public static void initQp(){
for (int i = 0; i < 15; i++) {
for (int j = 0; j < 15; j++) {
if(i==14){
//棋盘的最后一行是列的标号,所以此行赋num里的标号
qp[i][j] = num[j];
}
else{
//注意此处的if _else的嵌套
if(j==14){
qp[i][j] = num[i];//棋盘最后一列是行的标号
}
else {
qp[i][j] = line;//其他行列是棋盘符号
}
}
}
}
}
//打印棋盘的代码
public static void printQp(){
for (int i = 0; i < 15; i++) {
for (int j = 0; j < 15; j++) {
System.out.print(qp[i][j]);//打印每个棋盘符号
if(j==14) System.out.println();//当列等于14时候要换行操作
}
}
}
//开始下棋的代码
public static void startXiaQi(){
int flag = 0;//定义一个变量,来下黑白棋之间的
while(true){
int row,list;
if(flag==0) {
System.out.println("请黑方落子");
row = sr.nextInt()-1;
list = sr.nextInt()-1;
if(check(row,list)){
qp[row][list] = black;
printQp();
if(isWin(row,list,black)){
System.out.println("黑方胜利");
break;
}
flag = 1;
}
else{
continue;
}
}
else {
System.out.println("请白方落子");
row = sr.nextInt()-1;
list = sr.nextInt()-1;
if(check(row,list)){
qp[row][list] = white;
printQp();
if(isWin(row,list,white)){
System.out.println("白方胜利");
break;
}
flag = 0;
}
else{
continue;
}
}
}
}
//判断棋子位置是否符合规范的代码
public static boolean check(int x,int y){
if(x<0||x>13||y<0||y>13){
System.out.println("棋子已越界,请重新下");
return false;
}
if(!qp[x][y].equals(line)){
System.out.println("棋子重复,请重新下");
return false;
}
else return true;
}
//判断输赢
public static boolean isWin(int x,int y,String qz){
int count = 1;
//横着判断
for (int i = y-1; i >= 0 ; i--) {
//向左
if (qp[x][i].equals(qz)) {
count++; //判断如果是该棋子则计数器+1
if(count >= 5){
//每次计数器+1要判断是否成5个棋子
return true;
}
}
else{
break;
}
}
for (int i = y+1; i < 14 ; i++) {
//向右
if (qp[x][i].equals(qz)) {
count++;
if(count >= 5){
return true;
}
}
else{
count = 1; //当一个方向判断完毕后要给计数器归零,不然会引起其他判断的失误
break;
}
}
//竖着判断
for (int i = x-1; i >= 0; i--) {
//向上判断
if (qp[i][y].equals(qz)) {
count++;
if(count >= 5){
return true;
}
}
else{
break;
}
}
for (int i = x+1; i <14 ; i++) {
//向下判断
if(qp[i][y].equals(qz)){
count++;
if(count >= 5){
return true;
}
}
else{
count = 1;
break;
}
}
//左上右下判断
for (int i = x-1,j = y-1; i >=0&&j>=0 ; i--,j--) {
//左上
//此处的for循环要定义两个变量,因为寻找的那个棋子的行和列都变了
if(qp[i][j].equals(qz)){
count++;
if(count >= 5){
return true;
}
}
else{
break;
}
}
for (int i = x+1,j = y+1; i <14&&j<14 ; i++,j++) {
//右下
if(qp[i][j].equals(qz)){
count++;
if(count >= 5){
return true;
}
}
else{
count = 1;
break;
}
}
//右上左下判断
for (int i = x-1,j = y+1; i >=0&&j<14 ; i--,j++) {
//右上
if(qp[i][j].equals(qz)){
count++;
if(count >= 5){
return true;
}
}
else{
break;
}
}
for (int i = x+1,j = y-1; i <14&&j>=0 ; i++,j--) {
//左下
if(qp[i][j].equals(qz)){
count++;
if(count >= 5){
return true;
}
}
else{
count = 1;
break;
}
}
return false;
}
}
*如果有不足需要改进的地方欢迎指出
有不理解的随时私信*