<commit_before>#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <cmath>

using namespace std;

const static int aantalspelers = 4;
const static int aantalslagen = 8;
const static int aantalkaarten = 8;
const static bool rotterdams = true;
const static bool metroem = true;
int troefkleur = 2;

enum Kaarten {
  S7 = 0,  S8, SV, SH, S10, SA, S9, SB, 
  H7 = 10, H8, HV, HH, H10, HA, H9, HB,
  K7 = 20, K8, KV, KH, K10, KA, K9, KB,
  R7 = 30, R8, RV, RH, R10, RA, R9, RB,
  X = -1
};

int speel(int spelers[aantalspelers], int opgegooid[aantalslagen + 1][aantalspelers + 3], 
          int zuid[aantalkaarten], int west[aantalkaarten], int noord[aantalkaarten], int oost[aantalkaarten],
          int slag, int huidigespeler, int komtuit, bool output);

ostream& operator<<(ostream& os, const Kaarten kaart) {
  string s;
  switch(kaart) {
    case (S7): 
      s = "♠7 ";
      break;
    case (S8):
      s = "♠8 ";
      break;
    case (S9):
      s = "♠9 ";
      break;
    case (SB):
      s = "♠B ";
      break;
    case (SV):
      s = "♠V ";
      break;
    case (SH):
      s = "♠H ";
      break;
    case (S10):
      s = "♠10";
      break;
    case (SA):
      s = "♠A ";
      break;
    case (H7):
      s = "\033[1;31m♥\033[0m7 ";
      break;
    case (H8):
      s = "\033[1;31m♥\033[0m8 ";
      break;
    case (H9):
      s = "\033[1;31m♥\033[0m9 ";
      break;
    case (HB):
      s = "\033[1;31m♥\033[0mB ";
      break;
    case (HV):
      s = "\033[1;31m♥\033[0mV ";
      break;
    case (HH):
      s = "\033[1;31m♥\033[0mH ";
      break;
    case (H10):
      s = "\033[1;31m♥\033[0m10";
      break;
    case (HA):
      s = "\033[1;31m♥\033[0mA ";
      break;
    case (K7):
      s = "♣7 ";
      break;
    case (K8):
      s = "♣8 ";
      break;
    case (K9):
      s = "♣9 ";
      break;
    case (KB):
      s = "♣B ";
      break;
    case (KV):
      s = "♣V ";
      break;
    case (KH):
      s = "♣H ";
      break;
    case (K10):
      s = "♣10";
      break;
    case (KA):
      s = "♣A ";
      break;
    case (R7):
      s = "\033[1;31m♦\033[0m7 ";
      break;
    case (R8):
      s = "\033[1;31m♦\033[0m8 ";
      break;
    case (R9):
      s = "\033[1;31m♦\033[0m9 ";
      break;
    case (RB):
      s = "\033[1;31m♦\033[0mB ";
      break;
    case (RV):
      s = "\033[1;31m♦\033[0mV ";
      break;
    case (RH):
      s = "\033[1;31m♦\033[0mH ";
      break;
    case (R10):
      s = "\033[1;31m♦\033[0m10";
      break;
    case (RA):
      s = "\033[1;31m♦\033[0mA ";
      break;
    case (X):
      s = "\033[1;31mX\033[0m  ";
        break;
  }

  return os << s << " ";
}

void parseargv(int argc, char* argv[], int spelers[aantalspelers]) {
  if (argc != aantalspelers + 1) {
    cout << "Verkeerd aantal parameters meegegeven." << endl;
    exit(0);
  }
  else {
    for (int i = 0; i < aantalspelers; i++) {
      spelers[i] = atoi(argv[i + 1]);
    }
  }
}

int kleurvankaart(int kaart) {
  return (kaart - (kaart % 10)) / 10;
}

bool istroef(int kaart) {
  return kleurvankaart(kaart) == troefkleur;
}

// Obv 7 8 V H 10 A 9 B
int waardeerkaart(int kaart) {
  int kleur = kleurvankaart(kaart);
  
  kaart = kaart % 10;
  
  if (kleur != troefkleur || kaart < 6) {
    if (kaart < 2 || kaart == 6)
      return 0;
    else if (kaart <= 3)
      return kaart + 1;
    else if (kaart <= 5)
      return kaart + 6;
    else
      return 2;
  }
  else {
    if (kaart == 6) // Nel
      return 14;
    else if (kaart == 7) // Boer
      return 20;
  }

  return 0;
}

// Zet het nummer van een kaart om in 7 8 9 10 B V H A volgorde
int roemvolgorde(int kaart) {
  int kleur = kleurvankaart(kaart);
  kaart = kaart % 10;

  // 7 of 8
  if (kaart < 2)
    return 10 * kleur + kaart;
  // V of H
  else if (kaart < 4)
    return 10 * kleur + kaart + 3;
  // 10
  else if (kaart == 4)
    return 10 * kleur +  kaart - 1;
  // A
  else if (kaart == 5)
    return 10 * kleur + kaart + 2;
  // 9
  else if (kaart == 6)
    return 10 * kleur + kaart - 4;
  // B
  else
    return 10 * kleur + kaart - 3;
}

int maat(int speler) {
  return (speler + 2) % 4;
}

// Partitionering voor QuickSort
int partitie(int A[aantalspelers], int p, int r) {
  int x = A[p];
  int i = p - 1;
  int j = r + 1;

  while (i < j) {
    j = j - 1;
    
    while (A[j] > x)
      j = j - 1;

    i = i + 1;

    while (A[i] < x)
      i = i + 1;

    if (i < j) {
      // Wissel A[i] en A[j]
      int temp = A[i];
      A[i] = A[j];
      A[j] = temp;
    }
  }

  return j;
}

// QuickSort algoritme voor Roemdetectie
void quicksort(int A[aantalspelers], int p, int r) {
  if (p < r) {
    int q = partitie(A, p, r);
    quicksort(A, p, q);
    quicksort(A, q + 1, r);
  }
}

void printkaarten(int zuid[aantalkaarten], int west[aantalkaarten], int noord[aantalkaarten], int oost[aantalkaarten]) {
  cout << "0: ";
  for (int i = 0; i < aantalkaarten; i++)
    cout << Kaarten(zuid[i]) << " ";
  cout << endl;

  cout << "1: ";
  for (int i = 0; i < aantalkaarten; i++)
    cout << Kaarten(west[i]) << " ";
  cout << endl;

  cout << "2: ";
  for (int i = 0; i < aantalkaarten; i++)
    cout << Kaarten(noord[i]) << " ";
  cout << endl;

  cout << "3: ";
  for (int i = 0; i < aantalkaarten; i++)
    cout <<  Kaarten(oost[i]) << " ";
  cout << endl;
}

int winnaar(int kaarten[aantalspelers], int komtuit) {
  int kleur = kleurvankaart(kaarten[komtuit]);  // De te bekennen kleur
  int hoogste[3] = {-1, -1, 0};               // Hoogste aantal punten, speler en of ingetroefd is

  for (int i = 0; i < aantalspelers; i++) {
    if (kleurvankaart(kaarten[i]) == kleur) {
      int kaartpunten = waardeerkaart(kaarten[i]);

      // Als het aantal punten van de huidige kaart hoger is en de hoogste geen troef
      if (kaartpunten > hoogste[1] && !hoogste[2]) {
        hoogste[0] = i;
        hoogste[1] = kaartpunten;
        hoogste[2] = istroef(kaarten[i]);
      }
      // Hoogste is troef,
      else if (hoogste[2] && istroef(kaarten[i])) {
        if (kaartpunten > hoogste[1]) {
          hoogste[0] = i;
          hoogste[1] = kaartpunten;
          hoogste[2] = 1;
        }
      }

    }
    // ingetroefd
    else if (istroef(kaarten[i])) {
      int kaartpunten = waardeerkaart(kaarten[i]);

      // Hoogste kaart tot nu toe ook troef?
      if (istroef(kaarten[hoogste[0]])) {
        if (kaartpunten > hoogste[1]) {
          hoogste[0] = i;
          hoogste[1] = kaartpunten;
          hoogste[2] = 1;
        }
      }
      // Ingetroefd maar hoogste tot nu toe geen troef
      else {
          hoogste[0] = i;
          hoogste[1] = kaartpunten;
          hoogste[2] = 1;
      }
    }
  }

  return hoogste[0];
}

void printspel(int opgegooid[aantalslagen + 1][aantalspelers + 3]) {
  cout << endl << "Opgegooide kaarten:" << endl;

  for (int i = 0; i < aantalslagen; i++) {
    for (int j = 0; j < aantalspelers; j++) {
      cout << Kaarten(opgegooid[i][j]) << " ";
    }
    cout << " speler " << opgegooid[i][aantalspelers + 1] << " met " << opgegooid[i][aantalspelers + 2] << " punten. " 
         << opgegooid[i][aantalspelers] << " kwam uit." << endl;
  }

  if (opgegooid[aantalslagen][0] != -1) {
    for (int i = 0; i < aantalspelers; i++)
      cout << "Speler " << i << ":" << opgegooid[aantalslagen][i] << endl;
  }
  cout << "---------------------------------------------" << endl;
}

void printarray(int input[], int maxkaart) {
  cout << "Kaarten: ";
  for (int i = 0; i < maxkaart; i++)
    cout << input[i] << " ";

  cout << endl;
}

int zoekelement(int element, int input[], int arraysize) {
  for (int i = 0; i < arraysize; i++)
    if (input[i] == element)
      return i;

  return -1;
}

void wisselelement(int element, int input[], int arraysize) {
  if (element <= arraysize) {
    int temp = input[element];
    input[element] = input[arraysize];
    input[arraysize] = temp;
  }
}

void deleteelement(int element, int input[], int arraysize) {
  for (int i = 0; i < arraysize; i++) {
    if (input[i] == element) {
      input[i] = -1;
      wisselelement(i, input, arraysize - 1);
      break;
    }
  }
}  

void deelkaarten(int zuid[aantalkaarten], int west[aantalkaarten], int noord[aantalkaarten], int oost[aantalkaarten]) {
  int allekaarten[aantalkaarten * aantalspelers];
  // Initieer alle kaarten
  for (int i = 0; i < aantalkaarten * aantalspelers ; i++)
    allekaarten[i] = (10 * floor(i / aantalkaarten) + i % aantalkaarten);

  // Pak een willekeurige kaart uit allekaarten, haal deze uit de array en 
  // geef deze aan een speler.
  int maxkaart = aantalkaarten * aantalspelers;
  for (int j = 0; j < aantalkaarten; j++) {
    int randomkaart = rand() % (maxkaart - 1);
    zuid[j] = allekaarten[randomkaart];
    wisselelement(randomkaart, allekaarten, maxkaart - 1);
    maxkaart--;
  }

  for (int j = 0; j < aantalkaarten; j++) {
    int randomkaart = rand() % (maxkaart - 1);
    west[j] = allekaarten[randomkaart];
    wisselelement(randomkaart, allekaarten, maxkaart - 1);
    maxkaart--;
  }
  
  for (int j = 0; j < aantalkaarten; j++) {
    int randomkaart = rand() % (maxkaart - 1);
    noord[j] = allekaarten[randomkaart];
    wisselelement(randomkaart, allekaarten, maxkaart - 1);
    maxkaart--;
  }

  for (int j = 0; j < aantalkaarten; j++)
    oost[j] = allekaarten[j];
}

void berekenheeftniet(int opgegooid[aantalslagen + 1][aantalspelers + 3], 
                      int slag, int komtuit, bool heeftniet[4][aantalspelers]) {
  for (int i = 0; i < 4; i++) {
    for (int j = 0; j < aantalspelers; j++) {
      heeftniet[i][j] = false;
    }
  } 

  for (int i = 0; i <= slag; i++) {
    int komtuit = opgegooid[i][aantalspelers];

    for (int k = 0; k < aantalspelers; k++) {
      int j = (komtuit + k) % 4;
      int kaart = opgegooid[i][j];
      
      if (kaart != -1) {
        if (j != komtuit && kleurvankaart(opgegooid[i][komtuit]) != kleurvankaart(kaart)) {
          // Kleur is niet bekend en deze speler kwam niet uit
          heeftniet[kleurvankaart(opgegooid[i][komtuit])][j] = true;
          if (!istroef(kaart))
            heeftniet[troefkleur][j] = true;
        }
      }
    }
  }

  cout << "heeftniet: " << endl;
  for (int i = 0; i < 4; i++) {
    for (int j = 0; j < aantalspelers; j++) {
      cout << heeftniet[i][j] << " ";
    }
    cout << endl;
  }
}

bool checkdeling(int spelerskaarten[aantalspelers][aantalslagen], bool heeftniet[4][aantalspelers], int maxkaart) {
  for (int i = 0; i < aantalspelers; i++) {
    for (int j = 0; j < aantalkaarten - maxkaart; j++) {
      if (heeftniet[kleurvankaart(spelerskaarten[i][j])][i]) {
        cout << "Speler " << i << " heeft kleur " << kleurvankaart(spelerskaarten[i][j]) << " onterecht gekregen!" << endl;
        return false;
      }
    }
  }

  return true;
}

void deelrestkaarten(int opgegooid[aantalslagen + 1][aantalspelers + 3], int slag, int komtuit, int huidigespeler, 
                     int spelerskaarten[aantalspelers][aantalkaarten]) {
  int allekaarten[aantalkaarten * aantalspelers];
  int maxkaart = aantalkaarten * aantalspelers;
  int aantalgedelete = 0;
  bool heeftniet[4][aantalspelers];
  // Initieer alle kaarten
  for (int i = 0; i < aantalkaarten * aantalspelers ; i++)
    allekaarten[i] = (10 * floor(i / aantalkaarten) + i % aantalkaarten);

  // Delete kaarten die al opgegooid zijn uit allekaarten
  //                  // +1 omdat we ook kaarten halverwege de slag meenemen
  for (int i = 0; i < (slag + 1); i++) {
    for (int j = 0; j < aantalspelers; j++) {
      int k = (komtuit + j) % 4;
      if (opgegooid[i][k] != -1) {
        int index = (aantalkaarten * floor(opgegooid[i][k] / 10) + opgegooid[i][k] % 10);

        if (allekaarten[index] != opgegooid[i][k])
          index = zoekelement(opgegooid[i][k], allekaarten, maxkaart - aantalgedelete);

        allekaarten[index] = -1;
        aantalgedelete++;
        wisselelement(index, allekaarten, maxkaart - (aantalgedelete));
      }
    }
  }

  // Delete eigen overige kaarten 
  for (int i = 0; i < aantalkaarten - slag; i++) {
    int index = (aantalkaarten * floor(spelerskaarten[huidigespeler][i] / 10) + spelerskaarten[huidigespeler][i] % 10);

    if (allekaarten[index] != spelerskaarten[huidigespeler][i])
      index = zoekelement(spelerskaarten[huidigespeler][i], allekaarten, maxkaart - aantalgedelete);

    allekaarten[index] = -1;
    aantalgedelete++;
    wisselelement(index, allekaarten, maxkaart - aantalgedelete);
  }

  maxkaart -= aantalgedelete;

  berekenheeftniet(opgegooid, slag, komtuit, heeftniet);


  // Hierna verdeleln we alle kaarten over de spelers:
  // Deel 2 spelers naast huidigespeler kaarten
  for (int i = 1; i <= aantalspelers - 2; i++) {
    for (int j = 0; j < aantalkaarten - slag - 1; j++) {
      int randomkaart = rand() % (maxkaart - 1);
      spelerskaarten[(huidigespeler + i) % 4][j] = allekaarten[randomkaart];
      allekaarten[randomkaart] = -1;
      wisselelement(randomkaart, allekaarten, maxkaart - 1);
      maxkaart--;
    }
  }

  // cout << "Deel speler " << (huidigespeler + 3) % 4 << " de laatste kaarten" << endl;
  // Deel speler links van huidigespeler (+3 %4) de rest van de kaarten
  for (int i = 0; i < aantalkaarten - slag - 1; i++) {
    spelerskaarten[(huidigespeler + 3) % 4][i] = allekaarten[maxkaart - 1];
    allekaarten[maxkaart - 1] = -1;
    maxkaart--;
  }

  // Overige kaarten verdelen over spelers die nog niet opgegooid hebben
  int i = 0;
  while (maxkaart > 0) {
    if (opgegooid[slag][i] == -1 && huidigespeler != i) {
      spelerskaarten[i][aantalkaarten - slag - 1] = allekaarten[maxkaart - 1];
      allekaarten[maxkaart - 1] = -1;
      maxkaart--;
    }
    i++;
  }
}

// Preconditie: kaarten moet een gesorteerde array zijn
bool checkstuk(int kaarten[aantalspelers]) {
  int troefvrouw = 10 * troefkleur + 5;
  int troefheer = troefvrouw + 1;

  for (int i = 0; i < aantalspelers - 1; i++) {
    if (kaarten[i] == troefvrouw)
      if (kaarten[i + 1] == troefheer)
        return true;
  }
  
  return false;
}
<commit_msg>checkdeling gemaakt, bkijft delen tot deling klopt<commit_after>#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <cmath>

using namespace std;

const static int aantalspelers = 4;
const static int aantalslagen = 8;
const static int aantalkaarten = 8;
const static bool rotterdams = true;
const static bool metroem = true;
int troefkleur = 2;

enum Kaarten {
  S7 = 0,  S8, SV, SH, S10, SA, S9, SB, 
  H7 = 10, H8, HV, HH, H10, HA, H9, HB,
  K7 = 20, K8, KV, KH, K10, KA, K9, KB,
  R7 = 30, R8, RV, RH, R10, RA, R9, RB,
  X = -1
};

int speel(int spelers[aantalspelers], int opgegooid[aantalslagen + 1][aantalspelers + 3], 
          int zuid[aantalkaarten], int west[aantalkaarten], int noord[aantalkaarten], int oost[aantalkaarten],
          int slag, int huidigespeler, int komtuit, bool output);

ostream& operator<<(ostream& os, const Kaarten kaart) {
  string s;
  switch(kaart) {
    case (S7): 
      s = "♠7 ";
      break;
    case (S8):
      s = "♠8 ";
      break;
    case (S9):
      s = "♠9 ";
      break;
    case (SB):
      s = "♠B ";
      break;
    case (SV):
      s = "♠V ";
      break;
    case (SH):
      s = "♠H ";
      break;
    case (S10):
      s = "♠10";
      break;
    case (SA):
      s = "♠A ";
      break;
    case (H7):
      s = "\033[1;31m♥\033[0m7 ";
      break;
    case (H8):
      s = "\033[1;31m♥\033[0m8 ";
      break;
    case (H9):
      s = "\033[1;31m♥\033[0m9 ";
      break;
    case (HB):
      s = "\033[1;31m♥\033[0mB ";
      break;
    case (HV):
      s = "\033[1;31m♥\033[0mV ";
      break;
    case (HH):
      s = "\033[1;31m♥\033[0mH ";
      break;
    case (H10):
      s = "\033[1;31m♥\033[0m10";
      break;
    case (HA):
      s = "\033[1;31m♥\033[0mA ";
      break;
    case (K7):
      s = "♣7 ";
      break;
    case (K8):
      s = "♣8 ";
      break;
    case (K9):
      s = "♣9 ";
      break;
    case (KB):
      s = "♣B ";
      break;
    case (KV):
      s = "♣V ";
      break;
    case (KH):
      s = "♣H ";
      break;
    case (K10):
      s = "♣10";
      break;
    case (KA):
      s = "♣A ";
      break;
    case (R7):
      s = "\033[1;31m♦\033[0m7 ";
      break;
    case (R8):
      s = "\033[1;31m♦\033[0m8 ";
      break;
    case (R9):
      s = "\033[1;31m♦\033[0m9 ";
      break;
    case (RB):
      s = "\033[1;31m♦\033[0mB ";
      break;
    case (RV):
      s = "\033[1;31m♦\033[0mV ";
      break;
    case (RH):
      s = "\033[1;31m♦\033[0mH ";
      break;
    case (R10):
      s = "\033[1;31m♦\033[0m10";
      break;
    case (RA):
      s = "\033[1;31m♦\033[0mA ";
      break;
    case (X):
      s = "\033[1;31mX\033[0m  ";
        break;
  }

  return os << s << " ";
}

void parseargv(int argc, char* argv[], int spelers[aantalspelers]) {
  if (argc != aantalspelers + 1) {
    cout << "Verkeerd aantal parameters meegegeven." << endl;
    exit(0);
  }
  else {
    for (int i = 0; i < aantalspelers; i++) {
      spelers[i] = atoi(argv[i + 1]);
    }
  }
}

int kleurvankaart(int kaart) {
  return (kaart - (kaart % 10)) / 10;
}

bool istroef(int kaart) {
  return kleurvankaart(kaart) == troefkleur;
}

// Obv 7 8 V H 10 A 9 B
int waardeerkaart(int kaart) {
  int kleur = kleurvankaart(kaart);
  
  kaart = kaart % 10;
  
  if (kleur != troefkleur || kaart < 6) {
    if (kaart < 2 || kaart == 6)
      return 0;
    else if (kaart <= 3)
      return kaart + 1;
    else if (kaart <= 5)
      return kaart + 6;
    else
      return 2;
  }
  else {
    if (kaart == 6) // Nel
      return 14;
    else if (kaart == 7) // Boer
      return 20;
  }

  return 0;
}

// Zet het nummer van een kaart om in 7 8 9 10 B V H A volgorde
int roemvolgorde(int kaart) {
  int kleur = kleurvankaart(kaart);
  kaart = kaart % 10;

  // 7 of 8
  if (kaart < 2)
    return 10 * kleur + kaart;
  // V of H
  else if (kaart < 4)
    return 10 * kleur + kaart + 3;
  // 10
  else if (kaart == 4)
    return 10 * kleur +  kaart - 1;
  // A
  else if (kaart == 5)
    return 10 * kleur + kaart + 2;
  // 9
  else if (kaart == 6)
    return 10 * kleur + kaart - 4;
  // B
  else
    return 10 * kleur + kaart - 3;
}

int maat(int speler) {
  return (speler + 2) % 4;
}

// Partitionering voor QuickSort
int partitie(int A[aantalspelers], int p, int r) {
  int x = A[p];
  int i = p - 1;
  int j = r + 1;

  while (i < j) {
    j = j - 1;
    
    while (A[j] > x)
      j = j - 1;

    i = i + 1;

    while (A[i] < x)
      i = i + 1;

    if (i < j) {
      // Wissel A[i] en A[j]
      int temp = A[i];
      A[i] = A[j];
      A[j] = temp;
    }
  }

  return j;
}

// QuickSort algoritme voor Roemdetectie
void quicksort(int A[aantalspelers], int p, int r) {
  if (p < r) {
    int q = partitie(A, p, r);
    quicksort(A, p, q);
    quicksort(A, q + 1, r);
  }
}

void printkaarten(int zuid[aantalkaarten], int west[aantalkaarten], int noord[aantalkaarten], int oost[aantalkaarten]) {
  cout << "0: ";
  for (int i = 0; i < aantalkaarten; i++)
    cout << Kaarten(zuid[i]) << " ";
  cout << endl;

  cout << "1: ";
  for (int i = 0; i < aantalkaarten; i++)
    cout << Kaarten(west[i]) << " ";
  cout << endl;

  cout << "2: ";
  for (int i = 0; i < aantalkaarten; i++)
    cout << Kaarten(noord[i]) << " ";
  cout << endl;

  cout << "3: ";
  for (int i = 0; i < aantalkaarten; i++)
    cout <<  Kaarten(oost[i]) << " ";
  cout << endl;
}

int winnaar(int kaarten[aantalspelers], int komtuit) {
  int kleur = kleurvankaart(kaarten[komtuit]);  // De te bekennen kleur
  int hoogste[3] = {-1, -1, 0};               // Hoogste aantal punten, speler en of ingetroefd is

  for (int i = 0; i < aantalspelers; i++) {
    if (kleurvankaart(kaarten[i]) == kleur) {
      int kaartpunten = waardeerkaart(kaarten[i]);

      // Als het aantal punten van de huidige kaart hoger is en de hoogste geen troef
      if (kaartpunten > hoogste[1] && !hoogste[2]) {
        hoogste[0] = i;
        hoogste[1] = kaartpunten;
        hoogste[2] = istroef(kaarten[i]);
      }
      // Hoogste is troef,
      else if (hoogste[2] && istroef(kaarten[i])) {
        if (kaartpunten > hoogste[1]) {
          hoogste[0] = i;
          hoogste[1] = kaartpunten;
          hoogste[2] = 1;
        }
      }

    }
    // ingetroefd
    else if (istroef(kaarten[i])) {
      int kaartpunten = waardeerkaart(kaarten[i]);

      // Hoogste kaart tot nu toe ook troef?
      if (istroef(kaarten[hoogste[0]])) {
        if (kaartpunten > hoogste[1]) {
          hoogste[0] = i;
          hoogste[1] = kaartpunten;
          hoogste[2] = 1;
        }
      }
      // Ingetroefd maar hoogste tot nu toe geen troef
      else {
          hoogste[0] = i;
          hoogste[1] = kaartpunten;
          hoogste[2] = 1;
      }
    }
  }

  return hoogste[0];
}

void printspel(int opgegooid[aantalslagen + 1][aantalspelers + 3]) {
  cout << endl << "Opgegooide kaarten:" << endl;

  for (int i = 0; i < aantalslagen; i++) {
    for (int j = 0; j < aantalspelers; j++) {
      cout << Kaarten(opgegooid[i][j]) << " ";
    }
    cout << " speler " << opgegooid[i][aantalspelers + 1] << " met " << opgegooid[i][aantalspelers + 2] << " punten. " 
         << opgegooid[i][aantalspelers] << " kwam uit." << endl;
  }

  if (opgegooid[aantalslagen][0] != -1) {
    for (int i = 0; i < aantalspelers; i++)
      cout << "Speler " << i << ":" << opgegooid[aantalslagen][i] << endl;
  }
  cout << "---------------------------------------------" << endl;
}

void printarray(int input[], int maxkaart) {
  cout << "Kaarten: ";
  for (int i = 0; i < maxkaart; i++)
    cout << input[i] << " ";

  cout << endl;
}

int zoekelement(int element, int input[], int arraysize) {
  for (int i = 0; i < arraysize; i++)
    if (input[i] == element)
      return i;

  return -1;
}

void wisselelement(int element, int input[], int arraysize) {
  if (element <= arraysize) {
    int temp = input[element];
    input[element] = input[arraysize];
    input[arraysize] = temp;
  }
}

void deleteelement(int element, int input[], int arraysize) {
  for (int i = 0; i < arraysize; i++) {
    if (input[i] == element) {
      input[i] = -1;
      wisselelement(i, input, arraysize - 1);
      break;
    }
  }
}  

void deelkaarten(int zuid[aantalkaarten], int west[aantalkaarten], int noord[aantalkaarten], int oost[aantalkaarten]) {
  int allekaarten[aantalkaarten * aantalspelers];
  // Initieer alle kaarten
  for (int i = 0; i < aantalkaarten * aantalspelers ; i++)
    allekaarten[i] = (10 * floor(i / aantalkaarten) + i % aantalkaarten);

  // Pak een willekeurige kaart uit allekaarten, haal deze uit de array en 
  // geef deze aan een speler.
  int maxkaart = aantalkaarten * aantalspelers;
  for (int j = 0; j < aantalkaarten; j++) {
    int randomkaart = rand() % (maxkaart - 1);
    zuid[j] = allekaarten[randomkaart];
    wisselelement(randomkaart, allekaarten, maxkaart - 1);
    maxkaart--;
  }

  for (int j = 0; j < aantalkaarten; j++) {
    int randomkaart = rand() % (maxkaart - 1);
    west[j] = allekaarten[randomkaart];
    wisselelement(randomkaart, allekaarten, maxkaart - 1);
    maxkaart--;
  }
  
  for (int j = 0; j < aantalkaarten; j++) {
    int randomkaart = rand() % (maxkaart - 1);
    noord[j] = allekaarten[randomkaart];
    wisselelement(randomkaart, allekaarten, maxkaart - 1);
    maxkaart--;
  }

  for (int j = 0; j < aantalkaarten; j++)
    oost[j] = allekaarten[j];
}

void berekenheeftniet(int opgegooid[aantalslagen + 1][aantalspelers + 3], 
                      int slag, int komtuit, bool heeftniet[4][aantalspelers]) {
  for (int i = 0; i < 4; i++) {
    for (int j = 0; j < aantalspelers; j++) {
      heeftniet[i][j] = false;
    }
  } 

  for (int i = 0; i <= slag; i++) {
    int komtuit = opgegooid[i][aantalspelers];

    for (int k = 0; k < aantalspelers; k++) {
      int j = (komtuit + k) % 4;
      int kaart = opgegooid[i][j];
      
      if (kaart != -1) {
        if (j != komtuit && kleurvankaart(opgegooid[i][komtuit]) != kleurvankaart(kaart)) {
          // Kleur is niet bekend en deze speler kwam niet uit
          heeftniet[kleurvankaart(opgegooid[i][komtuit])][j] = true;
          if (!istroef(kaart))
            heeftniet[troefkleur][j] = true;
        }
      }
    }
  }

  cout << "heeftniet: " << endl;
  for (int i = 0; i < 4; i++) {
    for (int j = 0; j < aantalspelers; j++) {
      cout << heeftniet[i][j] << " ";
    }
    cout << endl;
  }
}

bool checkdeling(int spelerskaarten[aantalspelers][aantalslagen], bool heeftniet[4][aantalspelers], int maxkaart) {
  for (int i = 0; i < aantalspelers; i++) {
    for (int j = 0; j < maxkaart; j++) {
      if (spelerskaarten[i][j] != -1 && heeftniet[kleurvankaart(spelerskaarten[i][j])][i]) {
        // cout << "Speler " << i << " heeft kleur " << kleurvankaart(spelerskaarten[i][j]) << " onterecht gekregen!" << endl;
        return false;
      }
    }
  }

  return true;
}

void deelrestkaarten(int opgegooid[aantalslagen + 1][aantalspelers + 3], int slag, int komtuit, int huidigespeler, 
                     int spelerskaarten[aantalspelers][aantalkaarten]) {
  int allekaarten[aantalkaarten * aantalspelers];
  int maxkaart = aantalkaarten * aantalspelers;
  int aantalgedelete = 0;
  bool heeftniet[4][aantalspelers];
  // Initieer alle kaarten
  for (int i = 0; i < aantalkaarten * aantalspelers ; i++)
    allekaarten[i] = (10 * floor(i / aantalkaarten) + i % aantalkaarten);

  // Delete kaarten die al opgegooid zijn uit allekaarten
  //                  // +1 omdat we ook kaarten halverwege de slag meenemen
  for (int i = 0; i < (slag + 1); i++) {
    for (int j = 0; j < aantalspelers; j++) {
      int k = (komtuit + j) % 4;
      if (opgegooid[i][k] != -1) {
        int index = (aantalkaarten * floor(opgegooid[i][k] / 10) + opgegooid[i][k] % 10);

        if (allekaarten[index] != opgegooid[i][k])
          index = zoekelement(opgegooid[i][k], allekaarten, maxkaart - aantalgedelete);

        allekaarten[index] = -1;
        aantalgedelete++;
        wisselelement(index, allekaarten, maxkaart - (aantalgedelete));
      }
    }
  }

  // Delete eigen overige kaarten 
  for (int i = 0; i < aantalkaarten - slag; i++) {
    int index = (aantalkaarten * floor(spelerskaarten[huidigespeler][i] / 10) + spelerskaarten[huidigespeler][i] % 10);

    if (allekaarten[index] != spelerskaarten[huidigespeler][i])
      index = zoekelement(spelerskaarten[huidigespeler][i], allekaarten, maxkaart - aantalgedelete);

    allekaarten[index] = -1;
    aantalgedelete++;
    wisselelement(index, allekaarten, maxkaart - aantalgedelete);
  }

  maxkaart -= aantalgedelete;
  int maxorig = maxkaart;
  berekenheeftniet(opgegooid, slag, komtuit, heeftniet);

  // Hierna verdelen we alle kaarten over de spelers:
  // Deel 2 spelers naast huidigespeler kaarten
  bool goededeling = false;
  while (!goededeling) {
    maxkaart = maxorig;
    for (int i = 1; i <= aantalspelers - 2; i++) {
      for (int j = 0; j < aantalkaarten - slag - 1; j++) {
        int randomkaart = rand() % (maxkaart - 1);
        spelerskaarten[(huidigespeler + i) % 4][j] = allekaarten[randomkaart];
        // allekaarten[randomkaart] = -1;
        wisselelement(randomkaart, allekaarten, maxkaart - 1);
        maxkaart--;
      }
    }

    // cout << "Deel speler " << (huidigespeler + 3) % 4 << " de laatste kaarten" << endl;
    // Deel speler links van huidigespeler (+3 %4) de rest van de kaarten
    for (int i = 0; i < aantalkaarten - slag - 1; i++) {
      int randomkaart = rand() % (aantalkaarten - slag - i - 1);

      spelerskaarten[(huidigespeler + 3) % 4][i] = allekaarten[randomkaart];
      wisselelement(randomkaart, allekaarten, maxkaart - 1);
      // allekaarten[maxkaart - 1] = -1;
      maxkaart--;
    }

    // Overige kaarten verdelen over spelers die nog niet opgegooid hebben
    int i = 0;
    while (maxkaart > 0) {
      if (opgegooid[slag][i] == -1 && huidigespeler != i) {
        spelerskaarten[i][aantalkaarten - slag - 1] = allekaarten[maxkaart - 1];
        // allekaarten[maxkaart - 1] = -1;
        maxkaart--;
      }
      i++;
    }

    goededeling = checkdeling(spelerskaarten, heeftniet, aantalkaarten - slag);
  }
}

// Preconditie: kaarten moet een gesorteerde array zijn
bool checkstuk(int kaarten[aantalspelers]) {
  int troefvrouw = 10 * troefkleur + 5;
  int troefheer = troefvrouw + 1;

  for (int i = 0; i < aantalspelers - 1; i++) {
    if (kaarten[i] == troefvrouw)
      if (kaarten[i + 1] == troefheer)
        return true;
  }
  
  return false;
}

{'fraction_non_alphanumeric': 0.16216216216216217, 'fraction_numerical': 0.03192830135835317, 'mean_word_length': 2.3130364184643932, 'pattern_counts': {'":': 2, '<': 339, '<?xml version=': 0, '>': 21, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '7095724', 'n_tokens_mistral': 12289, 'n_tokens_neox': 11787, 'n_words': 2888}