0

试图创建一个连接 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;
}
4

1 回答 1

1

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

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
}
于 2012-10-30T00:43:26.700 回答