Connect 4 ゲームを作成しようとしています。勝利条件以外はすべて正常に機能します。これがコードです。すべての助けに感謝します。(申し訳ありませんが、識別子はドイツ語ですが、コードに慣れていただければ幸いです)。配列 "spielfeld" は 0 で初期化される 2 次元配列です。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;
}