使用二维数组存储棋盘信息,重复使用输出方法
定义棋盘
- 对棋盘这个二维数组进行初始化数据(全局定义)
- 打印输出(方法1初始化定义棋盘,方法2打印棋盘)
开始下棋,判断黑白双方谁下棋,交替下棋
- 一直下棋(while(true)),黑白交替(flag=true/false)
- 输入棋子的坐标,行和列(注意减一)
- 判断棋子的位置是否重复和越界(越界后应当重新输入)
判断输赢(每一步都得进行判断)
定义需要的图形,棋盘上的图案,棋子等。
static String[][] qp = new String[15][15]; //{{null,null},{null,null}}
static String white = "☆";
static String black = "★";
static String[] num = {"⒈", "⒉", "⒊", "⒋", "⒌", "⒍", "⒎", "⒏", "⒐", "⒑", "⒒", "⒓", "⒔", "⒕", "⒖"};
static String line = "十";
for (int i = 0; i < qp.length; i++) {
for (int j = 0; j < qp[i].length; j++) {
qp[i][j] = line;
//将棋盘的线被表示出来
if (j == qp.length - 1) {
qp[i][j] = num[i];
//最后一列变成数字来表示行数
}
if (i == qp.length - 1) {
qp[i][j] = num[j];
//最后一行变成数字来表示列数
}
}
}
接着将棋盘进行打印,每下一步棋都得将棋盘打印一次,同样是利用for循环,记得换行。
for (int i = 0; i < qp.length; i++) {
for (int j = 0; j < qp[i].length; j++) {
System.out.print(qp[i][j]);
//正常打印完一行
}
System.out.println();
//循环完一个i就换行
}
- 准备开始下棋,由于你俩在下棋,一直在下,直到分出胜负,故使用while循环,条件就是true,如果胜利,可以使用break跳出循环。
- 为了实现轮流下棋的目的,可以使用Boolean类型的变量,如果是true,则轮到白棋,反之,可在代码块的末尾将其赋值为false,即可实现轮流。
- 为了输入坐标,得在类的开头定义一个x和y,先new一个,坐标,在进行输入,注意坐标的x,y要减一
static Scanner zuoBiao = new Scanner(System.in);
int x = zuoBiao.nextInt() - 1;
int y = zuoBiao.nextInt() - 1;
- 输入坐标后,得进行坐标的查重和检查,是否越界和重复,可以定义一个方法,将输入的坐标进行检查,可以学习一下equals方法的用法
public static boolean check(int x, int y) {
if (x < 0 || y < 0 || x >=qp.length - 1 || y >=qp.length - 1) {
//检查是否越界
return false;
}
s(line)) {
//检查是否有重复的,equals方法已被定义,可直接用
//line.quals(qp[x][y])同样可以,两者是一样的,将两个字符串进行比较,返回true or false
return false;
}
return true;
//两种情况之外才是true
}
- 定义一个Boolean型的变量来接收check的返回值,并以此来判断是否进行下一个if结构,如果错误,则打印提醒,并使用continue,跳过余下的代码块,接着重新运行上面的代码
else {
System.out.println("请输入正确的坐标");
continue;
//跳过本次循环余下的部分,重新开始循环
}
- 如果正确,,则进入下棋阶段,将开头已经定义好的棋子类型赋值给棋盘数组,并重新打印棋盘,此时,重新定义一个方法,来检查你下的棋是否连成五个即成功,当然为Boolean型
qp[x][y] = white;
Wzq.printQp();
boolean Win = checkWin(y, x, white);
- 检查输赢的方法,得有x,y传入。首先定义一个水平计数器,再用for循环来计数左右两侧的棋子,如果棋盘上的字符和qz数组中的一致,则水平计数器加加,当计数器大于等于五时,可以返回true,即胜利,同样的方法可以计算垂直方向。
public static boolean checkWin(int y, int x, String qz) {
int spsum = 1;
int xxsum=1;
//水平计数器,开始为1,你下了一个就是1
for (int lx = x - 1; lx >= 0; lx--) {
//计数左边的棋子数
if (qp[y][lx].equals(qz)) {
spsum++;
}
if (spsum >= 5) {
return true;
}
}
for (int rx = x +1; rx <qp.length-1; rx++) {
//计数左边的棋子数
if (qp[y][rx].equals(qz)) {
spsum++;
}
if (spsum >= 5) {
return true;
}
}
return false;
}
- 如果返回true则胜利,反之。以下为完整代码
package Day3;
import java.util.Scanner;
public class Wzq {
static String[][] qp = new String[15][15]; //{{null,null},{null,null}}
static String white = "☆";
static String black = "★";
static String[] num = {"⒈", "⒉", "⒊", "⒋", "⒌", "⒍", "⒎", "⒏", "⒐", "⒑", "⒒", "⒓", "⒔", "⒕", "⒖"};
static String line = "十";
static boolean flag = true;
static Scanner zuoBiao = new Scanner(System.in);
int x = zuoBiao.nextInt() - 1;
int y = zuoBiao.nextInt() - 1;
public static void main(String[] args) {
Wzq.firstQp();
//初始化数据
Wzq.printQp();
//打印输出
Wzq.startQp();
//开始下棋
}
/**
*初始化棋盘
*/
public static void firstQp() {
for (int i = 0; i < qp.length; i++) {
for (int j = 0; j < qp[i].length; j++) {
qp[i][j] = line;
//将棋盘的线被表示出来
if (j == qp.length - 1) {
qp[i][j] = num[i];
//最后一列变成数字来表示行数
}
if (i == qp.length - 1) {
qp[i][j] = num[j];
//最后一行变成数字来表示列数
}
}
}
System.out.println("游戏开始");
}
/**
*打印棋盘,每下完一次棋就更新一次棋盘
*/
public static void printQp() {
for (int i = 0; i < qp.length; i++) {
for (int j = 0; j < qp[i].length; j++) {
System.out.print(qp[i][j]);
}
System.out.println();
}
}
/**
*开始下棋./
*/
public static void startQp() {
while (true) {
//一直循环下棋的过程
if (flag) {
System.out.println("轮到白棋了");
int x = zuoBiao.nextInt() - 1;
int y = zuoBiao.nextInt() - 1;
boolean les = check(x, y);
if (les) {
qp[x][y] = white;
Wzq.printQp();
boolean Win = checkWin(y, x, white);
if(Win){
System.out.println("恭喜白棋获胜");
break;
}
flag = false;
} else {
System.out.println("请输入正确的坐标");
continue;
//跳过本次循环余下的部分,重新开始循环
}
}
else {
System.out.println("轮到黑棋了");
int x = zuoBiao.nextInt() - 1;
int y = zuoBiao.nextInt() - 1;
boolean res = check(x, y);
if (res) {
qp[x][y] = black;
Wzq.printQp();
boolean Win = checkWin(y, x, black);
if(Win){
System.out.println("恭喜黑棋获胜");
}
flag = true;
} else {
System.out.println("请输入正确的坐标");
}
}
}
}
/**
*检查输入的数据是否有误./
*/
public static boolean check(int x, int y) {
if (x < 0 || y < 0 || x >=qp.length - 1 || y >=qp.length - 1) {
//检查是否越界
return false;
}
if (!qp[x][y].equals(line)) {
//检查是否有重复的,equals方法已被定义,可直接用
//line.quals(qp[x][y])同样可以,两者是一样的,将两个字符串进行比较,返回true or false
return false;
}
return true;
//两种情况之外才是true
}
/**
* 检查输赢
*/
public static boolean checkWin(int y, int x, String qz) {
int spsum = 1;
int xxsum=1;
//水平计数器,开始为1,你下了一个就是1
for (int lx = x - 1; lx >= 0; lx--) {
//计数左边的棋子数
if (qp[y][lx].equals(qz)) {
spsum++;
}
if (spsum >= 5) {
return true;
}
}
for (int rx = x +1; rx <qp.length-1; rx++) {
//计数左边的棋子数
if (qp[y][rx].equals(qz)) {
spsum++;
}
if (spsum >= 5) {
return true;
}
}
return false;
}
}
有错误欢迎指出