80 likes | 151 Views
Project in XSB Prolog. Επεξεργασία και Αναπαράσταση Γνώσης Άνοιξη 200 8 Τμήμα Επιστήμης Υπολογιστών Πανεπιστημίου Κρήτης. “ Τάβλι ”. Το ζητούμενο είναι να δημιουργήσετε ένα παίκτη που θα παίζει ένα παιχνίδι τάβλι της επιλογής σας (πόρτες, πλακωτό, φεύγα).
E N D
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 που ήταν πριν.