c - 如何测试四子棋胜利条件?

标签 c logic

尝试创建一款 Connect 4 游戏。除了胜利条件之外,一切正常。这是代码,感谢每一个帮助。 (抱歉,标识符是德语,但我希望您能理解代码)。数组“spielfeld”是一个二维数组,初始化为0。120和111分别代表x和o。

编辑:只剩下关键部分,抱歉代码溢出

#include <stdio.h>
#include "eingabe.h"
#include <stdlib.h>

//初始化

int main(void)
{
int spieler = 1;
int won = 0;
while(won == 0)
{
    switch(spieler)
    {
        case 1:
              anzeige(zeilen, spalten, spielfeld);
              auswahl = erfasse_ganze_zahl(0, spalten);
              erfolg = setze(zeilen, spalten, spielfeld, auswahl, 1, 120);
              won = victory_condition(zeilen, spalten, spielfeld);
              break;
        case 2:
              anzeige(zeilen, spalten, spielfeld);
              auswahl = erfasse_ganze_zahl(0, spalten);
              erfolg = setze(zeilen, spalten, spielfeld, auswahl, 1, 111);
              won = victory_condition(zeilen, spalten, spielfeld);
              break;
    }
    return 0;
}   


int setze(int zeilen, int spalten, int spielfeld[zeilen][spalten], int auswahl, int spieler, char wert)
{
    auswahl--;
    for (int i = spalten - 1; i >= 0; i--)
    {
        if(spielfeld[i][auswahl] == 0)
        {
            spielfeld[i][auswahl] = wert;
            return 0;
        }
    }
    return -1;
}   

void anzeige(int zeilen, int spalten, int spielfeld[zeilen][spalten])
{
    int i, j, k = 0;
    for(i = 0; i < spalten; i++)
    {
        for(j = 0; j < zeilen; j++)
        {
            printf("%c", spielfeld[i][j]);
            printf(" | ");
            if (j == zeilen - 1)
            {
                printf("\n");
                for (k = 0; k < spalten; k++)
                    printf("----");
                printf("\n");
            }
        }
    }
} 

//一些代码

int victory_condition(int zeilen, int spalten, int spielfeld[zeilen][spalten])
{
    int vertikal = 1;//(|)
    int horizontal = 1;//(-)
    int diagonal1 = 1;//(\)
    int diagonal2 = 1;//(/)
    char spieler = spielfeld[zeilen][spalten];
    int i;
    int j;//horizontal
     //check for vertikal(|)
    for(i = 0; spielfeld[i][spalten] == spieler && i <= zeilen; i++)
        vertikal++;//Check down
    printf("\n%d, %d\n\n%d, %d\n", vertikal, horizontal, diagonal1, diagonal2);
    for(i = zeilen; spielfeld[i][spalten] == spieler && i >= 0; i--)
        vertikal++;//Check up
    printf("\n%d, %d\n\n%d, %d\n", vertikal, horizontal, diagonal1, diagonal2);
    if(vertikal >= 4) return 1;
    //check for horizontal(-)
    for(j = spalten -1; spielfeld[zeilen][j] == spieler && j >= 0; j--,horizontal++);//Check left
        for(j = spalten +1; spielfeld[zeilen][j] == spieler && j <= 6; j++,horizontal++);//Check right
            if(horizontal >= 4) return 1;
    //check for diagonal 1 (\)
    for(i = zeilen -1, j = spalten - 1; spielfeld[i][j] == spieler && i >= 0 && j >= 0; diagonal1 ++, i --, j --);//up and left
        for(i = zeilen +1, j = spalten + 1; spielfeld[i][j] == spieler && i <= 5 && j <= 6; diagonal1 ++, i ++, j ++);//down and right
            if(diagonal1 >= 4) return 1;
    //check for diagonal 2(/)
    for(i = zeilen -1, j= spalten +1;spielfeld[i][j] == spieler && i>=0 && j <= 6; diagonal2 ++, i --, j ++);//up and right
        for(i = zeilen +1, j= spalten -1;spielfeld[i][j] == spieler && i<=5 && j >=0; diagonal2 ++, i ++, j --);//up and left
            if(diagonal2 >= 4) return 1;
    printf("\n%d, %d\n\n%d, %d\n", vertikal, horizontal, diagonal1, diagonal2);
return 0;
}

最佳答案

一旦一枚新硬币(或别针或其他任何东西)掉落,只需检查它的周围环境即可。我在这里只进行水平检查,但其他人以类似的方式工作。

int x; // position of the dropped token
int y; // position of the dropped token

for(int count = 0, ix = max(0, x - 3); ix < min(width, x + 3); ++ix) { // go through all fields that might be part of the winning row
    if (field[y][x] == mycolor) { // if it's the active player's color...
        if (++count == 4) // increase the count and check whether there are enough tokens
            winner = true;
    }
    else // if the color doesn't match...
        count = 0; // reset the count
}

关于c - 如何测试四子棋胜利条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13131203/

相关文章:

c++ - 该代码中的错误是什么?

python - 使用内存但代码仍然永远运行

c - 获取数组声明错误

algorithm - 如何使用逻辑推理分析策划类游戏

java - 如何创建 Battleship 战舰游戏算法

algorithm - 如果在 IF 语句中有 return 或 throw 语句,可以不使用 ELSE 语句吗?

C 附加到结构体数组

c - 是否使用未初始化的值调用 `wait` 未定义行为?

javascript - 如何用两个数组渲染 FlatList?

c++ - 比较字符串的一部分