Τεχνητή νοημοσύνη · Παιχνίδια δύο παικτών
Othello σε 3D
MiniMax με πριόνισμα α–β, WebGPU και δικτυακές παρτίδες.
1. Λειτουργίες
Το παιχνίδι προσφέρει αντίπαλο υπολογιστή, δύο παίκτες στο ίδιο μηχάνημα και online παιχνίδι με τυχαία αντιστοίχιση ή ιδιωτικό σύνδεσμο. Πριν από κάθε παρτίδα με AI, ο χρήστης επιλέγει μέγιστο βάθος αναζήτησης από 1 έως 6 και αν θα παίξει πρώτος (μαύρα) ή δεύτερος (λευκά). Το κουμπί ? ανοίγει και κλείνει την πλαϊνή στήλη κανόνων.
Ο εξυπηρετητής επιβεβαιώνει κάθε κίνηση, αναστρέφει όλα τα αιχμαλωτισμένα πούλια και ενημερώνει αυτόματα το ταμπλό και το σκορ. Άκυρες κινήσεις απορρίπτονται με μήνυμα. Όταν δεν υπάρχουν νόμιμες κινήσεις για τον επόμενο παίκτη, εμφανίζεται μήνυμα και η σειρά περνά αυτόματα στον άλλο. Όταν κανένας δεν έχει νόμιμη κίνηση, η παρτίδα ολοκληρώνεται.
Στο τέλος εμφανίζεται animation περιστροφής ολόκληρου του ταμπλό με ιπτάμενα πούλια και confetti. Οι μετασχηματισμοί είναι αποκλειστικά οπτικοί και δεν επηρεάζουν το τελικό αποτέλεσμα. Υπάρχει παράλειψη animation και σεβασμός της ρύθμισης reduced motion. Οι δύο online παίκτες ψηφίζουν ανεξάρτητα για νέα παρτίδα, με δυνατότητα απόσυρσης ψήφου. Στο ίδιο μηχάνημα υπάρχουν ξεχωριστές ψήφοι μαύρων και λευκών, ενώ η AI δέχεται αυτόματα. Οι νίκες και ισοπαλίες καταγράφονται ακριβώς μία φορά ανά γύρο, διατηρούνται στις επαναληπτικές παρτίδες και επανέρχονται μετά από επανεκκίνηση. Νέο τραπέζι ξεκινά νέα καταμέτρηση. Τα χρώματα και το βάθος AI διατηρούνται στα rematches.
Εκπαιδευτική λειτουργία AI lab
Δύο αντίπαλοι MiniMax παίζουν μεταξύ τους με ανεξάρτητη επιλογή βάθους για μαύρα και λευκά. Ο παρατηρητής επιλέγει βηματική εκτέλεση με Next turn (N) ή Autoplay με δυνατότητα Pause και επιλογή χρόνου ανάγνωσης. Κάθε τοποθέτηση ακολουθείται από σύντομη στρατηγική επεξήγηση και ένα επαναχρησιμοποιήσιμο μάθημα από το GPT-6 Luna, με reasoning effort max και Fast tier. Οι επεξηγήσεις βασίζονται στην πραγματική θέση, στις αιχμαλωσίες, στις νόμιμες εναλλακτικές, στις διαθέσιμες επόμενες κινήσεις και στα αποτελέσματα της αναζήτησης. Αποτελούν εκπαιδευτικές εκτιμήσεις της θέσης και δεν παρουσιάζονται ως κρυφή εσωτερική σκέψη του αλγορίθμου.
Η πλαϊνή στήλη επιτρέπει ανασκόπηση παλαιότερων κινήσεων· η εξαγωγή περιλαμβάνει τα μαθήματα μαζί με την καταγραφή του ταμπλό. Το Autoplay περιμένει να ολοκληρωθεί κάθε επεξήγηση και έπειτα εφαρμόζει την επιλεγμένη παύση. Αποτυχία της υπηρεσίας παγώνει την αυτόματη συνέχεια και παρέχει Retry explanation χωρίς νέα τοποθέτηση. Στην εγκατάσταση χρησιμοποιείται το υπάρχον Codex login μέσω του τοπικού runtime. Εναλλακτικά υποστηρίζεται το Responses API με κλειδί αποκλειστικά στον server. Δεν αποστέλλονται διαπιστευτήρια στον browser. Επιβεβαιώθηκαν πραγματικές κλήσεις Luna και εμφάνιση μαθημάτων και για τα δύο χρώματα. Οι αυτοματοποιημένες δοκιμές καλύπτουν πλήρη παρτίδα με επεξήγηση σε κάθε κίνηση, pause/step, αποτυχία και επανάληψη υπηρεσίας, επαναφορά μετά από restart και νέα εκπαιδευτική παρτίδα.
2. Αναπαράσταση και κανόνες
Το ταμπλό είναι μονοδιάστατος πίνακας 64 θέσεων. Το 0 δηλώνει κενό, το +1 μαύρο και το −1 λευκό. Η θέση υπολογίζεται ως 8 × γραμμή + στήλη. Στην εξαγωγή κειμένου χρησιμοποιούνται X για μαύρα, O για λευκά και τελείες για κενά.
Για κάθε υποψήφια κίνηση εξετάζονται οκτώ κατευθύνσεις. Μια ακολουθία αντίπαλων πιονιών αναστρέφεται μόνο όταν καταλήγει σε πούλι του παίκτη χωρίς ενδιάμεσο κενό. Η κίνηση πρέπει να αιχμαλωτίζει τουλάχιστον ένα πούλι. Ο έλεγχος ορίων εμποδίζει την αναδίπλωση μεταξύ γραμμών.
3. MiniMax και πριόνισμα α–β
Η AI μεγιστοποιεί την τιμή αξιολόγησης στις δικές της σειρές και την ελαχιστοποιεί στις σειρές του αντιπάλου. Τα όρια α και β μεταφέρονται αναδρομικά. Όταν β ≤ α, τα υπόλοιπα παιδιά του κόμβου παραλείπονται. Οι κινήσεις ταξινομούνται με βάση τα βάρη θέσεων, ώστε γωνίες και ευνοϊκές θέσεις να εξετάζονται νωρίς και να αυξάνεται το πριόνισμα.
MiniMax(board, turn, depth, α, β):
moves ← legalMoves(board, turn)
if no moves and opponent has no moves:
return terminalScore(board)
if no moves:
return MiniMax(board, opponent, depth, α, β)
if depth = 0:
return evaluate(board)
for move in ordered moves:
value ← MiniMax(apply(board, move), opponent, depth − 1, α, β)
update best value and α or β
if β ≤ α: break
return best valueΤο βάθος μετρά τοποθετήσεις πιονιών. Ένα υποχρεωτικό πέρασμα δεν μειώνει το βάθος. Η AI εξετάζει ακριβώς το επιλεγμένο βάθος, εκτός αν το παιχνίδι τελειώσει νωρίτερα. Δεν χρησιμοποιείται κρυφό χρονικό όριο που θα μείωνε το βάθος. Η χειρότερη χρονική πολυπλοκότητα παραμένει O(bd)· η ταξινόμηση και το α–β περιορίζουν τις πραγματικές θέσεις που εξετάζονται.
Συνάρτηση αξιολόγησης
Η μη τερματική αξιολόγηση αθροίζει: βάρη θέσεων (γωνίες +120, επικίνδυνες γειτονικές θέσεις έως −50), 12 × διαφορά κινητικότητας, 4 × πλεονέκτημα λιγότερων πιονιών στα σύνορα με κενές θέσεις, και διαφορά πλήθους πιονιών με βάρος 1 ή 8 όταν απομένουν λιγότερα από 16 κενά. Οι τιμές υπολογίζονται από την οπτική της AI. Τερματική νίκη αποτιμάται ως +100000 συν τη διαφορά πιονιών, ήττα ως −100000 συν τη διαφορά και ισοπαλία ως 0.
4. Γραφικά και αρχιτεκτονική
Το Three.js WebGPURenderer αποδίδει γεωμετρία ταμπλό και πιονιών, σκιές, φωτισμό, περιστροφή κάμερας και animations αναστροφής. Αν ο browser δεν προσφέρει WebGPU, ο ίδιος renderer χρησιμοποιεί WebGL 2. Το ανοιχτό μπλε φόντο, τα αιωρούμενα χειριστήρια και η λευκή στήλη κανόνων ακολουθούν το τοπικό Model viewer.
Ο Node.js server ελέγχει την κατάσταση και τη νομιμότητα όλων των παιχνιδιών. Το WebSocket μεταδίδει ενημερώσεις στους παίκτες. Δύο worker threads εκτελούν αναζητήσεις AI παράλληλα με το δικτυακό loop. Οι συνεδρίες αναγνωρίζονται με HttpOnly cookie, οι online κινήσεις ελέγχονται ως προς τον ιδιοκτήτη της σειράς και οι συνδέσεις WebSocket ελέγχονται ως προς το Origin.
Οι παρτίδες αποθηκεύονται τοπικά με αντικατάσταση αρχείου και επανέρχονται μετά από επανεκκίνηση. Υπάρχει μικρό παράθυρο έως περίπου 100 ms μεταξύ ενημέρωσης και εγγραφής σε περίπτωση απότομης διακοπής ρεύματος. Κλείνοντας προσωρινά τον browser διατηρείται το online τραπέζι για 90 δευτερόλεπτα. Στη συνέχεια η αποσύνδεση ενός παίκτη καταγράφεται ως ήττα του. Αν αποσυνδεθούν και οι δύο, δεν αποδίδεται αυτόματα νίκη σε κάποιον. Παρτίδες χωρίς ενημέρωση για 24 ώρες διαγράφονται. Η υλοποίηση προορίζεται για έναν server process με κοινή ουρά αντιστοίχισης.
5. Έλεγχοι
Η σουίτα περιλαμβάνει έλεγχο αρχικής διάταξης, οκτώ κατευθύνσεων αιχμαλωσίας, ορίων, άκυρων κινήσεων, αυτόματου περάσματος, τερματισμού με κενά και πλήρων παρτίδων. Η α–β αναζήτηση συγκρίνεται με ανεξάρτητο εξαντλητικό MiniMax σε τελικές θέσεις. Ελέγχονται επίσης επιλογή λευκών, πραγματικό βάθος AI, τοπικές σειρές, online συγχρονισμός, ιδιωτικά δωμάτια, επανασύνδεση, παραίτηση και διατήρηση μετά από επανεκκίνηση.
Οι browser δοκιμές χρησιμοποιούν πραγματικά clicks πάνω στη 3D σκηνή και ξεχωριστές συνεδρίες για αντίπαλους παίκτες. Στιγμιότυπα και αποτελέσματα αποθηκεύονται στον φάκελο test-results.
Η πλήρης σουίτα browser επαληθεύτηκε με native WebGPU στην AMD Radeon RX 9060 XT (RDNA 4, PCI 1002:7590), χωρίς να επιτρέπεται σιωπηρή μετάπτωση σε WebGL. Ελέγχθηκαν πραγματικά pixels από render targets στη μνήμη της GPU, τόσο σε διάταξη desktop όσο και mobile. Η ανάγνωση GPU pixels χρησιμοποιείται επειδή το headless Chromium δεν συνθέτει αξιόπιστα τον WebGPU canvas στα screenshots. Τα αποτελέσματα βρίσκονται στο test-results/native-browser-results.json. Οι δοκιμές WebGL 2 fallback καταγράφονται χωριστά.
6. Ενδεικτικές παρτίδες
Τα παρακάτω είναι αναπαραγώγιμες αυτοματοποιημένες παρτίδες της AI με ένα απλό ντετερμινιστικό αντίπαλο script. Δεν αποτελούν παρτίδες με άνθρωπο ή με πρόγραμμα άλλης ομάδας. Για να καλυφθεί η σχετική απαίτηση της εκφώνησης, παίξτε πραγματικές παρτίδες με άνθρωπο και χρησιμοποιήστε το κουμπί Export: παράγει αρχείο με κάθε κίνηση, το ταμπλό μετά από κάθε τοποθέτηση, περάσματα και τελικό αποτέλεσμα. Προσθέστε αυτές τις καταγραφές στην τελική παράδοση.
Τα πλήρη δεδομένα των αυτοματοποιημένων παραδειγμάτων διατίθενται ως JSON. Αναπαραγωγή: node scripts/generate-report.mjs.
Παρτίδα 1 — AI μαύρα (πρώτη), βάθος 3
Τελικό σκορ: μαύρα 48 — λευκά 16. Το πρόγραμμα κέρδισε. Το αντίπαλο script δίνει προτεραιότητα στις γωνίες και έπειτα στη μεγαλύτερη άμεση αιχμαλωσία, με ισοβαθμίες στη μικρότερη θέση πίνακα.
Ακολουθία κινήσεων
X:D3 · O:C3 · X:C4 · O:E3 · X:F6 · O:G7 · X:F3 · O:C5 · X:B4 · O:G2 · X:F4 · O:F5 · X:C6 · O:A4 · X:F2 · O:E2 · X:H8 · O:B6 · X:A6 · O:D6 · X:H1 · O:H2 · X:B5 · O:B7 · X:G1 · O:F1 · X:E1 · O:D2 · X:A7 · O:F7 · X:G4 · O:H4 · X:H3 · O:H7 · X:H5 · O:Pass · X:G3 · O:Pass · X:D1 · O:Pass · X:F8 · O:G5 · X:E6 · O:C7 · X:A8 · O:G6 · X:E7 · O:D7 · X:A3 · O:A5 · X:C8 · O:B8 · X:C1 · O:E8 · X:B2 · O:A1 · X:H6 · O:A2 · X:C2 · O:B3 · X:B1 · O:D8 · X:G8
A B C D E F G H 1 . . . . . . . . 2 . . . . . . . . 3 . . . . . . . . 4 . . . O X . . . 5 . . . X O . . . 6 . . . . . . . . 7 . . . . . . . . 8 . . . . . . . .
A B C D E F G H 1 . . . . . . . X 2 . . . . O O O O 3 . . O O O O . . 4 O O O O O O . . 5 . O X O O O . . 6 X O O O . X . . 7 . O . . . . X . 8 . . . . . . . X
A B C D E F G H 1 O X X X X X X X 2 O X X X X X X X 3 O X X X X X X X 4 O X X O X O X X 5 O X X X O X X X 6 X X X X X X X X 7 X O O O O X X X 8 X O O O O X X X
3 αυτόματα περάσματα. 7.216 συνολικές θέσεις αναζήτησης της AI.
Παρτίδα 2 — AI λευκά (δεύτερη), βάθος 3
Τελικό σκορ: μαύρα 7 — λευκά 57. Το πρόγραμμα κέρδισε. Το αντίπαλο script δίνει προτεραιότητα στις γωνίες και έπειτα στη μεγαλύτερη άμεση αιχμαλωσία, με ισοβαθμίες στη μικρότερη θέση πίνακα.
Ακολουθία κινήσεων
X:D3 · O:E3 · X:F3 · O:C5 · X:B6 · O:B5 · X:B4 · O:A5 · X:D6 · O:C3 · X:B3 · O:E2 · X:F2 · O:C4 · X:F4 · O:A6 · X:D2 · O:C7 · X:B7 · O:F5 · X:C6 · O:C2 · X:B2 · O:C1 · X:G5 · O:A1 · X:B1 · O:F1 · X:C8 · O:D7 · X:D8 · O:E6 · X:F6 · O:E7 · X:D1 · O:E8 · X:F7 · O:A3 · X:A4 · O:B8 · X:A7 · O:A8 · X:Pass · O:A2 · X:Pass · O:G1 · X:G2 · O:E1 · X:Pass · O:H1 · X:H2 · O:H6 · X:G4 · O:H4 · X:H3 · O:H5 · X:H7 · O:H8 · X:Pass · O:G8 · X:G7 · O:G3 · X:Pass · O:G6 · X:Pass · O:F8
A B C D E F G H 1 . . . . . . . . 2 . . . . . . . . 3 . . . . . . . . 4 . . . O X . . . 5 . . . X O . . . 6 . . . . . . . . 7 . . . . . . . . 8 . . . . . . . .
A B C D E F G H 1 . . O . . . . . 2 . X O X X X . . 3 . X O O X X . . 4 . X O X O X . . 5 O O O X O O . . 6 O X O X . . . . 7 . X O . . . . . 8 . . . . . . . .
A B C D E F G H 1 O O O O O O O O 2 O X X O O O O O 3 O O O O O O O O 4 O X O O O O O O 5 O X X O O O O O 6 O X O O O O O O 7 O O O X O O O O 8 O O O O O O O O
6 αυτόματα περάσματα. 6.500 συνολικές θέσεις αναζήτησης της AI.
7. Εκτέλεση και παράδοση
Φάκελος: /home/giorkos/othello. Παραγωγή client: npm run build. Έλεγχοι κανόνων και server: npm test. Έναρξη: npm start. Προεπιλεγμένη θύρα: 40085. Μόνιμη υπηρεσία: othello.service του χρήστη.
Στο Nginx Proxy Manager ορίστε HTTP προς την IP του server στη θύρα 40085, ενεργοποιήστε WebSocket Support, πιστοποιητικό HTTPS και Force SSL για το othello.justaprinter.me. Ο browser χρειάζεται HTTPS για WebGPU εκτός localhost.