Project in XSB Prolog Επεξεργασία και Αναπαράσταση Γνώσης Άνοιξη 2008 Τμήμα Επιστήμης Υπολογιστών Πανεπιστημίου Κρήτης
“Τάβλι” •Το ζητούμενο είναι να δημιουργήσετε –ένα παίκτη που θα παίζει ένα παιχνίδι τάβλι της επιλογής σας (πόρτες, πλακωτό, φεύγα). –ένα περιβάλλον σε XSB μέσα στο οποίο ένας χρήστης θα μπορεί να παίξει τάβλι με τον παίκτη που δημιουργήσατε •Έλάχιστη απαίτηση του project είναι να τηρούνται όλοι οι κανόνες του παιχνιδίου που επιλέξατε (και από τους δύο παίκτες) •Αφού έχει καλυφθεί η ελάχιστη απαίτηση, προσπαθήστε να δημιουργήσετε στρατηγικές επιλογής ‘έξυπνων’ κινήσεων για τον παίκτη που δημιουργήσατε. •Για ευκολία μπορείτε να κάνετε τις ακόλουθες θεωρήσεις: –Το παιχνίδι ξεκινάει τυχαία από τον ένα από τους δύο πάικτες –Οι διπλές ζαριές ‘παίζονται’ ακριβώς όπως και οι άλλες (π.χ. στις εξάρες παίζονται 2 εξάρια αντί για 4)
Αναπαράσταση Γνώσης •Πούλια, π.χ. b, w ή checker(b,1),…,checker(b,15),checker(w,1),…,checker(w,15) •Παίκτες, π.χ. pc / user •Ζάρια, π.χ. dice(3,4) •Σειρά για να παίξει, π.χ. turn(pc) / turn(user) •Κατάσταση παιχνιδού, π.χ. board([b,b],[],[],[],[],[w,w,w,w,w],[],[w,w,w],[],[],[],[b,b,b,b,b],[w,w,w,w,w],[],[],[],[b,b,b],[],[b,b,b,b,b],[],[],[],[],[w,w]) •Μπάρα (για τις πόρτες), π.χ. bar([w,w]) •Πούλια που έχει μαζέψει ο κάθε παίκτης, π.χ. collected(pc,[w,w]) / collected(pc,2) •Κίνηση, π.χ. move(user,1,4,1,3) •…
Αναπαράσταση Γνώσης •Κάποιες δομές μπορεί επίσης να αναπαρασταθούν με τη χρήση ενός βοηθητικού κατηγορήματος, π.χ. pred(dice,[3,4]) pred(turn,pc) pred(board,[[w,w],[],…]) pred(bar,[w,w]) pred(collected,5)
Αναπαράσταση Γνώσης •Χρειάζεται επίσης να αναπαραστήσουμε δύο τύπους κανόνων: –Κανόνες που ορίζουν τις επιτρεπτές κινήσεις σε ένα παιχνίδι. Αυτοί θα είναι κανόνες περιορισμού. –Κανόνες που ορίζουν στρατηγικές – οι κανόνες αυτοί θα ορίζουν τις «καλές» / «έξυπνες» κινήσεις στο παιχνίδι.
Ορισμός δυναμικών κατηγορημάτων •Κάποιες ιδιότητες / δομές που αναμένουμε ότι θα αλλάζουν κατά την διάρκεια του παιχνιδιού θα πρέπει να ορίζονται δυναμικά. •Παράδειγμα: turn(pc) ή pred(turn,pc) •Για να μπορούμε να χειριστούμε μία δομή δυναμικά, στην αρχή του προγράμματος κάνουμε τη δήλωση: :- dynamic turn/1 ή :- dynamic pred/2. Στη συνέχεια μπορούμε να προσθέσουμε / αφαιρέσουμε δεδομένα από τη βάση γνώσης με χρήστη των: assert(…),retract(…) π.χ. coin_flip :- datime_setrand, random(1,101,I), (I>50 -> assert(turn(player)) ; assert(turn(cpu))), assert(lastcollect(player)). move(pc,A1,A2,B1,B2):- …,retract(turn(pc)),assert(turn(user)).
Αρχή του παιχνιδιού •Στην αρχή μίας παρτίδας –Επιστρέφουμε στην αρχική κατάσταση το τάβλι –Ρίχνουμε κορώνα-γράμματα για να αποφασίσουμε ποιος θα παίξει πρώτος –Αυτός που παίζει πρώτος ρίχνει τα ζάρια και •αν είναι ο pc, αποφασίζει με βάση τους κανόνες μία κίνηση την οποία και εκετλεί •αν είναι ο user, εισάγει μία κίνηση την οποία το πρόγραμμα θα πρέπει να ελέγξει αν είναι έγκυρη και να την εκτελέσει –Αλλάζει η σειρά new_game :- initialize_board, coin_flip, turn(X), throw_dice, dice(D1,D2), (X =:= player -> execute_user_move; move(pc,A1,A2,B1,B2)).
Εναλλακτική αναπαράσταση •Πούλια του κάθε παίκτη user([1,1,12,12,12,12,12,17,17,17,19,19,19,19,19]). pc([24,24,13,13,13,13,13,8,8,8,6,6,6,6,6]). •Κίνηση move(user,A1,A2):- user(L), valid(user,A1,A2), delete_ith(A1,L,Pos,RestList), append(RestList,A2,NewL), retract(user(L)), assert(user(NewL)), retract(turn(user)), assert(turn(pc)). Το move(user,A1,A2) αλλάζει τη θέση στο πούλι που βρίσκεται στην θέση Α1 της λίστας των πουλιών του χρήστη σε Α2 από Pos που ήταν πριν.