Spring naar bijdragen

Aanbevolen berichten

18 uur geleden zei Fundamenteel:

 

Hij heeft hard gesproken, heel luid.

Kenmerk van de Heilige Geest is juist dat deze helemaal niet hard en luid is maar fluisterzacht, lieflijk en uitnodigend.  Het hoeft dan ook niet te verbazen dat de Heilige Geest vaak vrouwelijk werd gedacht. Zij is nooit dwingend en zij is bedroefd wanneer de mens niet luistert.

Het is omwille van deze lieflijke fluisterzachte, uiterst subtiele stem te kunnen verstaan dat een mens zijn geest dient te kalmeren en zich beter verre kan houden van luid en obsessief geschreeuw.  Luid en hard doet de Heilige Geest van je wijken.  Religie maakt  meer kapot dan u lief is.

 

Link naar bericht
Deel via andere websites
  • Antwoorden 56
  • Created
  • Laatste antwoord

Top Posters In This Topic

Top Posters In This Topic

Popular Posts

Ik lees zojuist dat Bazuinen stopt. Dat vind ik bijzonder jammer. Want credible is nog steeds een schip zonder kapitein. Bazuinen is daarom een reddingsboot. Jammer dat het deze rol niet gaat vervulle

Jij kunt de wereld niet veranderen. God wèl. 

He verdorie, daar ga je weer.  Mijn gedachte.. Die knipperlichtrelatie van je is fnuikend, je zit al jaren in de houdgreep bij iemand die helemaal niet voor jou gaat. Logisch dat je zelfbeeld en zelfv

57 minuten geleden zei Flawless victory:

Kenmerk van de Heilige Geest is juist dat deze helemaal niet hard en luid is maar fluisterzacht, lieflijk en uitnodigend.  Het hoeft dan ook niet te verbazen dat de Heilige Geest vaak vrouwelijk werd gedacht. Zij is nooit dwingend en zij is bedroefd wanneer de mens niet luistert.

Het is omwille van deze lieflijke fluisterzachte, uiterst subtiele stem te kunnen verstaan dat een mens zijn geest dient te kalmeren en zich beter verre kan houden van luid en obsessief geschreeuw.  Luid en hard doet de Heilige Geest van je wijken.  Religie maakt  meer kapot dan u lief is.

 

Als het langs alle kanten komt, en je hoort diverse christenen hetzelfde zeggen: dan is dat "luid spreken". Het is niet dat er in mijn oor geroepen werd he. 

Subjectief zagen en je overal beledigd bij voelen om het slachtoffer te spelen maakt meer kapot. De HG herstelt.

De HG wordt in de Bijbel als HIJ met voornaamwoord aangesproken.

 Zwijgen is uw wijsheid. Wanneer heb je dat eens door?

bewerkt door Fundamenteel
Link naar bericht
Deel via andere websites
Op 12-7-2024 om 23:19 zei Hermanos2:

Ik schep er geen genoegen in dat Bazuinen stopt. Integendeel. Het voorziet in een behoefte. 

Ik ook niet. Het liefst zou ik ook met een schone lei beginnen. Forum software is niet goedkoop en het opzetten kost een hoop tijd. 

Link naar bericht
Deel via andere websites
  • 1 month later...

Bazuinen was door omstandigheden offline, maar is nu permanent online. Maar zelf ga ik er niets meer aan doen anders dan het online te houden en later te verhuizen naar een VPS.

Ik ben aan iets anders begonnen. Een taal leren, ontworpen door een Nederlander, Guido van Rossum die fan van Monty Python was. Ik ben enorm verslaafd geworden en slijt er meer dan 4h per dag aan.

Een mens moet fouten maken om er van te leren. Ik had van de eerste keer een eigen forum uit een open source moeten nemen. Want nu kost dit tien keer niets. Daar kan ik het wel voor opbrengen natuurlijk. :D

Echter is Python alles wat de klok slaagt en zal ik mijn obsessieve aard op botvieren :D

Link naar bericht
Deel via andere websites
3 uur geleden zei Fundamenteel:

Bazuinen was door omstandigheden offline, maar is nu permanent online. Maar zelf ga ik er niets meer aan doen anders dan het online te houden en later te verhuizen naar een VPS.

Ik ben aan iets anders begonnen. Een taal leren, ontworpen door een Nederlander, Guido van Rossum die fan van Monty Python was. Ik ben enorm verslaafd geworden en slijt er meer dan 4h per dag aan.

Een mens moet fouten maken om er van te leren. Ik had van de eerste keer een eigen forum uit een open source moeten nemen. Want nu kost dit tien keer niets. Daar kan ik het wel voor opbrengen natuurlijk. :D

Echter is Python alles wat de klok slaagt en zal ik mijn obsessieve aard op botvieren :D

Bazuinen kan niet stoppen,  het was nog niet begonnen. Dat lijkt mij wel een voorwaarde om te kunnen stoppen.

Als doorgewinterde Python programmeur, mocht je vragen hebben...

Link naar bericht
Deel via andere websites
1 minuut geleden zei Mullog:

Bazuinen kan niet stoppen,  het was nog niet begonnen. Dat lijkt mij wel een voorwaarde om te kunnen stoppen.

Als doorgewinterde Python programmeur, mocht je vragen hebben...

Erh het stond 6 maanden online. Maar werd te duur voor wat het was dus was het +1 maand offline. Nu is het forum in mijn bezit en op een betaalbare server. 

Ik ben nu naar de mogelijkheden van for loops aan het kijken in python. Maar het zal voorbij data exploration met Pandas gaan.

Ben er toch consesuent dagelijks mee bezig, maar ben nog student :)

Link naar bericht
Deel via andere websites
4 uur geleden zei Fundamenteel:

Bazuinen was door omstandigheden offline, maar is nu permanent online. Maar zelf ga ik er niets meer aan doen anders dan het online te houden en later te verhuizen naar een VPS.

Ik ben aan iets anders begonnen. Een taal leren, ontworpen door een Nederlander, Guido van Rossum die fan van Monty Python was. Ik ben enorm verslaafd geworden en slijt er meer dan 4h per dag aan.

Een mens moet fouten maken om er van te leren. Ik had van de eerste keer een eigen forum uit een open source moeten nemen. Want nu kost dit tien keer niets. Daar kan ik het wel voor opbrengen natuurlijk. :D

Echter is Python alles wat de klok slaagt en zal ik mijn obsessieve aard op botvieren :D

Ik dacht dat je een vreemde taal ging leren maar het is kompjoetertaal...

Niks voor mij. Ik ben obsessief sporter. Hardlopen, krachttraining, etc. 

Link naar bericht
Deel via andere websites
5 minuten geleden zei Hermanos2:

Ik dacht dat je een vreemde taal ging leren maar het is kompjoetertaal...

Niks voor mij. Ik ben obsessief sporter. Hardlopen, krachttraining, etc. 

Ik ben een supernerd geworden.

Python is leuk en als je iets kan doen dat je leuk vindt... Er openen veel deuren als je vloeiend Python spreekt. Maar ik volg les bij iemand die daar ver gevorderd in is en na een week kan ik nog "maar*" het spel ots, schaar en papier schrijven zonder hulp. Met hulp (chat gpt) lukt veel meer, maar ik wil het ook zelf kunnen. 

Link naar bericht
Deel via andere websites
9 minuten geleden zei Fundamenteel:

Ik ben een supernerd geworden.

Python is leuk en als je iets kan doen dat je leuk vindt... Er openen veel deuren als je vloeiend Python spreekt. Maar ik volg les bij iemand die daar ver gevorderd in is en na een week kan ik nog "maar*" het spel ots, schaar en papier schrijven zonder hulp. Met hulp (chat gpt) lukt veel meer, maar ik wil het ook zelf kunnen. 

Ik heb geen flauw idee waar het over gaat. Ik heb een schurfthekel aan computers en internet. Er zijn zeker voordelen te noemen maar die worden overschaduwd door de nadelen. 

Link naar bericht
Deel via andere websites
1 uur geleden zei Fundamenteel:

Ik ben een supernerd geworden.

Python is leuk en als je iets kan doen dat je leuk vindt... Er openen veel deuren als je vloeiend Python spreekt. Maar ik volg les bij iemand die daar ver gevorderd in is en na een week kan ik nog "maar*" het spel ots, schaar en papier schrijven zonder hulp. Met hulp (chat gpt) lukt veel meer, maar ik wil het ook zelf kunnen. 

Ik kan je deze aanbevelen https://www.edx.org/learn/python/harvard-university-cs50-s-introduction-to-programming-with-python?index=product&queryID=e97ebabb801cc005f5d2527470b03d9d&position=3&linked_from=autocomplete&c=autocomplete om mee te beginnen. Is wel Engelstalig 

Link naar bericht
Deel via andere websites
9 minuten geleden zei Mullog:

Ja met zoiets soortgelijk ben ik ook bezig, maar gaat omhoog per les:

 

https://www.udemy.com/course/100-days-of-code/

Nu van 100 euro naar 18 euro, ik kocht. :)

1 uur geleden zei Hermanos2:

Ik heb geen flauw idee waar het over gaat. Ik heb een schurfthekel aan computers en internet. Er zijn zeker voordelen te noemen maar die worden overschaduwd door de nadelen. 

Python is gewoon leuk! :)

Link naar bericht
Deel via andere websites
17 minuten geleden zei Mullog:

De cursus achter mijn link is gratis (tenzij je een diploma wilt)

Ja ik ben nu al begonnen aan deze. Wat mij wel opvalt is dat ge onmogelijk alles kunt leren en toch best een pad op voorhand kiest om mee verder te gaan.

Maar het goede is dat ge door die site van Python snel wijzer wordt om uw script op te stellen. Wat nog beter is dat je modules kunt integreren en dus veel, alles, kunt automatiseren. Binnenkort met een GUI aan de slag. Udemy geeft wel certificaten bij een afgemaakte cursus, maar is niets waard. En bij Python is uw expertise meer waard dan eenderd welk papier. 

Begon zo simpel, maar ze kan moeilijk huiswerk geven :D

Link naar bericht
Deel via andere websites
1 uur geleden zei Mullog:

Geloof me, je gaat het nog zwaar krijgen 😂

Ja maar het is leuk. Vooruit kijkend naar django enzo, denk ik wel er meer plezier uit te halen naarmate de kennis vordert.

Net een schaakcomputer in py gedownload op github. Maar het uiteindelijke doel is zoveel mogelijk automatiseren.

Elke dag een paar uurtjes en wie weet ontwerp ik wel iets online met python. 

Link naar bericht
Deel via andere websites
Op 22-7-2024 om 16:53 zei sjako:

Ik ook niet. Het liefst zou ik ook met een schone lei beginnen. Forum software is niet goedkoop en het opzetten kost een hoop tijd. 

Mijn forum is gratis. En ik kan in de css kleuren veranderen. Geen reclame en geen moderatie. 

Lang leve open soource! Het vereist wel meer lezen. 

Link naar bericht
Deel via andere websites
30 minuten geleden zei Monachos:

Valt dit nou echt onder 'Nieuws en actualiteit'? Lijkt me meer iets voor 'Forumzaken - Tips en feedback'.

Het is wereldnieuws, dunkt mij? :D

@Mullog hier is die code van die AI schaakcomputer, zoals je kan zien is die heel simpel opgesteld. Maar ideaal om wat complexer te leren maken.

 

Citaat

import board, pieces, numpy

 

class Heuristics:

 

    # The tables denote the points scored for the position of the chess pieces on the board.

 

    PAWN_TABLE = numpy.array([

        [ 0,  0,  0,  0,  0,  0,  0,  0],

        [ 5, 10, 10,-20,-20, 10, 10,  5],

        [ 5, -5,-10,  0,  0,-10, -5,  5],

        [ 0,  0,  0, 20, 20,  0,  0,  0],

        [ 5,  5, 10, 25, 25, 10,  5,  5],

        [10, 10, 20, 30, 30, 20, 10, 10],

        [50, 50, 50, 50, 50, 50, 50, 50],

        [ 0,  0,  0,  0,  0,  0,  0,  0]

    ])

 

    KNIGHT_TABLE = numpy.array([

        [-50, -40, -30, -30, -30, -30, -40, -50],

        [-40, -20,   0,   5,   5,   0, -20, -40],

        [-30,   5,  10,  15,  15,  10,   5, -30],

        [-30,   0,  15,  20,  20,  15,   0, -30],

        [-30,   5,  15,  20,  20,  15,   0, -30],

        [-30,   0,  10,  15,  15,  10,   0, -30],

        [-40, -20,   0,   0,   0,   0, -20, -40],

        [-50, -40, -30, -30, -30, -30, -40, -50]

    ])

 

    BISHOP_TABLE = numpy.array([

        [-20, -10, -10, -10, -10, -10, -10, -20],

        [-10,   5,   0,   0,   0,   0,   5, -10],

        [-10,  10,  10,  10,  10,  10,  10, -10],

        [-10,   0,  10,  10,  10,  10,   0, -10],

        [-10,   5,   5,  10,  10,   5,   5, -10],

        [-10,   0,   5,  10,  10,   5,   0, -10],

        [-10,   0,   0,   0,   0,   0,   0, -10],

        [-20, -10, -10, -10, -10, -10, -10, -20]

    ])

 

    ROOK_TABLE = numpy.array([

        [ 0,  0,  0,  5,  5,  0,  0,  0],

        [-5,  0,  0,  0,  0,  0,  0, -5],

        [-5,  0,  0,  0,  0,  0,  0, -5],

        [-5,  0,  0,  0,  0,  0,  0, -5],

        [-5,  0,  0,  0,  0,  0,  0, -5],

        [-5,  0,  0,  0,  0,  0,  0, -5],

        [ 5, 10, 10, 10, 10, 10, 10,  5],

        [ 0,  0,  0,  0,  0,  0,  0,  0]

    ])

 

    QUEEN_TABLE = numpy.array([

        [-20, -10, -10, -5, -5, -10, -10, -20],

        [-10,   0,   5,  0,  0,   0,   0, -10],

        [-10,   5,   5,  5,  5,   5,   0, -10],

        [  0,   0,   5,  5,  5,   5,   0,  -5],

        [ -5,   0,   5,  5,  5,   5,   0,  -5],

        [-10,   0,   5,  5,  5,   5,   0, -10],

        [-10,   0,   0,  0,  0,   0,   0, -10],

        [-20, -10, -10, -5, -5, -10, -10, -20]

    ])

 

    @staticmethod

    def evaluate(board):

        material = Heuristics.get_material_score(board)

 

        pawns = Heuristics.get_piece_position_score(board, pieces.Pawn.PIECE_TYPE, Heuristics.PAWN_TABLE)

        knights = Heuristics.get_piece_position_score(board, pieces.Knight.PIECE_TYPE, Heuristics.KNIGHT_TABLE)

        bishops = Heuristics.get_piece_position_score(board, pieces.Bishop.PIECE_TYPE, Heuristics.BISHOP_TABLE)

        rooks = Heuristics.get_piece_position_score(board, pieces.Rook.PIECE_TYPE, Heuristics.ROOK_TABLE)

        queens = Heuristics.get_piece_position_score(board, pieces.Queen.PIECE_TYPE, Heuristics.QUEEN_TABLE)

 

        return material + pawns + knights + bishops + rooks + queens

 

    # Returns the score for the position of the given type of piece.

    # A piece type can for example be: pieces.Pawn.PIECE_TYPE.

    # The table is the 2d numpy array used for the scoring. Example: Heuristics.PAWN_TABLE

    @staticmethod

    def get_piece_position_score(board, piece_type, table):

        white = 0

        black = 0

        for x in range(8):

            for y in range(8):

                piece = board.chesspieces[x][y]

                if (piece != 0):

                    if (piece.piece_type == piece_type):

                        if (piece.color == pieces.Piece.WHITE):

                            white += table[x][y]

                        else:

                            black += table[7 - x][y]

 

        return white - black

 

    @staticmethod

    def get_material_score(board):

        white = 0

        black = 0

        for x in range(8):

            for y in range(8):

                piece = board.chesspieces[x][y]

                if (piece != 0):

                    if (piece.color == pieces.Piece.WHITE):

                        white += piece.value

                    else:

                        black += piece.value

 

        return white - black


 

class AI:

 

    INFINITE = 10000000

 

    @staticmethod

    def get_ai_move(chessboard, invalid_moves):

        best_move = 0

        best_score = AI.INFINITE

        for move in chessboard.get_possible_moves(pieces.Piece.BLACK):

            if (AI.is_invalid_move(move, invalid_moves)):

                continue

 

            copy = board.Board.clone(chessboard)

            copy.perform_move(move)

 

            score = AI.alphabeta(copy, 2, -AI.INFINITE, AI.INFINITE, True)

            if (score < best_score):

                best_score = score

                best_move = move

 

        # Checkmate.

        if (best_move == 0):

            return 0

 

        copy = board.Board.clone(chessboard)

        copy.perform_move(best_move)

        if (copy.is_check(pieces.Piece.BLACK)):

            invalid_moves.append(best_move)

            return AI.get_ai_move(chessboard, invalid_moves)

 

        return best_move

 

    @staticmethod

    def is_invalid_move(move, invalid_moves):

        for invalid_move in invalid_moves:

            if (invalid_move.equals(move)):

                return True

        return False

 

    @staticmethod

    def minimax(board, depth, maximizing):

        if (depth == 0):

            return Heuristics.evaluate(board)

 

        if (maximizing):

            best_score = -AI.INFINITE

            for move in board.get_possible_moves(pieces.Piece.WHITE):

                copy = board.Board.clone(board)

                copy.perform_move(move)

 

                score = AI.minimax(copy, depth-1, False)

                best_score = max(best_score, score)

 

            return best_score

        else:

            best_score = AI.INFINITE

            for move in board.get_possible_moves(pieces.Piece.BLACK):

                copy = board.Board.clone(board)

                copy.perform_move(move)

 

                score = AI.minimax(copy, depth-1, True)

                best_score = min(best_score, score)

 

            return best_score

 

    @staticmethod

    def alphabeta(chessboard, depth, a, b, maximizing):

        if (depth == 0):

            return Heuristics.evaluate(chessboard)

 

        if (maximizing):

            best_score = -AI.INFINITE

            for move in chessboard.get_possible_moves(pieces.Piece.WHITE):

                copy = board.Board.clone(chessboard)

                copy.perform_move(move)

 

                best_score = max(best_score, AI.alphabeta(copy, depth-1, a, b, False))

                a = max(a, best_score)

                if (b <= a):

                    break

            return best_score

        else:

            best_score = AI.INFINITE

            for move in chessboard.get_possible_moves(pieces.Piece.BLACK):

                copy = board.Board.clone(chessboard)

                copy.perform_move(move)

 

                best_score = min(best_score, AI.alphabeta(copy, depth-1, a, b, True))

                b = min(b, best_score)

                if (b <= a):

                    break

            return best_score

Wat je ook kan doen, als luie programmeur met skills: is een bot de spelregels en strategieën logisch inlepelen en zichzelf leren schaken. En die wordt dan beter en beter

Link naar bericht
Deel via andere websites
1 uur geleden zei Fundamenteel:

Het is wereldnieuws, dunkt mij? :D

@Mullog hier is die code van die AI schaakcomputer, zoals je kan zien is die heel simpel opgesteld. Maar ideaal om wat complexer te leren maken.

 

Wat je ook kan doen, als luie programmeur met skills: is een bot de spelregels en strategieën logisch inlepelen en zichzelf leren schaken. En die wordt dan beter en beter

Maar dat is een Class die je geeft. Daar moet toch nog wat omheen geprogrammeerd worden om te kunnen gebruiken.

Link naar bericht
Deel via andere websites
1 minuut geleden zei Mullog:

Maar dat is een Class die je geeft. Daar moet toch nog wat omheen geprogrammeerd worden om te kunnen gebruiken.

Ja uiteraard, er is nog een main.py, een board.py, pieces.py en de move.py.

Dat script dat ik deelde is de ai.py. Getest in mijn termina en het werkt. Maar de AI is nog wat dom in schaken. Dat moet aangepast worden in de code die ik deelde. Hier zijn er meerdere: https://github.com/topics/chess-game?l=python

Die AI Bert is ook Open Source en die kunt ge dan wat minder politiek correct instellen dan chatgpt of gemini. Maar zover ben ik uiteraard nog niet.

Ge kunt zelfs een API maken en die implementeren bij uw broker. Als je bv 10 euro aan BTC met een leverage laat traden op een futures, kunt ge wel wat bewegen zonder er zelf iets aan te doen. 

Link naar bericht
Deel via andere websites
2 uur geleden zei Mullog:

Maar dat is een Class die je geeft. Daar moet toch nog wat omheen geprogrammeerd worden om te kunnen gebruiken.

Is het thread safe?

Link naar bericht
Deel via andere websites
20 minuten geleden zei Breuk:

Is het thread safe?

uiteraard. Dat is allemaal open source en gratis. Open Source betekent dat iedereen in die code kan snollen en op fouten en meer kan controlleren.

@Mullog, ge moet deze bestanden opslagen in dezelfde map en dan de main in de terminal openen. "python main.py"
Wel opslagen zoals ze boven de quote aangegeven zijn, of het pathway klopt niet meer in de code
 

ai.py

Citaat

import board, pieces, numpy

 

class Heuristics:

 

    # The tables denote the points scored for the position of the chess pieces on the board.

 

    PAWN_TABLE = numpy.array([

        [ 0,  0,  0,  0,  0,  0,  0,  0],

        [ 5, 10, 10,-20,-20, 10, 10,  5],

        [ 5, -5,-10,  0,  0,-10, -5,  5],

        [ 0,  0,  0, 20, 20,  0,  0,  0],

        [ 5,  5, 10, 25, 25, 10,  5,  5],

        [10, 10, 20, 30, 30, 20, 10, 10],

        [50, 50, 50, 50, 50, 50, 50, 50],

        [ 0,  0,  0,  0,  0,  0,  0,  0]

    ])

 

    KNIGHT_TABLE = numpy.array([

        [-50, -40, -30, -30, -30, -30, -40, -50],

        [-40, -20,   0,   5,   5,   0, -20, -40],

        [-30,   5,  10,  15,  15,  10,   5, -30],

        [-30,   0,  15,  20,  20,  15,   0, -30],

        [-30,   5,  15,  20,  20,  15,   0, -30],

        [-30,   0,  10,  15,  15,  10,   0, -30],

        [-40, -20,   0,   0,   0,   0, -20, -40],

        [-50, -40, -30, -30, -30, -30, -40, -50]

    ])

 

    BISHOP_TABLE = numpy.array([

        [-20, -10, -10, -10, -10, -10, -10, -20],

        [-10,   5,   0,   0,   0,   0,   5, -10],

        [-10,  10,  10,  10,  10,  10,  10, -10],

        [-10,   0,  10,  10,  10,  10,   0, -10],

        [-10,   5,   5,  10,  10,   5,   5, -10],

        [-10,   0,   5,  10,  10,   5,   0, -10],

        [-10,   0,   0,   0,   0,   0,   0, -10],

        [-20, -10, -10, -10, -10, -10, -10, -20]

    ])

 

    ROOK_TABLE = numpy.array([

        [ 0,  0,  0,  5,  5,  0,  0,  0],

        [-5,  0,  0,  0,  0,  0,  0, -5],

        [-5,  0,  0,  0,  0,  0,  0, -5],

        [-5,  0,  0,  0,  0,  0,  0, -5],

        [-5,  0,  0,  0,  0,  0,  0, -5],

        [-5,  0,  0,  0,  0,  0,  0, -5],

        [ 5, 10, 10, 10, 10, 10, 10,  5],

        [ 0,  0,  0,  0,  0,  0,  0,  0]

    ])

 

    QUEEN_TABLE = numpy.array([

        [-20, -10, -10, -5, -5, -10, -10, -20],

        [-10,   0,   5,  0,  0,   0,   0, -10],

        [-10,   5,   5,  5,  5,   5,   0, -10],

        [  0,   0,   5,  5,  5,   5,   0,  -5],

        [ -5,   0,   5,  5,  5,   5,   0,  -5],

        [-10,   0,   5,  5,  5,   5,   0, -10],

        [-10,   0,   0,  0,  0,   0,   0, -10],

        [-20, -10, -10, -5, -5, -10, -10, -20]

    ])

 

    @staticmethod

    def evaluate(board):

        material = Heuristics.get_material_score(board)

 

        pawns = Heuristics.get_piece_position_score(board, pieces.Pawn.PIECE_TYPE, Heuristics.PAWN_TABLE)

        knights = Heuristics.get_piece_position_score(board, pieces.Knight.PIECE_TYPE, Heuristics.KNIGHT_TABLE)

        bishops = Heuristics.get_piece_position_score(board, pieces.Bishop.PIECE_TYPE, Heuristics.BISHOP_TABLE)

        rooks = Heuristics.get_piece_position_score(board, pieces.Rook.PIECE_TYPE, Heuristics.ROOK_TABLE)

        queens = Heuristics.get_piece_position_score(board, pieces.Queen.PIECE_TYPE, Heuristics.QUEEN_TABLE)

 

        return material + pawns + knights + bishops + rooks + queens

 

    # Returns the score for the position of the given type of piece.

    # A piece type can for example be: pieces.Pawn.PIECE_TYPE.

    # The table is the 2d numpy array used for the scoring. Example: Heuristics.PAWN_TABLE

    @staticmethod

    def get_piece_position_score(board, piece_type, table):

        white = 0

        black = 0

        for x in range(8):

            for y in range(8):

                piece = board.chesspieces[x][y]

                if (piece != 0):

                    if (piece.piece_type == piece_type):

                        if (piece.color == pieces.Piece.WHITE):

                            white += table[x][y]

                        else:

                            black += table[7 - x][y]

 

        return white - black

 

    @staticmethod

    def get_material_score(board):

        white = 0

        black = 0

        for x in range(8):

            for y in range(8):

                piece = board.chesspieces[x][y]

                if (piece != 0):

                    if (piece.color == pieces.Piece.WHITE):

                        white += piece.value

                    else:

                        black += piece.value

 

        return white - black


 

class AI:

 

    INFINITE = 10000000

 

    @staticmethod

    def get_ai_move(chessboard, invalid_moves):

        best_move = 0

        best_score = AI.INFINITE

        for move in chessboard.get_possible_moves(pieces.Piece.BLACK):

            if (AI.is_invalid_move(move, invalid_moves)):

                continue

 

            copy = board.Board.clone(chessboard)

            copy.perform_move(move)

 

            score = AI.alphabeta(copy, 2, -AI.INFINITE, AI.INFINITE, True)

            if (score < best_score):

                best_score = score

                best_move = move

 

        # Checkmate.

        if (best_move == 0):

            return 0

 

        copy = board.Board.clone(chessboard)

        copy.perform_move(best_move)

        if (copy.is_check(pieces.Piece.BLACK)):

            invalid_moves.append(best_move)

            return AI.get_ai_move(chessboard, invalid_moves)

 

        return best_move

 

    @staticmethod

    def is_invalid_move(move, invalid_moves):

        for invalid_move in invalid_moves:

            if (invalid_move.equals(move)):

                return True

        return False

 

    @staticmethod

    def minimax(board, depth, maximizing):

        if (depth == 0):

            return Heuristics.evaluate(board)

 

        if (maximizing):

            best_score = -AI.INFINITE

            for move in board.get_possible_moves(pieces.Piece.WHITE):

                copy = board.Board.clone(board)

                copy.perform_move(move)

 

                score = AI.minimax(copy, depth-1, False)

                best_score = max(best_score, score)

 

            return best_score

        else:

            best_score = AI.INFINITE

            for move in board.get_possible_moves(pieces.Piece.BLACK):

                copy = board.Board.clone(board)

                copy.perform_move(move)

 

                score = AI.minimax(copy, depth-1, True)

                best_score = min(best_score, score)

 

            return best_score

 

    @staticmethod

    def alphabeta(chessboard, depth, a, b, maximizing):

        if (depth == 0):

            return Heuristics.evaluate(chessboard)

 

        if (maximizing):

            best_score = -AI.INFINITE

            for move in chessboard.get_possible_moves(pieces.Piece.WHITE):

                copy = board.Board.clone(chessboard)

                copy.perform_move(move)

 

                best_score = max(best_score, AI.alphabeta(copy, depth-1, a, b, False))

                a = max(a, best_score)

                if (b <= a):

                    break

            return best_score

        else:

            best_score = AI.INFINITE

            for move in chessboard.get_possible_moves(pieces.Piece.BLACK):

                copy = board.Board.clone(chessboard)

                copy.perform_move(move)

 

                best_score = min(best_score, AI.alphabeta(copy, depth-1, a, b, True))

                b = min(b, best_score)

                if (b <= a):

                    break

            return best_score

board.py

Citaat

import pieces

from move import Move

 

class Board:

 

    WIDTH = 8

    HEIGHT = 8

 

    def __init__(self, chesspieces, white_king_moved, black_king_moved):

        self.chesspieces = chesspieces

        self.white_king_moved = white_king_moved

        self.black_king_moved = black_king_moved

 

    @classmethod

    def clone(cls, chessboard):

        chesspieces = [[0 for x in range(Board.WIDTH)] for y in range(Board.HEIGHT)]

        for x in range(Board.WIDTH):

            for y in range(Board.HEIGHT):

                piece = chessboard.chesspieces[x][y]

                if (piece != 0):

                    chesspieces[x][y] = piece.clone()

        return cls(chesspieces, chessboard.white_king_moved, chessboard.black_king_moved)

 

    @classmethod

    def new(cls):

        chess_pieces = [[0 for x in range(Board.WIDTH)] for y in range(Board.HEIGHT)]

        # Create pawns.

        for x in range(Board.WIDTH):

            chess_pieces[x][Board.HEIGHT-2] = pieces.Pawn(x, Board.HEIGHT-2, pieces.Piece.WHITE)

            chess_pieces[x][1] = pieces.Pawn(x, 1, pieces.Piece.BLACK)

 

        # Create rooks.

        chess_pieces[0][Board.HEIGHT-1] = pieces.Rook(0, Board.HEIGHT-1, pieces.Piece.WHITE)

        chess_pieces[Board.WIDTH-1][Board.HEIGHT-1] = pieces.Rook(Board.WIDTH-1, Board.HEIGHT-1, pieces.Piece.WHITE)

        chess_pieces[0][0] = pieces.Rook(0, 0, pieces.Piece.BLACK)

        chess_pieces[Board.WIDTH-1][0] = pieces.Rook(Board.WIDTH-1, 0, pieces.Piece.BLACK)

 

        # Create Knights.

        chess_pieces[1][Board.HEIGHT-1] = pieces.Knight(1, Board.HEIGHT-1, pieces.Piece.WHITE)

        chess_pieces[Board.WIDTH-2][Board.HEIGHT-1] = pieces.Knight(Board.WIDTH-2, Board.HEIGHT-1, pieces.Piece.WHITE)

        chess_pieces[1][0] = pieces.Knight(1, 0, pieces.Piece.BLACK)

        chess_pieces[Board.WIDTH-2][0] = pieces.Knight(Board.WIDTH-2, 0, pieces.Piece.BLACK)

 

        # Create Bishops.

        chess_pieces[2][Board.HEIGHT-1] = pieces.Bishop(2, Board.HEIGHT-1, pieces.Piece.WHITE)

        chess_pieces[Board.WIDTH-3][Board.HEIGHT-1] = pieces.Bishop(Board.WIDTH-3, Board.HEIGHT-1, pieces.Piece.WHITE)

        chess_pieces[2][0] = pieces.Bishop(2, 0, pieces.Piece.BLACK)

        chess_pieces[Board.WIDTH-3][0] = pieces.Bishop(Board.WIDTH-3, 0, pieces.Piece.BLACK)

 

        # Create King & Queen.

        chess_pieces[4][Board.HEIGHT-1] = pieces.King(4, Board.HEIGHT-1, pieces.Piece.WHITE)

        chess_pieces[3][Board.HEIGHT-1] = pieces.Queen(3, Board.HEIGHT-1, pieces.Piece.WHITE)

        chess_pieces[4][0] = pieces.King(4, 0, pieces.Piece.BLACK)

        chess_pieces[3][0] = pieces.Queen(3, 0, pieces.Piece.BLACK)

 

        return cls(chess_pieces, False, False)

 

    def get_possible_moves(self, color):

        moves = []

        for x in range(Board.WIDTH):

            for y in range(Board.HEIGHT):

                piece = self.chesspieces[x][y]

                if (piece != 0):

                    if (piece.color == color):

                        moves += piece.get_possible_moves(self)

 

        return moves

 

    def perform_move(self, move):

        piece = self.chesspieces[move.xfrom][move.yfrom]

        self.move_piece(piece, move.xto, move.yto)

 

        # If a pawn reaches the end, upgrade it to a queen.

        if (piece.piece_type == pieces.Pawn.PIECE_TYPE):

            if (piece.y == 0 or piece.y == Board.HEIGHT-1):

                self.chesspieces[piece.x][piece.y] = pieces.Queen(piece.x, piece.y, piece.color)

 

        if (piece.piece_type == pieces.King.PIECE_TYPE):

            # Mark the king as having moved.

            if (piece.color == pieces.Piece.WHITE):

                self.white_king_moved = True

            else:

                self.black_king_moved = True

           

            # Check if king-side castling

            if (move.xto - move.xfrom == 2):

                rook = self.chesspieces[piece.x+1][piece.y]

                self.move_piece(rook, piece.x+1, piece.y)

            # Check if queen-side castling

            if (move.xto - move.xfrom == -2):

                rook = self.chesspieces[piece.x-2][piece.y]

                self.move_piece(rook, piece.x+1, piece.y)

   

    def move_piece(self, piece, xto, yto):

        self.chesspieces[piece.x][piece.y] = 0

        piece.x = xto

        piece.y = yto

 

        self.chesspieces[xto][yto] = piece


 

    # Returns if the given color is checked.

    def is_check(self, color):

        other_color = pieces.Piece.WHITE

        if (color == pieces.Piece.WHITE):

            other_color = pieces.Piece.BLACK

 

        for move in self.get_possible_moves(other_color):

            copy = Board.clone(self)

            copy.perform_move(move)

 

            king_found = False

            for x in range(Board.WIDTH):

                for y in range(Board.HEIGHT):

                    piece = copy.chesspieces[x][y]

                    if (piece != 0):

                        if (piece.color == color and piece.piece_type == pieces.King.PIECE_TYPE):

                            king_found = True

 

            if (not king_found):

                return True

 

        return False

 

    # Returns piece at given position or 0 if: No piece or out of bounds.

    def get_piece(self, x, y):

        if (not self.in_bounds(x, y)):

            return 0

 

        return self.chesspieces[x][y]

 

    def in_bounds(self, x, y):

        return (x >= 0 and y >= 0 and x < Board.WIDTH and y < Board.HEIGHT)

 

    def to_string(self):

        string =  "    A  B  C  D  E  F  G  H\n"

        string += "    -----------------------\n"

        for y in range(Board.HEIGHT):

            string += str(8 - y) + " | "

            for x in range(Board.WIDTH):

                piece = self.chesspieces[x][y]

                if (piece != 0):

                    string += piece.to_string()

                else:

                    string += ".. "

            string += "\n"

        return string + "\n"

main.py

Citaat

import board, pieces, ai

from move import Move

 

# Returns a move object based on the users input. Does not check if the move is valid.

def get_user_move():

    print("Example Move: A2 A4")

    move_str = input("Your Move: ")

    move_str = move_str.replace(" ", "")

 

    try:

        xfrom = letter_to_xpos(move_str[0:1])

        yfrom = 8 - int(move_str[1:2]) # The board is drawn "upside down", so flip the y coordinate.

        xto = letter_to_xpos(move_str[2:3])

        yto = 8 - int(move_str[3:4]) # The board is drawn "upside down", so flip the y coordinate.

        return Move(xfrom, yfrom, xto, yto)

    except ValueError:

        print("Invalid format. Example: A2 A4")

        return get_user_move()

 

# Returns a valid move based on the users input.

def get_valid_user_move(board):

    while True:

        move = get_user_move()

        valid = False

        possible_moves = board.get_possible_moves(pieces.Piece.WHITE)

        # No possible moves

        if (not possible_moves):

            return 0

 

        for possible_move in possible_moves:

            if (move.equals(possible_move)):

                valid = True

                break

 

        if (valid):

            break

        else:

            print("Invalid move.")

    return move

 

# Converts a letter (A-H) to the x position on the chess board.

def letter_to_xpos(letter):

    letter = letter.upper()

    if letter == 'A':

        return 0

    if letter == 'B':

        return 1

    if letter == 'C':

        return 2

    if letter == 'D':

        return 3

    if letter == 'E':

        return 4

    if letter == 'F':

        return 5

    if letter == 'G':

        return 6

    if letter == 'H':

        return 7

 

    raise ValueError("Invalid letter.")

 

#

# Entry point.

#

board = board.Board.new()

print(board.to_string())

 

while True:

    move = get_valid_user_move(board)

    if (move == 0):

        if (board.is_check(pieces.Piece.WHITE)):

            print("Checkmate. Black Wins.")

            break

        else:

            print("Stalemate.")

            break

 

    board.perform_move(move)

 

    print("User move: " + move.to_string())

    print(board.to_string())

 

    ai_move = ai.AI.get_ai_move(board, [])

    if (ai_move == 0):

        if (board.is_check(pieces.Piece.BLACK)):

            print("Checkmate. White wins.")

            break

        else:

            print("Stalemate.")

            break

 

    board.perform_move(ai_move)

    print("AI move: " + ai_move.to_string())

    print(board.to_string())

move.py

Citaat

class Move:

 

    def __init__(self, xfrom, yfrom, xto, yto):

        self.xfrom = xfrom

        self.yfrom = yfrom

        self.xto = xto

        self.yto = yto

 

   

 

    # Returns true iff (xfrom,yfrom) and (xto,yto) are the same.

    def equals(self, other_move):

        return self.xfrom == other_move.xfrom and self.yfrom == other_move.yfrom and self.xto == other_move.xto and self.yto == other_move.yto

 

    def to_string(self):

        return "(" + str(self.xfrom) + ", " + str(self.yfrom) + ") -> (" + str(self.xto) + ", " + str(self.yto) + ")"

pieces.py

Citaat

import ai

from move import Move

 

class Piece():

 

    WHITE = "W"

    BLACK = "B"

 

    def __init__(self, x, y, color, piece_type, value):

        self.x = x

        self.y = y

        self.color = color

        self.piece_type = piece_type

        self.value = value



 

    # Returns all diagonal moves for this piece. This should therefore only

    # be used by the Bishop and Queen since they are the only pieces that can

    # move diagonally.

    def get_possible_diagonal_moves(self, board):

        moves = []

 

        for i in range(1, 8):

            if (not board.in_bounds(self.x+i, self.y+i)):

                break

 

            piece = board.get_piece(self.x+i, self.y+i)

            moves.append(self.get_move(board, self.x+i, self.y+i))

            if (piece != 0):

                break

 

        for i in range(1, 8):

            if (not board.in_bounds(self.x+i, self.y-i)):

                break

 

            piece = board.get_piece(self.x+i, self.y-i)

            moves.append(self.get_move(board, self.x+i, self.y-i))

            if (piece != 0):

                break

 

        for i in range(1, 8):

            if (not board.in_bounds(self.x-i, self.y-i)):

                break

 

            piece = board.get_piece(self.x-i, self.y-i)

            moves.append(self.get_move(board, self.x-i, self.y-i))

            if (piece != 0):

                break

 

        for i in range(1, 8):

            if (not board.in_bounds(self.x-i, self.y+i)):

                break

 

            piece = board.get_piece(self.x-i, self.y+i)

            moves.append(self.get_move(board, self.x-i, self.y+i))

            if (piece != 0):

                break

 

        return self.remove_null_from_list(moves)

 

    # Returns all horizontal moves for this piece. This should therefore only

    # be used by the Rooks and Queen since they are the only pieces that can

    # move horizontally.

    def get_possible_horizontal_moves(self, board):

        moves = []

 

        # Moves to the right of the piece.

        for i in range(1, 8 - self.x):

            piece = board.get_piece(self.x + i, self.y)

            moves.append(self.get_move(board, self.x+i, self.y))

 

            if (piece != 0):

                break

 

        # Moves to the left of the piece.

        for i in range(1, self.x + 1):

            piece = board.get_piece(self.x - i, self.y)

            moves.append(self.get_move(board, self.x-i, self.y))

            if (piece != 0):

                break

 

        # Downward moves.

        for i in range(1, 8 - self.y):

            piece = board.get_piece(self.x, self.y + i)

            moves.append(self.get_move(board, self.x, self.y+i))

            if (piece != 0):

                break

 

        # Upward moves.

        for i in range(1, self.y + 1):

            piece = board.get_piece(self.x, self.y - i)

            moves.append(self.get_move(board, self.x, self.y-i))

            if (piece != 0):

                break

 

        return self.remove_null_from_list(moves)

 

    # Returns a Move object with (xfrom, yfrom) set to the piece current position.

    # (xto, yto) is set to the given position. If the move is not valid 0 is returned.

    # A move is not valid if it is out of bounds, or a piece of the same color is

    # being eaten.

    def get_move(self, board, xto, yto):

        move = 0

        if (board.in_bounds(xto, yto)):

            piece = board.get_piece(xto, yto)

            if (piece != 0):

                if (piece.color != self.color):

                    move = Move(self.x, self.y, xto, yto)

            else:

                move = Move(self.x, self.y, xto, yto)

        return move

 

    # Returns the list of moves cleared of all the 0's.

    def remove_null_from_list(self, l):

        return [move for move in l if move != 0]

 

    def to_string(self):

        return self.color + self.piece_type + " "

 

class Rook(Piece):

 

    PIECE_TYPE = "H"

    VALUE = 500

 

    def __init__(self, x, y, color):

        super(Rook, self).__init__(x, y, color, Rook.PIECE_TYPE, Rook.VALUE)

 

    def get_possible_moves(self, board):

        return self.get_possible_horizontal_moves(board)

 

    def clone(self):

        return Rook(self.x, self.y, self.color)


 

class Knight(Piece):

 

    PIECE_TYPE = "T"

    VALUE = 320

 

    def __init__(self, x, y, color):

        super(Knight, self).__init__(x, y, color, Knight.PIECE_TYPE, Knight.VALUE)

 

    def get_possible_moves(self, board):

        moves = []

 

        moves.append(self.get_move(board, self.x+2, self.y+1))

        moves.append(self.get_move(board, self.x-1, self.y+2))

        moves.append(self.get_move(board, self.x-2, self.y+1))

        moves.append(self.get_move(board, self.x+1, self.y-2))

        moves.append(self.get_move(board, self.x+2, self.y-1))

        moves.append(self.get_move(board, self.x+1, self.y+2))

        moves.append(self.get_move(board, self.x-2, self.y-1))

        moves.append(self.get_move(board, self.x-1, self.y-2))

 

        return self.remove_null_from_list(moves)

 

    def clone(self):

        return Knight(self.x, self.y, self.color)


 

class Bishop(Piece):

 

    PIECE_TYPE = "B"

    VALUE = 330

 

    def __init__(self, x, y, color):

        super(Bishop, self).__init__(x, y, color, Bishop.PIECE_TYPE, Bishop.VALUE)

 

    def get_possible_moves(self, board):

        return self.get_possible_diagonal_moves(board)

 

    def clone(self):

        return Bishop(self.x, self.y, self.color)


 

class Queen(Piece):

 

    PIECE_TYPE = "Q"

    VALUE = 900

 

    def __init__(self, x, y, color):

        super(Queen, self).__init__(x, y, color, Queen.PIECE_TYPE, Queen.VALUE)

 

    def get_possible_moves(self, board):

        diagonal = self.get_possible_diagonal_moves(board)

        horizontal = self.get_possible_horizontal_moves(board)

        return horizontal + diagonal

 

    def clone(self):

        return Queen(self.x, self.y, self.color)


 

class King(Piece):

 

    PIECE_TYPE = "K"

    VALUE = 20000

 

    def __init__(self, x, y, color):

        super(King, self).__init__(x, y, color, King.PIECE_TYPE, King.VALUE)

 

    def get_possible_moves(self, board):

        moves = []

 

        moves.append(self.get_move(board, self.x+1, self.y))

        moves.append(self.get_move(board, self.x+1, self.y+1))

        moves.append(self.get_move(board, self.x, self.y+1))

        moves.append(self.get_move(board, self.x-1, self.y+1))

        moves.append(self.get_move(board, self.x-1, self.y))

        moves.append(self.get_move(board, self.x-1, self.y-1))

        moves.append(self.get_move(board, self.x, self.y-1))

        moves.append(self.get_move(board, self.x+1, self.y-1))

 

        moves.append(self.get_castle_kingside_move(board))

        moves.append(self.get_castle_queenside_move(board))

 

        return self.remove_null_from_list(moves)

 

    # Only checks for castle kingside

    def get_castle_kingside_move(self, board):

        # Are we looking at a valid rook

        piece_in_corner = board.get_piece(self.x+3, self.y)

        if (piece_in_corner == 0 or piece_in_corner.piece_type != Rook.PIECE_TYPE):

            return 0

 

        # If the rook in the corner is not our color we cannot castle (duh).

        if (piece_in_corner.color != self.color):

            return 0

       

        # If the king has moved, we cannot castle

        if (self.color == Piece.WHITE and board.white_king_moved):

            return 0

       

        if (self.color == Piece.BLACK and board.black_king_moved):

            return 0

 

        # If there are pieces in between the king and rook we cannot castle

        if (board.get_piece(self.x+1, self.y) != 0 or board.get_piece(self.x+2, self.y) != 0):

            return 0

       

        return Move(self.x, self.y, self.x+2, self.y)

 

    def get_castle_queenside_move(self, board):

        # Are we looking at a valid rook

        piece_in_corner = board.get_piece(self.x-4, self.y)

        if (piece_in_corner == 0 or piece_in_corner.piece_type != Rook.PIECE_TYPE):

            return 0

 

        # If the rook in the corner is not our color we cannot castle (duh).

        if (piece_in_corner.color != self.color):

            return 0

       

        # If the king has moved, we cannot castle

        if (self.color == Piece.WHITE and board.white_king_moved):

            return 0

       

        if (self.color == Piece.BLACK and board.black_king_moved):

            return 0

 

        # If there are pieces in between the king and rook we cannot castle

        if (board.get_piece(self.x-1, self.y) != 0 or board.get_piece(self.x-2, self.y) != 0 or board.get_piece(self.x-3, self.y) != 0):

            return 0

       

        return Move(self.x, self.y, self.x-2, self.y)


 

    def clone(self):

        return King(self.x, self.y, self.color)


 

class Pawn(Piece):

 

    PIECE_TYPE = "P"

    VALUE = 100

 

    def __init__(self, x, y, color):

        super(Pawn, self).__init__(x, y, color, Pawn.PIECE_TYPE, Pawn.VALUE)

 

    def is_starting_position(self):

        if (self.color == Piece.BLACK):

            return self.y == 1

        else:

            return self.y == 8 - 2

 

    def get_possible_moves(self, board):

        moves = []

 

        # Direction the pawn can move in.

        direction = -1

        if (self.color == Piece.BLACK):

            direction = 1

 

        # The general 1 step forward move.

        if (board.get_piece(self.x, self.y+direction) == 0):

            moves.append(self.get_move(board, self.x, self.y + direction))

 

        # The Pawn can take 2 steps as the first move.

        if (self.is_starting_position() and board.get_piece(self.x, self.y+ direction) == 0 and board.get_piece(self.x, self.y + direction*2) == 0):

            moves.append(self.get_move(board, self.x, self.y + direction * 2))

 

        # Eating pieces.

        piece = board.get_piece(self.x + 1, self.y + direction)

        if (piece != 0):

            moves.append(self.get_move(board, self.x + 1, self.y + direction))

 

        piece = board.get_piece(self.x - 1, self.y + direction)

        if (piece != 0):

            moves.append(self.get_move(board, self.x - 1, self.y + direction))

 

        return self.remove_null_from_list(moves)

 

    def clone(self):

        return Pawn(self.x, self.y, self.color)

En als dat allemaal juist opgeslagen wordt in dezelfde map, kunt ge schaken in uw Terminal. Maar ik speel liever met Bert in de Terminal.

Ik heb al online servers draaien, ik ben bereid om te delen (gratis)

Weldra breid ik uit naar onbeperkte SSD opslag en 32 gb ram om die AI aan machine learning te zetten.

Wat haalbaar is met dat vermogen, maar wel tijd vraagt. 

Link naar bericht
Deel via andere websites
1 uur geleden zei Breuk:

Is het thread safe?

Ik denk het wel. Je moet nogal wat weten voordat je het kunt gebruiken. Het is te ingewikkeld met een te beperkte doelgroep om voor hackers interessant te zijn.

Link naar bericht
Deel via andere websites
1 uur geleden zei Mullog:

Ik denk het wel. Je moet nogal wat weten voordat je het kunt gebruiken. Het is te ingewikkeld met een te beperkte doelgroep om voor hackers interessant te zijn.

Nochtans kunt ge een python module laten samenwerken met Kali Linux, en het heeft me dat project ook doen staken omdat ik te makkelijk in mijn buren hun routers geraakte.

Ge moet dat allemaal niet meer vanbuiten leren, logisch presenteren en dan laten doen.

Dat is niet moeilijk, maar wel een avondje lezen, 100 keer falen en 1 keer slagen om dan verder te bouwen. 

Bedenk ook hoeveel je kan laten crashen met een simpele for loop (while True) 

 

Doe eens Kali open en dan "nmap" installeren, dan in een module van Python voorprogrammeren en een listener alles laten loggen. Tis om schrik van te krijgen.

bewerkt door Fundamenteel
Link naar bericht
Deel via andere websites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Antwoord op deze discussie...

×   Plakken als rijke tekst.   Opmaak herstellen

  Er zijn maximaal 75 emoticons toegestaan.

×   Je link is automatisch geïntegreerd.   In plaats daarvan als link tonen

×   Je voorgaande bijdrage is hersteld.   Tekstverwerker leegmaken

×   Je kunt afbeeldingen niet direct plakken. Upload of voeg afbeeldingen in vanaf URL.


×
×
  • Nieuwe aanmaken...

Belangrijke informatie

We hebben cookies op je apparaat geplaatst om de werking van deze website te verbeteren. Je kunt je cookie-instellingen aanpassen. Anders nemen we aan dat je akkoord gaat. Lees ook onze Gebruiksvoorwaarden en Privacybeleid