gpt4 book ai didi

c - 减少井字棋实现中的代码重复

转载 作者:行者123 更新时间:2023-11-30 14:51:59 25 4
gpt4 key购买 nike

我正在用 C 语言制作井字游戏,我的函数 checkwinner() 有大量 if 语句形式的代码重复。

void checkwinner(void){
if(square[1] == square[2] && square[2] == square[3]){
printresult(square[2]);
}
else if(square[4] == square[5] && square[5] == square[6]){
printresult(square[5]);
}
else if(square[7] == square[8] && square[8] == square[9]){
printresult(square[8]);
}
else if(square[1] == square[4] && square[4] == square[7]){
printresult(square[4]);
}
else if(square[2] == square[5] && square[5] == square[8]){
printresult(square[5]);
}
else if(square[3] == square[6] && square[6] == square[9]){
printresult(square[6]);
}
else if(square[1] == square[5] && square[5] == square[9]){
printresult(square[5]);
}
else if(square[3] == square[5] && square[5] == square[7]){
printresult(square[5]);
}
}

名为 square[] 的数组包含字符“X”或“O”。因此该函数会比较行、列和对角线并检查字符是否匹配。

有没有办法减少代码重复,使代码更紧凑?

最佳答案

就像Angen说的,有匹配功能就很好:

bool match(int x, int y, int z){
return square[x] == square[y] && square[y] == square[z];
}

但是,我也会考虑这样重写。我假设您的 square 是一个 char 数组,但它也适用于 int 。另请注意,您需要检查空单元格。

/* Returns the winner on match, and otherwise 0 */
char match(int x, int y, int z){
if(square[x] != 'X' && square[x] != 'O')
return 0;
if (square[x] == square[y] && square[y] == square[z])
return square[x];
returns 0;
}

之后,您可以分别检查三种情况。也许这对于一个小井字游戏来说有点过分了,但无论如何我都会展示它。这个想法可以很好地转化为更大的应用。

char matchRows() {
int row=1;
for(int i=0; i<3; i++) {
char c=match(row+i, row+3+i, row+6+i);
if(c)
return c;
}
return 0;
}

char matchColumns() {
int column=1;
for(int i=0; i<3; i++) {
char c=match(column+i, column+1+i, column+2+i);
if(c)
return c;
}
return 0;
}

char matchDiagonals() {
char c;
if(c=match(1,5,9))
return c;
if(c=match(3,5,7))
return c;
return 0;
}

然后你可以像这样编写checkwinner:

char checkWinner() {
char c;
if(c=matchRows())
return c;
if(c=matchColumns())
return c;
if(c=matchDiagonals())
return c;
return c;
}

然后我会添加一个新函数来接管之前的 checkWinner 的职责:

void printWinner() {
char c=checkWinner();
if(c)
printResult(c);
}

也许这不会使代码在计算总行数时更加紧凑,但它绝对是更好的设计,并且每个单独的功能都更加紧凑。另外,您可能会注意到,我将功能分开,以便函数不会同时打印和处理有关如何计算获胜者的逻辑。

我添加了camelCase到你的职能。这使得代码更容易阅读。

关于c - 减少井字棋实现中的代码重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47855077/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com