#include <cstdio>
//---------------
// 4 gewinnt auswertung
const int BREITE = 7;
const int HOEHE = 6;
const int GEWINN_ANZAHL = 4;
//belegung: 0=leer, 1=spieler 1, 2=spieler 2, ...
int spielfeld[BREITE][HOEHE]={0};
int fuellhoehe[BREITE]={0};
bool setzen_moeglich(int x)
{
return fuellhoehe[x] < HOEHE;
}
bool belegung_durchlaufen(int start_x, int start_y, int aktuell_x, int aktuell_y, int distanz, int richtung_x, int richtung_y, int erwartete_belegung)
{
bool spielstein_gefunden = false;
int anzahl = 0;
for(int i = 0; i < distanz; ++i)
{
int test_x = start_x + i * richtung_x;
int test_y = start_y + i * richtung_y;
bool ist_erwartete_belegung = spielfeld[test_x][test_y] == erwartete_belegung;
if(!spielstein_gefunden)
{
anzahl = ist_erwartete_belegung ? ++anzahl : 0;
spielstein_gefunden = ( test_x == aktuell_x && test_y == aktuell_y );
}
else
{
if(!ist_erwartete_belegung) break;
++anzahl;
if( anzahl == GEWINN_ANZAHL ) break;
}
}
return anzahl == GEWINN_ANZAHL;
}
bool test_strecke(int aktuell_x, int aktuell_y, int distanz_zum_punkt, int distanz_vom_punkt, int richtung_x, int richtung_y, int erwartete_belegung)
{
int start_x = aktuell_x - distanz_zum_punkt * richtung_x;
int start_y = aktuell_y - distanz_zum_punkt * richtung_y;
//int ende_x = start_x + (distanz - 1) * richtung_x;
//int ende_y = start_y + (distanz - 1) * richtung_y;
int distanz = distanz_zum_punkt + 1 + distanz_vom_punkt;
if( distanz < GEWINN_ANZAHL ) return false; // kann keine gewinnstrecke sein
return belegung_durchlaufen(start_x, start_y, aktuell_x, aktuell_y, distanz, richtung_x, richtung_y, erwartete_belegung);
}
int minimum(int a, int b)
{
if( a > b ) return b;
return a;
}
void print_spielfeld()
{
for(int y = HOEHE-1; y >= 0; --y)
{
for(int x = 0; x < BREITE; ++x)
{
printf("%i ", spielfeld[x][y]);
}
printf("\n");
}
printf("-------------------\n");
}
bool setzen(int x, int belegung)
{
//assert(setzen_moeglich(x));
++fuellhoehe[x];
int y = fuellhoehe[x]-1;
spielfeld[x][y] = belegung;
//print_spielfeld();
//gewonnen?
//wie weit sind wir von den raendern weg?
int distanz_oben = HOEHE - y - 1;
int distanz_unten = y;
int distanz_rechts = BREITE - x - 1;
int distanz_links = x;
//die distanzen diagonal
int distanz_links_unten = minimum(distanz_links, distanz_unten);
int distanz_rechts_oben = minimum(distanz_rechts, distanz_oben);
int distanz_links_oben = minimum(distanz_links, distanz_oben);
int distanz_rechts_unten = minimum(distanz_rechts, distanz_unten);
bool links_unten_nach_rechts_oben = test_strecke(x, y, distanz_links_unten, distanz_rechts_oben, +1, +1, belegung);
bool links_nach_rechts = test_strecke(x, y, distanz_links, distanz_rechts, 1, 0, belegung);
bool links_oben_nach_rechts_unten = test_strecke(x, y, distanz_links_oben, distanz_rechts_unten, +1, -1, belegung);
bool nach_unten = test_strecke(x, y, 0, distanz_unten, 0, -1, belegung);
bool gewonnen =
links_unten_nach_rechts_oben
|| links_nach_rechts
|| links_oben_nach_rechts_unten
|| nach_unten;
if( gewonnen ) printf("gewonnen!");
return gewonnen;
}
int main(int argc, char** argv)
{
//print_spielfeld();
setzen(1,2);
setzen(2,2);
setzen(2,2);
setzen(3,2);
setzen(3,2);
setzen(3,2);
setzen(0,1);
setzen(1,1);
setzen(2,1);
setzen(3,1); // gewonnen
return 0;
}