예제 #1
0
 def test_dammenPakken(self):
     """Hier check ik of de definitie de juiste informatie teruggeeft wanneer een gewone dam kan slaan."""
     board = definities.setup()
     stukken = damPakken(board)
     alle_zetten = definities.damZetten(board, stukken[0])
     verwachte_uitkomst = [[[6, 4], [7, 3]], [[4, 4], [3, 3]]]
     self.assertEqual(verwachte_uitkomst, alle_zetten)
예제 #2
0
 def test_dammenVooruit(self):
     """Hier check ik of de definitie de goede zetten teruggeeft wanneer een gewone dam alleen maar vooruit kan zetten."""
     board = definities.setup()
     stuk = Koningstukken1(board)
     alle_zetten = definities.damZetten(board, stuk[0])
     verwachte_uitkomst = [[5, 6], [5, 4]]
     self.assertEqual(verwachte_uitkomst, alle_zetten)
예제 #3
0
 def test_koningStappenPakken(self):
     """Ik check of de definitie de juiste informatie teruggeeft wanneer een koning iemand kan pakken."""
     board = definities.setup()
     stuk = Koningstukken2(board)
     stuk[0].promoveren()
     alle_zetten = definities.koningStappen(board, stuk[0])
     verwachte_uitkomst = [stuk[0], [[[4, 3], [5, 2], [6, 1], [7, 0]]]]
     self.assertEqual(verwachte_uitkomst, alle_zetten)
예제 #4
0
 def test_koningNogEenKeerSlaan(self):
     """Wanneer een koning nog een keer kan slaan, heeft hij meestal wat minder vakjes waar hij na zijn eerste
     sprong op kan landen. Hier check ik of de definitie inderdaad alleen die vakken teruggeeft en de bijbehorende informatie teruggeeft."""
     board = definities.setup()
     stuk = Koningstukken3(board)
     stuk[0].promoveren()
     alle_zetten = definities.diagonaalKoningSpringen(
         board, definities.koningStappen(board, stuk[0]))
     verwachte_uitkomst = [stuk[0], [[[4, 3], [5, 2]]], 0]
     self.assertEqual(verwachte_uitkomst, alle_zetten)
예제 #5
0
 def test_koningStappenZetten(self):
     """Ik check of de definitie de juiste informatie teruggeeft wanneer een koning alleen maar kan zetten en niks kan pakken."""
     board = definities.setup()
     stuk = Koningstukken1(board)
     stuk[0].promoveren()
     alle_zetten = definities.koningStappen(board, stuk[0])
     verwachte_uitkomst = [
         0,
         [[3, 4], [2, 3], [1, 2], [0, 1], [5, 4], [6, 3], [7, 2], [3, 6],
          [2, 7], [5, 6], [6, 7]]
     ]
     self.assertEqual(verwachte_uitkomst, alle_zetten)
예제 #6
0
def innerLoop():
    """
    Deze loop is waar de magie gebeurt. Aan het begin worden andere definities en dergelijke aangeroepen om het
    spel op te starten. Ook wordt er gevraagd of je tegen een ai wil spelen of tegen een ander persoon. Zodra het game
    over is, stopt het spel en gaan we de definitie uit.
    """
    computer_beurt = None

    while True:  # Hier zeg je wat je voor instellingen wil
        computer = input('Wil je tegen de computer spelen? Y/N: ')
        if computer == 'N' or computer == 'n':
            break
        elif computer == 'Y' or computer == 'y':
            while True:
                difficulty = input(
                    'Op welke moeilijkheidsgraad wil je spelen? easy/medium/hard: '
                )
                if difficulty == 'easy':
                    moeilijkheidsgraad = 3
                    break
                elif difficulty == 'medium':
                    moeilijkheidsgraad = 5
                    break
                elif difficulty == 'hard':
                    moeilijkheidsgraad = 7
                    break
            while computer_beurt == None:
                voorkeur = input(
                    'Als welke kleur wil je beginnen?: wit/zwart/geen voorkeur: '
                )
                if voorkeur == 'wit' or voorkeur == 'Wit':
                    computer_beurt = False
                elif voorkeur == 'zwart' or voorkeur == 'Zwart':
                    computer_beurt = True
                elif voorkeur == 'geen voorkeur' or voorkeur == 'Geen voorkeur':
                    computer_beurt = random.choice([False, True])
            break

    pygame.init()  # Begin de game
    pygame.display.set_caption("Dammen")

    board = definities.setup()  # Zet het bord op
    pieces = definities.stukken(board)  # Zet de stukken erop
    aantal_witte_stukken = 12
    aantal_zwarte_stukken = 12

    aantal_koning_zetten = 0  # Hoe vaak de koningen achter elkaar hebben bewogen

    stuk_dat_moet_springen = 0  # Wanneer een stuk de vorige ronde heeft gesprongen maar nog een keer moet springen, wordt hier zijn naam opgeslagen
    # Om te garanderen dat dat stuk nu nog een keer slaat.

    afmetingen = [700, 700]  # Hoe groot het scherm is
    breedte = afmetingen[0] // 8
    hoogte = afmetingen[1] // 8
    scherm = pygame.display.set_mode(afmetingen)

    Damsteen.radius = afmetingen[0] // 20
    Damsteen.rand = afmetingen[1] // 150

    ai = DamAI()  # Hier wordt de ai gemaakt

    beurt = True  # Als beurt True is dan is wit aan de beurt

    game_over = 0
    while game_over == 0:
        if computer_beurt is None or beurt != computer_beurt:  # Als een menselijke speler aan de beurt is, dan gaan we verder
            for event in pygame.event.get():
                clock = pygame.time.Clock()

                if event.type == pygame.QUIT:  # Als je wilt stoppen of als één kleur geen stukken meer over heeft
                    game_over = 1
                    break

                if event.type == pygame.MOUSEBUTTONDOWN:  # Als je ergens op klikt
                    pos = pygame.mouse.get_pos()
                    oud_x = pos[0] // breedte
                    oud_y = pos[1] // hoogte
                    begin_positie = board[oud_y][
                        oud_x]  # begin_positie is de plek op het bord waar je op hebt geklikt

                    if begin_positie == 0:  # Als je een leeg vak selecteerd breken we meteen af
                        break

                    if beurt % 2 == begin_positie.team:  # Als de gekozen damsteen van het goede team is
                        while True:
                            event = pygame.event.wait()

                            alleen_sprong, game_over, stukken_die_kunnen_bewegen, hun_zetten = definities.watKanJeZetten(
                                board, pieces, beurt, False)

                            if game_over:
                                # Deze game over komt van de definitie 'watKanJeZetten'. Daarin kijken we ook of je wel een enkele zet hebt die je kan doen.
                                # Zo niet, dan is het game_over en wint het andere team
                                if alleen_sprong:
                                    print('Wit wint')
                                else:
                                    print('Zwart wint')
                                game_over = 1
                                break

                            if event.type == pygame.QUIT:
                                game_over = 1
                                break

                            if event.type == pygame.MOUSEBUTTONUP:  # Hier laten we onze muis los
                                new_pos = pygame.mouse.get_pos()
                                new_x = new_pos[0] // breedte
                                new_y = new_pos[1] // hoogte

                                if not definities.checkIfFriendly(
                                        board, new_x, new_y):
                                    # Als het gekozen nieuwe vak al bezet is. Kan je daar niks plaatsen en mag je opnieuw kiezen
                                    break

                                if begin_positie not in stukken_die_kunnen_bewegen:
                                    # Als ons gekozen stuk niet kan bewegen, is het beter om dat stuk niet te selecteren
                                    break

                                if stuk_dat_moet_springen != 0 and stuk_dat_moet_springen != begin_positie:
                                    # Als we een steen hebben die moet springen, maar niet springt, mag je opnieuw kiezen
                                    break

                                zetten = hun_zetten[stukken_die_kunnen_bewegen.
                                                    index(begin_positie)]

                                if begin_positie.king:  # Als de damsteen een koning is
                                    aantal_koning_zetten += 1
                                    if alleen_sprong:  # Als je een stuk kan pakken, is deze True
                                        for richting in zetten[1]:
                                            if [new_y, new_x] in richting[1:]:
                                                # Als onze zet kan veranderen we de nodige dingen om deze te verwerken
                                                begin_positie.nieuwe_positie(
                                                    new_x, new_y)

                                                gesprongen_stuk = richting[0]
                                                pieces.remove(
                                                    board[gesprongen_stuk[0]][
                                                        gesprongen_stuk[1]])

                                                board[new_y][new_x], board[oud_y][
                                                    oud_x], board[gesprongen_stuk[
                                                        0]][gesprongen_stuk[
                                                            1]] = begin_positie, 0, 0  # Update het bord

                                                aantal_witte_stukken, aantal_zwarte_stukken = definities.stukkenBijhouden(
                                                    aantal_witte_stukken,
                                                    aantal_zwarte_stukken,
                                                    begin_positie
                                                )  # Houdt het aantal zwarte en witte stukken bij

                                                if type(
                                                        zetten[-1]
                                                ) == int:  # Als we nog een keer een stuk kunnen pakken, willen we volgende ronde ook met dat stuk springen.
                                                    stuk_dat_moet_springen = zetten[
                                                        0]
                                                else:  # Anders draaien we de beurt om
                                                    definities.promoveer(
                                                        begin_positie)
                                                    stuk_dat_moet_springen = 0
                                                    beurt = not beurt

                                    else:  # Anders kan je je koning gewoon ergens naar verplaatsen
                                        if [new_y, new_x] in zetten[1]:
                                            begin_positie.nieuwe_positie(
                                                new_x, new_y)

                                            board[new_y][new_x], board[oud_y][
                                                oud_x] = begin_positie, 0
                                            definities.promoveer(begin_positie)
                                            beurt = not beurt

                                else:  # Als je hier komt heb je een normale damsteen geselecteerd
                                    aantal_koning_zetten = 0
                                    if alleen_sprong:  # Als je iets kan pakken
                                        for diagonaal in range(0, len(zetten)):
                                            positie = zetten[diagonaal]
                                            if [new_y, new_x] == positie[1]:
                                                begin_positie.nieuwe_positie(
                                                    new_x, new_y)

                                                te_verwijderen_stuk_positie = positie[
                                                    0]

                                                pieces.remove(
                                                    board[
                                                        te_verwijderen_stuk_positie[
                                                            0]]
                                                    [te_verwijderen_stuk_positie[
                                                        1]])

                                                aantal_witte_stukken, aantal_zwarte_stukken = definities.stukkenBijhouden(
                                                    aantal_witte_stukken,
                                                    aantal_zwarte_stukken,
                                                    begin_positie
                                                )  # Houdt het aantal zwarte en witte stukken bij

                                                board[new_y][new_x], board[oud_y][oud_x], \
                                                board[te_verwijderen_stuk_positie[0]][
                                                    te_verwijderen_stuk_positie[1]] = begin_positie, 0, 0  # Houdt het bord bij

                                                volgende_sprong = definities.damZetten(
                                                    board, begin_positie
                                                )  # We kijken of het stuk nog een keer kan springen

                                                if volgende_sprong:
                                                    if type(
                                                            volgende_sprong[0]
                                                        [0]
                                                    ) == list:  # Als hij nog een keer kan springen slaan dat stuk op:
                                                        stuk_dat_moet_springen = begin_positie
                                                    else:  # Anders gaan we door
                                                        stuk_dat_moet_springen = 0
                                                        definities.promoveer(
                                                            begin_positie)
                                                        beurt = not beurt

                                                else:  # Anders gaan we door
                                                    stuk_dat_moet_springen = 0
                                                    definities.promoveer(
                                                        begin_positie)
                                                    beurt = not beurt

                                    else:  # Als je niks kan pakken en alleen kan zetten
                                        if [new_y, new_x] in zetten:
                                            begin_positie.nieuwe_positie(
                                                new_x, new_y)

                                            board[new_y][new_x], board[oud_y][
                                                oud_x] = begin_positie, 0

                                            definities.promoveer(begin_positie)
                                            beurt = not beurt

                                eind = definities.einde(
                                    aantal_witte_stukken,
                                    aantal_zwarte_stukken)
                                if eind[0]:  # We kijken of je zojuist alle stukken van het andere team hebt gepakt.
                                    # Zo ja? Dan win je!
                                    if eind[1]:
                                        print('wit wint')
                                    else:
                                        print('zwart wint')
                                    game_over = 1
                                    break

                                if definities.herhaling(aantal_koning_zetten):
                                    # Checkt of je niet zojuist de 15e koning zet achter elkaar hebt gezet. Anders is het gelijkspel.
                                    game_over = 1
                                break

                clock.tick(10)  # Frames per second
                definities.draw_board(board, scherm, breedte,
                                      hoogte)  # We tekenen het nieuwe bord
                pygame.display.flip()  # We updaten het scherm

        else:  # Als de computer aan zet is
            kan_je_iets = definities.watKanJeZetten(board, pieces, beurt,
                                                    False)
            if kan_je_iets[
                    1]:  # Als de ai zijn stukken niet meer kan bewegen dan heb jij gewonnen!
                if kan_je_iets[0]:
                    print('Wit wint')
                else:
                    print('Zwart wint')
                break

            # Hieronder sturen we informatie naar een andere file waar de ai berekent wat de beste zet is.
            # Hij update voor ons al het bord, de positie van het stuk en nog een paar andere dingen.
            ai.upToDate(board, pieces, beurt, moeilijkheidsgraad,
                        aantal_witte_stukken, aantal_zwarte_stukken,
                        stuk_dat_moet_springen, aantal_koning_zetten)

            board, stuk_dat_moet_springen, beurt, [aantal_witte_stukken, aantal_zwarte_stukken], pieces, stuk = \
                ai.AIzet()

            if stuk.king:
                aantal_koning_zetten += 1

            if stuk_dat_moet_springen == 0:
                # Als een stuk nog een keer kan springen maar als op de koningsrij zit, mag hij nog niet gepromoveerd worden.
                definities.promoveer(stuk)

            definities.draw_board(board, scherm, breedte,
                                  hoogte)  # We tekenen het nieuwe bord
            pygame.display.flip()  # We updaten het scherm

            eind = definities.einde(aantal_witte_stukken,
                                    aantal_zwarte_stukken)
            if eind[0]:  # Als de ai zojuist al jouw stukken heeft gepakt, dan heeft hij gewonnen.
                if eind[1]:
                    print('wit wint')
                else:
                    print('zwart wint')
                break

            if definities.herhaling(
                    aantal_koning_zetten
            ):  # En als hij de 15e koning zet heeft gezet is het gelijkspel.
                break