基于控制台的五子棋小游戏(简易)
程序员文章站
2024-03-18 15:13:04
...
展示
话不多少上代码
源码:
使用:
new完直接运行
public static void main(String[] args) {
new GoBang();
}
GoBang类:
import java.util.Arrays;
import java.util.Scanner;
/**
* @Author Ma Shuai
* @Date 2020-11-23 18:44
* @Version 1.0
*/
public class GoBang {
//输入的x和y坐标
char inX;
char inY;
//数组坐标位置
int x;
int y;
//xy轴数组
final static char[] indexArr = {' ','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
//棋盘总棋子数量
int chessNum=0;
//棋盘初始化标识 true为初始化
boolean flag = true;
//判断当前是执黑还是执白 false为黑
boolean blackWhiteFlag = false;
//当前局是否退出 true为持续运行不退出
boolean thisChess = true;
//判断当前坐标可落子
boolean checkPointFlag = true;
char[][] goBang = null; //棋盘数组
Scanner sc = new Scanner(System.in); //获取键盘输入的对象
/**
* 构造函数作为主入口 new出来对象直接执行
*/
GoBang(){
while (true){
init(); //为了可以重复开始游戏 每次开始前初始化需要的变量
System.out.println("======================●○欢迎来到澳门皇家五子棋游戏世界○●=========================");
System.out.println("1.开始 2.重开 3.退出");
String in = sc.next();
if ( "1".equals( in ) ){
start();
}else if( "2".equals( in ) ){
flag = true;
start();
}else {
break;
}
}
}
/**
* 初始化棋盘和重复黑白下棋
*/
public void start(){
System.out.println("请落子 例如:11 1f ab 回车结束。 输入 q 结束本局。");
if (flag){//棋盘初始化
goBang = new char[16][16];
for (int i = 0; i < indexArr.length; i++) {
for (int j = 0; j < indexArr.length; j++) {
if ( i==0 ){
goBang[i][j] = indexArr[j];
}else if( j==0 ){
goBang[i][j] = indexArr[i];
}else {
goBang[i][j]= '+';
}
}
}
flag = false;
}
//黑白重复下棋
while (thisChess){
show();
playChess();
}
}
/**
* 判断当前是白棋执子还是黑棋执子
*/
public void playChess(){
if (blackWhiteFlag){
System.out.print("白方○:");
getChange();
blackWhiteFlag = false;
}else {
System.out.print("黑方●:");
getChange();
blackWhiteFlag = true;
}
}
/**
* 获取是落子的坐标xy 并判断当前坐标未落子
*/
public void getChange(){
//getxy()返回1为结束本局循环
if( getxy() == 1 ) return;
//判断当前坐标可落子
if( checkPoint() == 1 ) return;
change();
//判断是否获胜
if( checkWin() == 1 ) return;
}
/**
* 获取是落子的坐标xy
* @return 0为成功 1为退出结束本局循环
*/
public int getxy(){
//将玩家输入坐标转换为数组
char[] inArr = sc.next().toCharArray();
if ('q'==inArr[0]) {
thisChess = false; //结束本局循环
flag = true;//本局结束 之后棋盘需要初始化
return 1;
}
inX = inArr[0];
inY = inArr[1];
//获取输入坐标对应的数组index
x = Arrays.binarySearch(indexArr,inX);
y = Arrays.binarySearch(indexArr,inY);
return 0;
}
/**
* 判断当前坐标是否可落子
* @return 返回1表示中途结束本局游戏
*/
public int checkPoint(){
//保证棋子只能下在空位置即'+'位置
while (checkPointFlag){
if (goBang[x][y]=='+'){
checkPointFlag = false;
}else {
System.out.println("此处不可落子,请重新落子!");
System.out.println("请输入:");
//返回1表示玩家输入了q (q为退出)
if ( getxy() == 1 ){
checkPointFlag = true;
return 1;
}
}
}
checkPointFlag = true;
return 0;
}
/**
* 将棋盘+改为对应棋子 判断棋盘是否已满
*/
public void change(){
//落子操作 将当前坐标的'+' 改为blackWhiteFlag对应的玩家的棋子○●
if (blackWhiteFlag) {
goBang[x][y] = '○';
}else {
goBang[x][y] = '●';
}
//棋盘总棋子数加一
chessNum++;
}
/**
* 判断当前落子后是否胜利(八个方向对应四条线任意一条线五子连珠即为胜利)
* @return 返回1表示胜利 结束本局
*/
public int checkWin(){
int re = 0;
//方便玩家的可读性 从棋盘来看我们将纵向作为x 横向作为y
//判断横向
if(checkLine(0,-1) + checkLine(0,1)>=4) re = 1;
//判断纵向
else if(checkLine(-1,0) + checkLine(1,0)>=4) re = 1;
//判断左下右上
else if(checkLine(1,-1) + checkLine(-1,1)>=4) re = 1;
//判断左上右下
else if(checkLine(-1,-1) + checkLine(1,1)>=4) re = 1;
//判断棋盘满了平局
else if( chessNum==(goBang.length-1)*(goBang[0].length-1) ) re = 2;
//有re不为0结束游戏
if (re == 1){
if (blackWhiteFlag){
System.out.println("白棋获胜!!!!!!!");
}else {
System.out.println("黑棋获胜!!!!!!!");
}
}else if (re == 2){
System.out.println("旗鼓相当!!!!!!");
}
if(re != 0){
thisChess = false; //结束本局循环
flag = true;//本局结束 之后棋盘需要初始化
System.out.println("战况如下:");
show();
}
return re;
}
public int checkLine(int addX, int addY){
int checkNum = 0;//记录连续子数不算当前xy子
int checkX = x + addX;
int checkY = y + addY;
char blackWhite;
if (blackWhiteFlag){
blackWhite = '○';
}else {
blackWhite = '●';
}
//轮询查找记录连续棋子数 同时保证数组不越界
while (checkX<goBang[0].length && checkX>0 && checkY<goBang.length && checkY>0 && goBang[checkX][checkY]==blackWhite){
checkNum++;
checkX = checkX + addX;
checkY = checkY + addY;
}
return checkNum;
}
/**
* 展示当前棋盘
*/
public void show(){
for (int i = 0; i < 16; i++) {
for (int j = 0; j < 16; j++) {
System.out.print(goBang[i][j] + " ");
}
System.out.println();
}
}
/**
* 初始化变量
*/
public void init(){
int chessNum=0;//棋盘总棋子数量
flag = true;//棋盘初始化标识 true为初始化
blackWhiteFlag = false;//判断当前是执黑还是执白 false为黑
thisChess = true; //当前局是否退出 true为持续运行不退出
checkPointFlag = true;//判断当前坐标可落子
goBang = null; //棋盘数组
}
}
上一篇: JAVA趣味编程-99乘法表
下一篇: 今天你画树了吗?用Python就可以了!