五子棋判断输赢问题

1、每下一颗棋子,都要判断一下是否有五颗同色棋子相连
   可以使用二维数组来存储下的棋子,数组下标对应棋子位置,数组元素值对应棋子颜色
2、使用数组经常会发生的问题:
   1、在参数传递过程中:空指针异常NullPointException
 1、只声明了数组名、对象名,没有实例化
 2、声明对象名,通过普通方法进行传参,但是传参方法有问题或者忘记调用,所以要记得调用
           最好能用构造方法来传参,这样如没传参,则会报错,给予提醒   IndexOutOf
   2、使用数组时:ArrayIndexOutofBoundsException
      出现问题:  数组下标越界,解决:每次用数组都要判断其下标
 注意:数组下标从0开始,到length-1;
   3、在用递归调用时,会有堆栈溢出问题:一直被调用,或者自己本身调用自己

定义一个Boolean型变量,若其为TRUE,下黑棋,为FALSE,下白棋
每点击一次,统计四个方向的棋子是否有5个同色相连的棋子,如果是,就输出一方胜利,当然也要根据Boolean型变量的值来确定

在C++中实现五子棋判断输赢,核心是在每次落子后检查四个向(水平、垂直、正斜、反斜)是否有五子连珠。以下为具体实现法及代码: ### 思路 在每次落子后,从该落子点出发,沿着水平、垂直、正斜、反斜四个向进行检查,看是否有连续的五个相同棋子。 ### 代码示例 ```cpp #include<iostream> using namespace std; #define maxn 100 int a[maxn][maxn], n; int dir[8][2] = {1, 1, 1, -1, -1, -1, -1, 1, 0, 1, 0, -1, 1, 0, -1, 0}; // 检查坐标是否在棋盘内 int check(int x, int y) { if (x < 0 || y < 0 || x >= n || y >= n) return 0; return 1; } // 判断是否有五子连珠 bool hasFiveInARow(int x, int y) { for (int k = 0; k < 8; k++) { int ct = 1; int nx = x, ny = y; // 正向检查 for (int l = 0; l < 4; l++) { nx = nx + dir[k][0]; ny = ny + dir[k][1]; if (check(nx, ny) && a[x][y] == a[nx][ny]) ct++; else break; } // 反向检查 nx = x - dir[k][0]; ny = y - dir[k][1]; for (int l = 0; l < 4; l++) { if (check(nx, ny) && a[x][y] == a[nx][ny]) ct++; else break; nx = nx - dir[k][0]; ny = ny - dir[k][1]; } if (ct >= 5) return true; } return false; } int main() { cin >> n; for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) cin >> a[i][j]; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (!a[i][j]) continue; if (hasFiveInARow(i, j)) { if (a[i][j] == 1) { cout << "黑棋赢" << endl; return 0; } else { cout << "白棋赢" << endl; return 0; } } } } cout << "不分胜负" << endl; return 0; } ``` ### 代码解释 1. **`check`函数**:用于检查给定的坐标`(x, y)`是否在棋盘内,如果在棋盘内返回1,否则返回0 [^3]。 2. **`hasFiveInARow`函数**:从落子点`(x, y)`出发,沿着8个向(包含正向和反向)检查是否有连续的五个相同棋子。如果有则返回`true`,否则返回`false`。 3. **`main`函数**:读取棋盘大小和棋子布局,遍历棋盘上的每个棋子,调用`hasFiveInARow`函数判断是否有五子连珠。如果有则输出获胜,否则输出“不分胜负” [^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值