实现五子棋游戏主要分为以下几步:
- a.初始化棋盘
b.打印棋盘 - a.黑白双方交替下棋
b.打印棋盘 - a.判断是否越界
b.判断是否重复
c.判断输赢
其中的1,2.b,3都可以用一个方法打包起来以实现代码复用
对上述方法进行构造
1.a初始化棋盘:
public static void init() {
for (int i = 0; i < qp.length; i++) {
for (int j = 0; j < qp[i].length; j++) {
qp[i][j] = line;
}
}
}
1.b、2.b打印棋盘:
public static void print() {
for (int i = 0; i < qp.length; i++) {
for (int j = 0; j < qp[i].length; j++) {
System.out.print(qp[i][j]);
if(j==qp.length-1) {
System.out.println(num[i]);
}
}
if(i==qp.length-1){
for (int j = 0; j < qp[i].length; j++) {
System.out.print(num[j]);
}
}
}
}
3.a判断是否越界:
public static boolean isRight2(int a,int b) {
if(a<0||a>=qp.length||b<0||b>=qp[0].length){
return true;
}
return false;
}
3.b判断是否重复:
public static boolean isRight1(int a,int b){
if(qp[a][b]==white||qp[a][b]==black){
return true;
}
return false;
}
3.c判断落棋方是否赢
public static boolean isWin(int a,int b) {
int flag1 = 1;
int flag2 = 1;
int flag3 = 1;
int flag4 = 1;
//若输入的棋子左右有相同棋子则检索该棋子所在行,考虑到当a==0或b==0的情况让a(0)与b(0)进入但不对其作减法
if (a==0||b==0||qp[a][b - 1] == qp[a][b]||qp[a][b + 1] == qp[a][b]) {
for (int i = 1; i<=b; i++) {
if(qp[a][b - i] == qp[a][b]){
flag1++;
}
else{
break;
}
}
if(flag1==5){
return true;
}
for (int i = 1; i<=4; i++) {
if(b+i< qp[0].length) {
if (qp[a][b + i] == qp[a][b]) {
flag1++;
} else {
break;
}
}
}
if(flag1==5){
return true;
}
}
//若输入的棋子上下有相同棋子则检索该棋子所在列,考虑到当a==0或b==0的情况让a(0)与b(0)进入但不对其作减法
else if (a==0||b==0||qp[a - 1][b] == qp[a][b]||qp[a + 1][b] == qp[a][b]) {
for (int i = 1; i<=a; i++) {
if(qp[a - i][b] == qp[a][b]){
flag2++;
}
else{
break;
}
}
if(flag2==5){
return true;
}
for (int i = 1; i<=4; i++) {
if(a + i< qp.length) {
if (qp[a + i][b] == qp[a][b]) {
flag2++;
} else {
break;
}
}
}
if(flag2==5){
return true;
}
}
//若输入的棋子左上或右下有相同棋子则检索该棋子所在左上到右下的斜线棋子,考虑到当a==0或b==0的情况让a(0)与b(0)进入但不对其作减法
else if (a==0||b==0||qp[a- 1][b - 1] == qp[a][b]||qp[a + 1][b + 1] == qp[a][b]) {
for (int i = 1; i<=a&&i<=b; i++) {
if(qp[a - i][ b - i] == qp[a][b]){
flag3++;
}
else{
break;
}
}
if(flag3==5){
return true;
}
for (int i = 1; i<=4; i++) {
if(a + i< qp.length&&b + i< qp[0].length) {
if (qp[a + i][b + i] == qp[a][b]) {
flag3++;
} else {
break;
}
}
}
if(flag3==5){
return true;
}
}
//若输入的棋子左下或右上有相同棋子则检索该棋子所在左上到右下的斜线棋子,考虑到当a==0或b==0的情况让a(0)与b(0)进入但不对其作减法
else if (a==0||b==0||qp[a- 1][b + 1] == qp[a][b]||qp[a + 1][b - 1] == qp[a][b]) {
for (int i = 1; i<=4&&i<=a; i++) {
if(b + i< qp[0].length) {
if (qp[a - i][b + i] == qp[a][b]) {
flag4++;
} else {
break;
}
}
}
if(flag4==5){
return true;
}
for (int i = 1; i<=4&&i<=b; i++) {
if(a + i< qp.length&&b + i< qp[0].length) {
if (qp[a + i][b - i] == qp[a][b]) {
flag4++;
}
else {
break;
}
}
}
if(flag4==5){
return true;
}
}
return false;
}
最后将各部分相连,并声明全局变量‘素材’,创建主游戏菜单与胜利后菜单让用户选择是否继续。
全部代码:
public class Test1 {
static Scanner scanner = new Scanner(System.in);
static String white = "☆";
static String black = "★";
static String[][] qp = new String[15][15];
static String[] num = {"⒈", "⒉", "⒊", "⒋", "⒌", "⒍", "⒎", "⒏", "⒐", "⒑", "⒒", "⒓", "⒔", "⒕", "⒖"};
static String line = "十";
public static void main(String[] args) {
System.out.println("☆☆☆☆☆五子棋游戏★★★★★");
System.out.println("1.开始游戏\n2.退出");
System.out.println("请选择(1/2):");
int flag=scanner.nextInt();
switch(flag){
case 1:start();
break;
case 2:
return;
}
}
/**
* 游戏开始
*/
public static void start(){
init();
print();
while(true){
//白棋输入
while(true) {
System.out.println("请输入白棋子行位置:");
int x1 = scanner.nextInt() - 1;
System.out.println("请输入白棋子列位置:");
int y1 = scanner.nextInt() - 1;
if(isRight2(x1,y1)){
System.out.println("棋子越界,重新输入");
continue;
}
if (isRight1(x1, y1)) {
System.out.println("棋子重叠请重新输入");
continue;
}
qp[x1][y1] = white;
System.out.println("白棋输入后棋盘如下图");
print();
if(isWin(x1,y1)){
System.out.println("白棋获胜");;
System.out.println("1.再来一局\n2.退出游戏\n请选择下一步(1/2):");
int flag=scanner.nextInt();
switch (flag){
case 1:start();
break;
case 2:
return;
}
}
break;
}
//黑棋输入
while(true) {
System.out.println("白棋输入后棋盘如下图");
print();
System.out.println("请输入黑棋子行位置:");
int x2 = scanner.nextInt() - 1;
System.out.println("请输入黑棋子列位置:");
int y2 = scanner.nextInt() - 1;
if(isRight2(x2,y2)){
System.out.println("棋子越界,重新输入");
continue;
}
if (isRight1(x2, y2)) {
System.out.println("棋子重叠请重新输入");
continue;
}
qp[x2][y2] = black;
System.out.println("黑棋输入后棋盘如下图");
print();
if(isWin(x2,y2)){
System.out.println("黑棋获胜");
System.out.println("1.再来一局\n2.退出游戏\n请选择下一步(1/2):");
int flag=scanner.nextInt();
switch (flag){
case 1:start();
break;
case 2:
return;
}
}
break;
}
}
}
/**
* 初始化棋盘
*/
public static void init() {
for (int i = 0; i < qp.length; i++) {
for (int j = 0; j < qp[i].length; j++) {
qp[i][j] = line;
}
}
}
/**
*打印棋盘
*/
public static void print() {
for (int i = 0; i < qp.length; i++) {
for (int j = 0; j < qp[i].length; j++) {
System.out.print(qp[i][j]);
if(j==qp.length-1) {
System.out.println(num[i]);
}
}
if(i==qp.length-1){
for (int j = 0; j < qp[i].length; j++) {
System.out.print(num[j]);
}
}
}
}
/**
* 判断输入的棋子是否重叠
* @param a 输入的棋子行数
* @param b 输入的棋子列数
* @return 若重叠则返回true,否则返回false
*/
public static boolean isRight1(int a,int b){
if(qp[a][b]==white||qp[a][b]==black){
return true;
}
return false;
}
/**
* 判断输入的棋子是否越界
* @param a 输入的棋子行数
* @param b 输入的棋子列数
* @return 若越界则返回true,否则返回false
*/
public static boolean isRight2(int a,int b) {
if(a<0||a>=qp.length||b<0||b>=qp[0].length){
return true;
}
return false;
}
/**
* 判断下棋方是否赢了
* @param a 输入的棋子行参数
* @param b 输入的棋子列参数
* @return 若赢了则返回true,否则返回false
*/
public static boolean isWin(int a,int b) {
int flag1 = 1;
int flag2 = 1;
int flag3 = 1;
int flag4 = 1;
//若输入的棋子左右有相同棋子则检索该棋子所在行,考虑到当a==0或b==0的情况让a(0)与b(0)进入但不对其作减法
if (a==0||b==0||qp[a][b - 1] == qp[a][b]||qp[a][b + 1] == qp[a][b]) {
for (int i = 1; i<=b; i++) {
if(qp[a][b - i] == qp[a][b]){
flag1++;
}
else{
break;
}
}
if(flag1==5){
return true;
}
for (int i = 1; i<=4; i++) {
if(b+i< qp[0].length) {
if (qp[a][b + i] == qp[a][b]) {
flag1++;
} else {
break;
}
}
}
if(flag1==5){
return true;
}
}
//若输入的棋子上下有相同棋子则检索该棋子所在列,考虑到当a==0或b==0的情况让a(0)与b(0)进入但不对其作减法
else if (a==0||b==0||qp[a - 1][b] == qp[a][b]||qp[a + 1][b] == qp[a][b]) {
for (int i = 1; i<=a; i++) {
if(qp[a - i][b] == qp[a][b]){
flag2++;
}
else{
break;
}
}
if(flag2==5){
return true;
}
for (int i = 1; i<=4; i++) {
if(a + i< qp.length) {
if (qp[a + i][b] == qp[a][b]) {
flag2++;
} else {
break;
}
}
}
if(flag2==5){
return true;
}
}
//若输入的棋子左上或右下有相同棋子则检索该棋子所在左上到右下的斜线棋子,考虑到当a==0或b==0的情况让a(0)与b(0)进入但不对其作减法
else if (a==0||b==0||qp[a- 1][b - 1] == qp[a][b]||qp[a + 1][b + 1] == qp[a][b]) {
for (int i = 1; i<=a&&i<=b; i++) {
if(qp[a - i][ b - i] == qp[a][b]){
flag3++;
}
else{
break;
}
}
if(flag3==5){
return true;
}
for (int i = 1; i<=4; i++) {
if(a + i< qp.length&&b + i< qp[0].length) {
if (qp[a + i][b + i] == qp[a][b]) {
flag3++;
} else {
break;
}
}
}
if(flag3==5){
return true;
}
}
//若输入的棋子左下或右上有相同棋子则检索该棋子所在左上到右下的斜线棋子,考虑到当a==0或b==0的情况让a(0)与b(0)进入但不对其作减法
else if (a==0||b==0||qp[a- 1][b + 1] == qp[a][b]||qp[a + 1][b - 1] == qp[a][b]) {
for (int i = 1; i<=4&&i<=a; i++) {
if(b + i< qp[0].length) {
if (qp[a - i][b + i] == qp[a][b]) {
flag4++;
} else {
break;
}
}
}
if(flag4==5){
return true;
}
for (int i = 1; i<=4&&i<=b; i++) {
if(a + i< qp.length&&b + i< qp[0].length) {
if (qp[a + i][b - i] == qp[a][b]) {
flag4++;
}
else {
break;
}
}
}
if(flag4==5){
return true;
}
}
return false;
}
}