人机五子棋

最近自学java,用的是 疯狂java讲义 这本书,这里打卡记录一下。

一个习题,控制台的五子棋游戏。大体框架书中已经给出,这里是补充后的程序。很多东西没有考虑,比如输入的坐标格式不对,超出棋盘的范围等,但其他的应该没有什么大问题了。

另外,电脑下棋是用随机数生成的。源代码如下:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Random;

public class GoBang
{
/**
五子棋,以,为界输入横纵坐标,确定黑棋位置
电脑生成两个随机数,为白棋位置
*/
private static int BOARD_SIZE = 15;
private String[][] board = new String[BOARD_SIZE][BOARD_SIZE];
//初始化棋盘
private void initBoard()
{
for(int i =0;i<BOARD_SIZE;i++)
{
for(int j = 0;j<BOARD_SIZE;j++)
board[i][j] = "十";
}
}

//打印棋盘
private void printBoard()
{
for(int i =0;i<BOARD_SIZE;i++)
{
for(int j = 0;j<BOARD_SIZE;j++)
System.out.print(board[i][j]);
System.out.println();
}
}

//从下棋处扫描判定输赢,x,y为0,-1或1,代表四个方向的直线
private boolean judge(String[][] bd, int[] yx)
{
int[][] YX = new int[][] {{0,1},{1,0},{1,-1},{1,1}};
int y,x,ynew,xnew,ystart,xstart;
//从四个方向判定
for(int j =0; j<4; j++)
{
//取遍4个方向
y = YX[j][0];
x = YX[j][1];
//从起点开始扫描,有5个起点的位置
for(int k = 4;k >=0;k--)
{
//起点位置和扫面方向相反
ystart = yx[0] - k * y;
xstart = yx[1] - k * x;
//考虑起点过界的问题
if (ystart < 0 || ystart >14 || xstart < 0 || xstart >14)
//若过界,则从下一个起点继续
continue;
//一个方向,4个新坐标,连续5子元素相同,胜
for(int i =1;i<5;)
{
//考虑过界的问题
ynew = ystart + i * y;
xnew = xstart + i * x;
if (ynew < 0 || ynew >14 || xnew < 0 || xnew >14)
break;
else if (bd[ynew][xnew] !=bd[ystart] [xstart])
break;
else
{
//迭代语句,放在循环体最后,便于判定胜负
i++;
if (i == 5)
return true;
}
}
}
}
return false;
}

public static void main(String[] args) throws Exception
{
GoBang gb = new GoBang();
Random r = new Random();
gb.initBoard();
gb.printBoard();
System.out.println("以x,y的格式输入您下棋的坐标:");

//获取键盘输入
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String inputStr = null;

while( (inputStr = br.readLine()) != null)
{
String[] posStrArr = inputStr.split(",");
int xPos = Integer.parseInt(posStrArr[0]);
int yPos = Integer.parseInt(posStrArr[1]);
//判定该坐标是否有其他棋子
if (!(gb.board[yPos - 1][xPos -1].equals("十")))
//有棋子,重新输入。忽略当前循环,开始下次循环
{
System.out.println("您下棋的位置不当,请重新输入您下棋的坐标:");
continue;
}
//将对应坐标的元素赋值为黑棋
gb.board[yPos - 1][xPos -1] = "●";
gb.printBoard();
//判定一次输赢
if(gb.judge(gb.board,new int[]{yPos-1,xPos-1}))
{
//System.out.println(gb.judge(gb.board,new int[]{yPos-1,xPos-1}));
System.out.println("●方胜利");
return;
}

//电脑生成两个随机数,并赋值为白棋
//必须先定义,可以不初始化,否则编译时,在循环条件处会报无符号的错误
int yp;
int xp;

do
{
yp = r.nextInt(GoBang.BOARD_SIZE);
xp = r.nextInt(GoBang.BOARD_SIZE);
//判定该坐标是否有其他棋子
}while(!(gb.board[yp][xp].equals("十")));

gb.board[yp][xp] = "○";
gb.printBoard();
//再判定一次输赢
if(gb.judge(gb.board,new int[]{yp,xp}))
{
System.out.println("○方胜利");
return;
}
System.out.println("以x,y的格式输入您下棋的坐标:");
}
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是一个简单的 Python 人机五子棋游戏的示例代码: ```python import random # 初始化棋盘 board = [['+' for i in range(15)] for j in range(15)] # 打印棋盘 def print_board(): for i in range(15): for j in range(15): print(board[i][j], end=' ') print() # 判断是否胜利 def check_win(player): # 横向 for i in range(15): for j in range(11): if board[i][j] == board[i][j+1] == board[i][j+2] == board[i][j+3] == board[i][j+4] == player: return True # 纵向 for i in range(11): for j in range(15): if board[i][j] == board[i+1][j] == board[i+2][j] == board[i+3][j] == board[i+4][j] == player: return True # 斜向 for i in range(11): for j in range(11): if board[i][j] == board[i+1][j+1] == board[i+2][j+2] == board[i+3][j+3] == board[i+4][j+4] == player: return True for i in range(4, 15): for j in range(11): if board[i][j] == board[i-1][j+1] == board[i-2][j+2] == board[i-3][j+3] == board[i-4][j+4] == player: return True return False # 人下棋 def player_go(): while True: print("请输入您要下棋的坐标,格式为 X,Y:") x, y = input().split(',') x, y = int(x), int(y) if x < 0 or x >= 15 or y < 0 or y >= 15: print("坐标不合法,请重新输入!") continue if board[x][y] != '+': print("该位置已有棋子,请重新输入!") continue board[x][y] = 'O' break # AI 下棋 def AI_go(): while True: x, y = random.randint(0, 14), random.randint(0, 14) if board[x][y] == '+': board[x][y] = 'X' break # 游戏主循环 while True: print_board() player_go() if check_win('O'): print_board() print("恭喜,你赢了!") break AI_go() if check_win('X'): print_board() print("很遗憾,你输了!") break ``` 这个游戏很简单,只有一个人类玩家和一个随机下棋的 AI,你可以根据自己的需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值