学完Java的面向对象章节,利用已学的知识点完成一个简单的五子棋游戏编写。
- 用控制台运行java文件
- 编码格式为ANSI
- 因为没有学到异常处理,输入坐标要严格按照提示
代码如下
/**
* @author WJH-97
* @date 2020/08/28
*/
/*
编程实现控制台版并支持两人对战的五子棋游戏
1). 绘制棋盘
2)提示黑方和白方分别下棋并重新绘制棋盘
3)每当一方下棋后判断是否获胜
4)提示: 采用二维数组来模拟并描述棋盘
*/
import java.util.Scanner;
import java.util.Arrays;
public class TaskTwo{
public static void main(String[] args){
// 创建二维数据,填充元素'+'作为空棋盘
char[][] arr = new char[16][16];
for(int i = 0;i<16;i++){
Arrays.fill(arr[i],'+');
}
TaskTwo tt = new TaskTwo();
//
Scanner sc = new Scanner(System.in);
boolean begin = tt.menu();
boolean flag1 = true; //falg1用于标记此轮的下棋选手,默认白方先下
boolean flag2; //flag2用于标记此轮落子的位置是否合法
//初始化棋盘
if(begin) {
tt.chessBoard(arr);
}
while(begin){
flag2 = tt.play(arr,flag1);
tt.chessBoard(arr);
//判断是否获胜
if(tt.isWin(arr,flag1)){
String str = flag1?"白方":"黑方";
System.out.println("恭喜" + str + "获得胜利!\n\n");
begin = tt.menu();
if(begin){
for(int i = 0;i<16;i++){
Arrays.fill(arr[i],'+');
}
tt.chessBoard(arr);
}
}
//如果成功落子且无玩家获胜,则进入对方回合
if(flag2){
flag1 = !flag1;
}
}
}
/**
* 判断是否有玩家获胜,若有一方获胜,则返回菜单
*/
public boolean isWin(char[][] arr,boolean flag1){
int countRow = 0; //记录横向连珠个数
int countCol = 0; //记录纵向连珠个数
int countDiag1 = 0; //记录正斜连珠个数
int countDiag2 = 0; //记录反斜连珠个数
char ch = flag1?(char)11 : (char)12; //在各自的轮次只判断该轮次的选手是否获胜
// 1. 判断横纵向是否五子连珠
for(int i = 0;i<16;i++){
for(int j = 0;j<16;j++){
//横向
if(ch == arr[i][j]){
countRow++;
if(5 == countRow){
return true;
}
}else{
countRow = 0;
}
//纵向
if(ch == arr[j][i]){
countCol++;
if(5 == countCol){
return true;
}
}else{
countCol = 0;
}
}
countRow = 0;
countCol = 0;
}
//2.1判断下三角正斜向是否五子连珠
for(int i = 0;i<11;i++){
for(int j = i;j<16;j++){
if(ch == arr[j][j-i]){ //
countDiag1++;
if(5 == countDiag1){
return true;
}
}else{
countDiag1 = 0;
}
}
countDiag1 = 0; //换直线清零
}
//2.2 判断上三角正斜向是否五子连珠
for(int i = 0;i>-11;i--){
for(int j = 0;j<16+i;j++){
if(ch == arr[j][j-i]){ //
countDiag1++;
if(5 == countDiag1){
return true;
}
}else{
countDiag1 = 0;
}
}
countDiag1 = 0;
}
//2.3 判断上三角反斜向是否五子连珠
for(int i = -5; i>-16;i--){
for(int j = 0;j<=-i;j++){
if(ch == arr[j][-j-i]){
countDiag2++;
if(5 == countDiag2){
return true;
}
}else{
countDiag2 = 0;
}
}
countDiag2 = 0;
}
//2.4 判断下三角反斜向是否五子连珠
for(int i = -15;i>-32+5;i--){
for(int j = -i-15;j<16;j++){
if(ch == arr[j][-j-i]){
countDiag2++;
if(5 == countDiag2){
return true;
}
}else{
countDiag2 = 0;
}
}
countDiag2 = 0;
}
return false;
}
/**
* 实现下棋功能,并提示黑方和白方下棋
*/
public boolean play(char[][] arr, boolean flag1){
if(flag1){
System.out.print("请白方下棋(输入0-f横纵坐标以空格分隔):");
}else {
System.out.print("请黑方下棋(输入0-f横纵坐标以空格分隔):");
}
Scanner sc = new Scanner(System.in);
String str1 = sc.next();
String str2 = sc.next();
//判断落子是否在棋盘范围内
boolean isStr1 = (str1.charAt(0) >= '0' && str1.charAt(0) <= '9')||(str1.charAt(0) >= 'a' && str1.charAt(0) <= 'f');
boolean isStr2 = (str2.charAt(0) >= '0' && str2.charAt(0) <= '9')||(str2.charAt(0) >= 'a' && str2.charAt(0) <= 'f');
if(!isStr1 || !isStr2){
System.out.println("该位置已超出棋盘范围!请重新输入!\n");
System.out.println("----------------------------------------------------");
return false;
}
int x = Integer.parseInt(str1,16);
int y = Integer.parseInt(str2,16);
if('+' == arr[x][y]){
arr[x][y] = flag1? (char)11: (char)12;
}else{
System.out.println("该位置已有棋子,请重新输入\n");
System.out.println("----------------------------------------------------");
return false;
}
//System.out.println("x = " + x + " y = " + y );
return true;
}
/**
* 显示菜单
*/
public boolean menu(){
System.out.println("---------------五子棋游戏--------------------");
System.out.println(" 1. 开始游戏 ");
System.out.println(" 任意其他整数退出游戏 ");
System.out.println("请选择功能:");
Scanner sc = new Scanner(System.in);
int sele = sc.nextInt();
if(1 == sele){
System.out.println("开始游戏!");
return true;
}else{
return false;
}
}
/**
* 显示棋盘方法
* 输入二维数组
*/
public void chessBoard(char[][] arr){
System.out.println();
for(int i = 0;i<17;i++){
if(0 == i){
System.out.print(" ");
continue;
}
System.out.printf("%x ",i-1);
}
for(int i = 0;i<16;i++){
System.out.println();
System.out.printf("%x",i);
for(int j = 0;j<16;j++){
System.out.print(" " + arr[i][j]);
}
}
System.out.println();
}
}
这是一个非常简单的实现,如果有同学发现有逻辑错误或者不合理之处,希望大家不吝赐教!