五子棋---五子相连判断

前言

最近在做一个五子棋游戏,发现其中的五子相连判断算法非常的好,所以总结出来给大家。

算法思路

我们大家都玩过五子棋,棋子在4方向直线上有五个子,那么就表示玩家得胜。4方向分别是横向,纵向,斜向上和斜向下。
棋子4个方向
如果棋手每下一步棋,我们遍历已经下的棋子,判断其4个方向是否够5个棋子,那么这样的效率是不高的。因为我们在下棋之前,那么我们可以知道,棋盘上一定没有5子相连,所以我们就不用去判断已经下的所有棋子,而是直接判断刚下的棋子4个方向的的情况。相对于判断所有棋子,我们这个方法更简单。
因为相邻棋子相差1个长度单位,所以:

  • 棋子横向 X轴 每次变化1,Y 轴不变;
  • 棋子纵向 X轴 不变,Y 轴每次变化1;
  • 棋子斜向上 X轴 每次变化1,Y 每次变化1;
  • 棋子斜向下 X轴 每次变化1,Y 每次变化1;
    以上4个方向,是x轴的正向,那么他们的反向也要同时计算。如果计算下一个步骤不是本棋手的棋子,那么本次方向的查询结束,接着查询反方向的棋子,如果总共的相邻棋子数大于等于5,那么棋手胜利,比赛结束。
代码
bool OXGame::is5inRow(int x, int y)
{
    // const int DX[4] = { 1, 0, 1, 1 };
 
  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据结构习题:已知两人分别执白棋和黑棋在一个围棋棋盘上下五子棋,若同一颜色的棋在同一条横行、纵行或斜线上连成5个棋,则执该颜色棋的人获胜。编写程序读入某一时刻下棋的状态,并判断是否有人即将获胜,即:同一颜色的棋在同一条横行、纵列或斜线上连成4个棋,且该4个棋的两端至少有一端为空位置。 输入的棋盘大小是19×19,用数字0表示空位置(即没有棋),用数字1表示该位置下了一白色棋,用数字2表示该位置下了一黑色棋。假设同一颜色的棋在同一条横行、纵列或斜线上连成的棋个数不会超过4个,并且最多有一人连成线的棋个数为4。 【输入形式】 从控制台输入用来表示棋盘状态的数字0、1或2;每行输入19个数字,各数字之间以一个空格分隔,每行最后一个数字后没有空格;共输入19行表示棋盘状态的数字。 【输出形式】 若有人即将获胜,则先输出即将获胜人的棋颜色(1表示白色棋,2表示黑色棋),然后输出英文冒号:,最后输出连成4个棋连线的起始位置(棋盘横行自上往下、纵列自左往右从1开始计数,横行最小的棋在棋盘上的横行数和纵列数作为连线的起始位置,若在同一行上,则纵列数最小的棋位置作为起始位置,两数字之间以一个英文逗号,作为分隔符)。 若没有人获胜,则输出英文字符串:No。 无论输出什么结果,最后都要有回车换行符。
五子棋是一种非常经典的棋类游戏,判断五子棋胜负的算法可以通过以下步骤实现: 1. 创建一个二维数组表示棋盘,用0表示空位,1表示黑棋,2表示白棋。 2. 在每次下棋后,判断该位置是否有五相连。 3. 对于每个位置,可以分别向右、下、右下、左下四个方向进行判断。 4. 如果某个方向上已经有四颗棋,再放一颗同色棋时就可以判断胜负。 5. 如果在所有方向上都没有五相连,就继续下棋,直到棋盘被填满或者出现五相连。 具体实现可以参考以下代码: ```python # 创建一个15x15的二维数组表示棋盘 board = [[0] * 15 for i in range(15)] # 判断某个位置是否能下棋 def can_move(x, y, color): if x < 0 or x >= 15 or y < 0 or y >= 15 or board[x][y] != 0: return False # 如果该位置上下左右四个方向已经有四颗同色棋,则可以下棋 dx = [0, 1, 1, 1] dy = [1, 0, 1, -1] for i in range(4): count = 1 for j in range(1, 5): tx = x + j * dx[i] ty = y + j * dy[i] if tx < 0 or tx >= 15 or ty < 0 or ty >= 15 or board[tx][ty] != color: break count += 1 for j in range(1, 5): tx = x - j * dx[i] ty = y - j * dy[i] if tx < 0 or tx >= 15 or ty < 0 or ty >= 15 or board[tx][ty] != color: break count += 1 if count >= 5: return True return False # 下棋并判断胜负 def move(x, y, color): board[x][y] = color if can_move(x, y, color): return True return False ``` 在实际游戏中,还需要考虑如何判断哪方胜利,以及如何进行人机交互等问题。以上代码只是五子棋算法的一个简单示例,具体实现还需要结合实际情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值