用c语言写一个简单的五子棋 您所在的位置:网站首页 五子棋开发思路怎么写 用c语言写一个简单的五子棋

用c语言写一个简单的五子棋

2024-07-13 15:11| 来源: 网络整理| 查看: 265

    很高兴用了一下午终于把五子棋弄明白了!简单说一下我对五子棋的理解。

在五子棋中最重要的算法就是判断输赢,他的思路很简单,就是以一个棋子为中心,将他的水平,竖直,主对角线和斜对角线的四个方向依次判断是否存在五个连续且相同的棋子。

int judge(int x, int y) { int i, j; int count; int winflag = 1; //第一个点不用再次读取 int cur; //记录当前所下的棋 cur = map[x][y] == 白棋 ? 白棋 : 黑棋; //printf("cur = %d", cur); //水平方向判断 count = 0; for (i = x, j = y - 1; j > 0 && count++ < 5; j--) //读取num次,或者遇到边界 { if (map[i][j] == cur) { winflag++; } else break; } count = 0; for (i = x, j = y + 1; j < N && count++ < 5; j++) { if (map[i][j] == cur) { winflag++; } else break; } if (winflag >= 5) return OK; else winflag = 1; //垂直方向判断 count = 0; for (i = x - 1, j = y; i > 0 && count++ < 5; i--) { if (map[i][j] == cur) { winflag++; } else break; } count = 0; for (i = x + 1, j = y; i < N && count++ < 5; i++) { if (map[i][j] == cur) { winflag++; } else break; } if (winflag >= 5) return OK; else winflag = 1; //主对角线判断 count = 0; for (i = x - 1, j = y - 1; i > 0 && j > 0 && count++ < 5; j--, i--) { if (map[i][j] == cur) { winflag++; } else break; } count = 0; for (i = x + 1, j = y + 1; i < N && j < N && count++ < 5; j++, i++) { if (map[i][j] == cur) { winflag++; } else break; } if (winflag >= 5) return OK; else winflag = 1; //斜对角线判断 count = 0; for (i = x + 1, j = y - 1; x < N && j > 0 && count++ < 5; j--, i++) { if (map[i][j] == cur) { winflag++; } else break; } count = 0; for (i = x - 1, j = y + 1; i > 0 && j < N && count++ < 5; j++, i--) { if (map[i][j] == cur) { winflag++; } else break; } if (winflag >= 5) return OK; else winflag = 1; return NO; }

这是我第一次写的判断函数,比较简单明了,思路清晰,但是缺点是比较冗长,每个方向上的一些重复的步骤很多,然后我又查阅到一个大神通过二维数组写的一个简洁明了的代码,值得我们深思。

int judge(int x, int y) { int i, j, k; const int step[4][2]={{1,0},{0,1},{1,1},{1,-1}}; for(i=0;i= 5) return OK; else winflag = 1; //垂直方向判断 count = 0; for (i = x - 1, j = y; i > 0 && count++ < 5; i--) { if (map[i][j] == cur) { winflag++; } else break; } count = 0; for (i = x + 1, j = y; i < N && count++ < 5; i++) { if (map[i][j] == cur) { winflag++; } else break; } if (winflag >= 5) return OK; else winflag = 1; //主对角线判断 count = 0; for (i = x - 1, j = y - 1; i > 0 && j > 0 && count++ < 5; j--, i--) { if (map[i][j] == cur) { winflag++; } else break; } count = 0; for (i = x + 1, j = y + 1; i < N && j < N && count++ < 5; j++, i++) { if (map[i][j] == cur) { winflag++; } else break; } if (winflag >= 5) return OK; else winflag = 1; //斜对角线判断 count = 0; for (i = x + 1, j = y - 1; x < N && j > 0 && count++ < 5; j--, i++) { if (map[i][j] == cur) { winflag++; } else break; } count = 0; for (i = x - 1, j = y + 1; i > 0 && j < N && count++ < 5; j++, i--) { if (map[i][j] == cur) { winflag++; } else break; } if (winflag >= 5) return OK; else winflag = 1; return NO; }



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有