Flawless victory 605 Geplaatst 16 juli Rapport Share Geplaatst 16 juli 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. Hopper reageerde hierop 1 Citeren Link naar bericht Deel via andere websites
Fundamenteel 1.017 Geplaatst 16 juli Rapport Share Geplaatst 16 juli (bewerkt) 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? 16 juli bewerkt door Fundamenteel Citeren Link naar bericht Deel via andere websites
Fundamenteel 1.017 Geplaatst 16 juli Rapport Share Geplaatst 16 juli meer luisteren, minder spreken Citeren Link naar bericht Deel via andere websites
sjako 699 Geplaatst 22 juli Rapport Share Geplaatst 22 juli 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. Citeren Link naar bericht Deel via andere websites
Fundamenteel 1.017 Geplaatst 13 september Rapport Share Geplaatst 13 september 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. Echter is Python alles wat de klok slaagt en zal ik mijn obsessieve aard op botvieren Citeren Link naar bericht Deel via andere websites
Mullog 641 Geplaatst 13 september Rapport Share Geplaatst 13 september 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. Echter is Python alles wat de klok slaagt en zal ik mijn obsessieve aard op botvieren 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... Citeren Link naar bericht Deel via andere websites
Fundamenteel 1.017 Geplaatst 13 september Rapport Share Geplaatst 13 september 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 Citeren Link naar bericht Deel via andere websites
Hermanos2 549 Geplaatst 13 september Auteur Rapport Share Geplaatst 13 september 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. Echter is Python alles wat de klok slaagt en zal ik mijn obsessieve aard op botvieren Ik dacht dat je een vreemde taal ging leren maar het is kompjoetertaal... Niks voor mij. Ik ben obsessief sporter. Hardlopen, krachttraining, etc. Citeren Link naar bericht Deel via andere websites
Fundamenteel 1.017 Geplaatst 13 september Rapport Share Geplaatst 13 september 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. Citeren Link naar bericht Deel via andere websites
Hermanos2 549 Geplaatst 13 september Auteur Rapport Share Geplaatst 13 september 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. Citeren Link naar bericht Deel via andere websites
Mullog 641 Geplaatst 13 september Rapport Share Geplaatst 13 september 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 Citeren Link naar bericht Deel via andere websites
Fundamenteel 1.017 Geplaatst 13 september Rapport Share Geplaatst 13 september 9 minuten geleden zei Mullog: 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 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! Citeren Link naar bericht Deel via andere websites
Mullog 641 Geplaatst 13 september Rapport Share Geplaatst 13 september 40 minuten geleden zei Fundamenteel: Nu van 100 euro naar 18 euro, ik kocht. De cursus achter mijn link is gratis (tenzij je een diploma wilt) Citeren Link naar bericht Deel via andere websites
Fundamenteel 1.017 Geplaatst 13 september Rapport Share Geplaatst 13 september 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 Citeren Link naar bericht Deel via andere websites
Mullog 641 Geplaatst 13 september Rapport Share Geplaatst 13 september 3 uur geleden zei Fundamenteel: Begon zo simpel, maar ze kan moeilijk huiswerk geven Geloof me, je gaat het nog zwaar krijgen 😂 Citeren Link naar bericht Deel via andere websites
Fundamenteel 1.017 Geplaatst 13 september Rapport Share Geplaatst 13 september 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. Citeren Link naar bericht Deel via andere websites
Fundamenteel 1.017 Geplaatst 14 september Rapport Share Geplaatst 14 september 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. Citeren Link naar bericht Deel via andere websites
Monachos 507 Geplaatst 14 september Rapport Share Geplaatst 14 september Valt dit nou echt onder 'Nieuws en actualiteit'? Lijkt me meer iets voor 'Forumzaken - Tips en feedback'. Citeren Link naar bericht Deel via andere websites
Fundamenteel 1.017 Geplaatst 14 september Rapport Share Geplaatst 14 september 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? @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 Citeren Link naar bericht Deel via andere websites
Mullog 641 Geplaatst 14 september Rapport Share Geplaatst 14 september 1 uur geleden zei Fundamenteel: Het is wereldnieuws, dunkt mij? @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. Citeren Link naar bericht Deel via andere websites
Fundamenteel 1.017 Geplaatst 14 september Rapport Share Geplaatst 14 september 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. Citeren Link naar bericht Deel via andere websites
Breuk 377 Geplaatst 14 september Rapport Share Geplaatst 14 september 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? Citeren Link naar bericht Deel via andere websites
Fundamenteel 1.017 Geplaatst 14 september Rapport Share Geplaatst 14 september 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. Citeren Link naar bericht Deel via andere websites
Mullog 641 Geplaatst 14 september Rapport Share Geplaatst 14 september 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. Citeren Link naar bericht Deel via andere websites
Fundamenteel 1.017 Geplaatst 14 september Rapport Share Geplaatst 14 september (bewerkt) 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. 14 september bewerkt door Fundamenteel Citeren Link naar bericht Deel via andere websites
Aanbevolen berichten
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.