Τρίτη 12 Ιανουαρίου 2016

Εξομοιωτης Επιτραπέζιου "Φιδάκι".

(Υπάρχει έκδοση 2 με αντικείμενα, εδώ)

Σε αυτό το πρόγραμμα έχω βάλει ένα φιδάκι να παίζει μόνο του με τέσσερις "παίκτες" και με ζάρι από 1 έως 4. Δίνει τη σειρά νικητών..με 1 ο πρώτος που τερματίζει!

Χρειαζόμαστε το ταμπλό του επιτραπέζιου:
https://drive.google.com/open?id=0BwSrrDW66vvvbFhtUVZYOF9tU1U

με Win Dir$ στην γραμμή εντολών ανοίγει ο Explorer στο φάκελο που γράφουμε τα προγράμματα της Μ2000. Εκεί ρίχνουμε και το snake.bmp


Προστέθηκε το όλα=0 γιατί αλλιώς αν το κίτρινο πιόνι έμενε τελευταίο συνέχιζε μέχρι να βγει και αυτό ενώ τώρα τερματίζει αν μείνει μόνο του.
            Αν νικητές=3 Τότε όλα=0 : Έξοδος

Η εντολή Διαμέσου (Gosub) στις ρουτίνες με παρενθέσεις είναι προεραιτική. Αν η ρουτίνα δεν δέχεται ορίσματα θα πρέπει να βάζουμε τις παρενθέσεις ακόμα και χωρίς όρισμας:
Πχ η κλήση:

Βάλε_Τίτλο("Φιδάκι", 0, θυ*.8, 0)
μπορεί να γίνει χωρίς τη Διαμέσου. Εκτός και αν υπάρχει πίνακας με ίδιο όνομα, οπότε θα βγει λάθος, γιατί ο διερμηνευτής δίνει προτεραιότητα στους πίνακες. Βάζοντας όμως την Διαμέσου ο διερμηνευτής ξέρει ότι ζητάμε ρουτίνα. Στις νεότερς εκδόσεις της γλώσσας, μετά τη πρώτη αναζήτηση (γίνεται από το τέλος, οπότε και εκεί βάζουμε τις ρουτίνες), καταγράφεται και σε κάθε επόμενη ο δειρμηνευτήςξέρει επακριβώς τι θα καλέσει και πώς!
Οι ρουτίνες έχουν θέαση ότι έχει το τμήμα που της κάλεσε. Οι παράμετροι είναι τοπικές μεταβλητές και μπορούμε να ορίσουμε τοπικές που σκιάζουν άλλες με ίδιο όνομα στο τμήμα. Επίσης αν δεν κάνουμε κλήση μέσα από μπλοκ εντολών μέσα στη ρουτίνα, έχουμε μεγάλο περιθώριο για αναδρομή. Υπάρχει η εντολή Όριο.Αναδρομής (με την τελεία ανάμεσα) που δίνει το τρέχον ή με όρισμα έναν αριθμό βάζει το όριο. Εξ ορισμού είναι το 10000 αλλά μπορούμε να βάλουμε 50000, ότι θέλουμε. Οι συναρτήσεις έχουν άλλο όριο, περίπου 3250 κλήσεις, γιατί έχουν διαφορετικό τρόπο κλήσης (εσωτερικά).
Κάθε τμήμα και συνάρτηση μπορεί να έχει τις δικές του ρουτίνες, αλλά για συντομία μπορούμε να τις γράφουμε στο ίδιο κείμενο που γράφουμε τα τμήματα ή το πατρικό του τμήματος, οπότε ο διερμηνευτής το τραβάει από εκεί, αλλά σαν να ήταν στο χώρο του τμήματος.
Αν δώσουμε λάθος όνομα (δηλαδή ανύπαρκτο) τότε θα βγεί λάθος.
Επιπλέον ότι νέο δημιουργούμε στη ρουτίνα, διαγράφεται στο πέρας εκτέλεσης. Υπάρχουν και οι απλές ρουτίνες χωρίς ορίσματα με κλήση ετικέτας μόνο, και χωρίς διαγραφή νέων ορισμών, αλλά πρέπει οι ετικέτες να είναι στο χώρο του τμήματος, και το όνομα έχει σημασία να είναι το ίδιο (ενώ στις ρουτίνες με παρενθέσεις μπορεί να έχουμε κεφαλαία ή πεζά)



\\ Φιδάκι!
Οθόνη,0
Καθαρό Α$
Κλάση Κ_5χ6 {
      θ, μεταφορά$
      Συνάρτηση Χ { =(-1) υπολ 6}      
      Συνάρτηση Υ { =(-1) Δια 6}
}
Κλάση Πιόνι {
      θέση_π, νο
      νέα_θέση
      Τμήμα Αφαίρεσε {
            .θέση_π<=0
      }
      Τμήμα Μετακίνηση {
            .θέση_π<=.νέα_θέση
            .νέα_θέση<=0
      }
}
Πίνακας Θέσεις(31)=Κ_5χ6(), Πιόνια(4)=Πιόνι(), ΣειράΝικητών(4)
Για ι=1 Έως 4 { Για Πιόνια(ι-1) {.θέση_π=1 : .νο=ι}}
Για ι=1 εως 30 {
      Αν ((ι-1) Υπολ 12)>5 Τότε { θέσεις(ι).θ=6*((ι-1) Δια 6)+(6-(ι-1) υπολ 6) } Αλλιώς θέσεις(ι).θ=ι
}
\\ φίδια!
Θέσεις(27).μεταφορά$="22,23,24,13,12,1"
Θέσεις(21).μεταφορά$="16,15,10,9"
Θέσεις(19).μεταφορά$="18,7"
Θέσεις(17).μεταφορά$="8,9,4"
\\ σκάλες
Θέσεις(3).μεταφορά$="10,15,22"
Θέσεις(5).μεταφορά$="8"
Θέσεις(11).μεταφορά$="14,23,26"
Θέσεις(20).μεταφορά$="29"
\\ εικόνα
Εικόνα "snake" στο Α$
Γενικές χ,υ, θχ, θυ, Χρ(5)
Χρ(1)=14,11,13,12
Διαμέσου Στοίχισε(&α$, ,,&θχ,&θυ)
Ανανεώση 5000
Φοντο 1,5
κ=υ/1200
Διαμέσου Βάλε_Τίτλο("Φιδάκι", 0, θυ*.8, 0)
Διαμέσου Βάλε_Τίτλο("Ζάρι", 0,θυ*.4, θυ, θχ)
Διαμέσου ΠλαίσιοΠαικτών(0,θυ*.4, Θυ, θχ, κ)
Για ι=1 Έως 4 {
      Διαμέσου ΠιόνιΣτοΠλαίσιο(0,θυ*.4,θυ, θχ, κ, ι)
}
Διαμέσου Βάλε_Τίτλο("Σειρά", θχ+χ,θυ*.4, θυ)
Διαμέσου ΠλαίσιοΠαικτών(θχ+χ,θυ*.4,θυ,Χ.σημεία, κ)
Για ι=1 Έως 4 {
      Διαμέσου ΠιόνιΣτοΠλαίσιο(θχ+χ,θυ*.4, θυ,Χ.σημεία, κ, ι)
}
θέση θχ, θυ
Εικόνα Α$, χ
\\ το φιδάκι έχει 6 Χ 5 θέσεις
Κάνε ΜετΧ(χχ,κ)=(χ Δια 6)*χχ+(κ/30)*χ+χ/40+θχ
Κάνε ΜετΥ(υυ)=(υ Δια 5)*υυ+υ/20+θυ
Κράτησε
cls, -5
Διαμέσου Δείξε_Όλα(-1,"")
ολα=1
Νικητές=0
Ενώ Ενκομ$="" και ολα>0  {
      ολα=0
      Για ι=1 Έως 4 {
            Αν πιόνια(ι-1).θέση_π>0 Τότε {
                  ολα++
                  ζαρι=Τυχαίος(1,4)   '' μικρό ζάρι!
                  Για μ=1 Έως ζάρι {
                        Διαμέσου ΠαίξεΜε(ι, 1, ζαρι=μ, μορφή$("{0}",Ζάρι))
                  }     
            }
            Αν νικητές=3 Τότε όλα=0 : Έξοδος      }
}
Αν νικητές=3 Τότε {
      Για ι=1 Έως 4 {
            Αν πιόνια(ι-1).θέση_π>0 Τότε πιόνια(ι-1).θέση_π=0 : ΣειράΝικητών(ι-1)=4
      }
}
Διαμέσου Δείξε_Όλα(-1,"")
Τέλος
Ρουτίνα ΠαίξεΜε(πιόνι, ζάρι, τελικό, ζαρ$)
      Τοπική πιόνι1=-1, μεζάρι=Αληθές, πρ$
      Σωρός Νέος {
            Για Πιόνια(πιόνι-1) {
                        Αν μεζάρι Τότε {
                        Άν (ζάρι+.θέση_π)<=30 Τότε { .νέα_θέση=ζάρι+.θέση_π 
                                 πιόνι1=πιόνι
                                 Αν τελικό Τότε {
                                       πρ$=Θέσεις(.νέα_θέση).μεταφορά$
                                       Αν πρ$<>"" Τότε Σωρός πρ$
                                 }
                           } Αλλιώς .θέση_π=0 : νικητές++ : ΣειράΝικητών(πιόνι-1)=νικητές
                  } Αλλιώς {
                          Διάβασε .νέα_θέση     
                  }   
            }
            Διαμέσου Δείξε_Όλα(πιόνι1, ζαρ$) 
            μεζάρι=0
            Αν ΕινΑρ Τότε Κυκλικά
      }
Τέλος Ρουτίνας
Ρουτίνα Δείξε_Όλα(εκτός, λεζ$)
      Τοπική ι, κιν, εξ=αληθές
      Για κιν=1 Έως 4 {
            Άφησε
            Για ι=0 Έως 3 {
                  Για Πιόνια(ι) {
                        Αν .θέση_π>0 Τότε {
                              Αν .νο<>εκτός Τότε {
                                    Για θέσεις(.θέση_π) {
                                          Διαμέσου Πιόνι(..Χ(),..Υ(),.νο)
                                    } 
                              } Αλλιώς {
                                    Διαμέσου ΠιόνιΚιν(Θέσεις(.θέση_π).Χ(),Θέσεις(.θέση_π).Υ(), Θέσεις(.νέα_θέση).Χ(),Θέσεις(.νέα_θέση).Υ(),κιν, .νο)
                                    εξ=Ψευδές
                                    Αν κιν=4 Τότε .μετακίνηση
                              }
                        }            
                  }
                  Αν ΣειράΝικητών(ι)>0 Τότε Διαμέσου ΛεζάνταΣτοΠλαίσιο(θχ+χ,θυ*.4, θυ,Χ.σημεία, κ, ι+1, μορφή$("{0}",ΣειράΝικητών(ι)))
            }
            Αν εκτός>=0 Τότε {
                  Διαμέσου ΛεζάνταΣτοΠλαίσιο(0, θυ*.4,θυ,θχ ,κ,εκτός, λεζ$)
            }
            Αναμονή 5
            Ανανέωση 5000
            Αν εξ Τότε Έξοδος
      }
Τέλος Ρουτίνας
Ρουτίνα Στοίχισε(&εικόνα$, &χχ, &υυ, &μ_χ, &μ_υ)
      Τοπική αναλογία_εικόνας
      αναλογία_εικόνας=Εικόνα.Χ.Σημεία(εικόνα$)/Εικόνα.Υ.Σημεία(εικόνα$)
      χχ=Χ.σημεία*.7
      υυ=Υ.σημεία*.7
      Αν χχ>αναλογία_εικόνας*υυ Τότε {χχ=αναλογία_εικόνας*υυ} Αλλιώς υυ=χχ/αναλογία_εικόνας
      μ_χ=(Χ.σημεια-χχ) Δια 2
      μ_υ=(Υ.σημεια-υυ) Δια 2
Τέλος Ρουτίνας
Ρουτίνα Πιόνι(χ1, υ1, νο)
      Θέση ΜετΧ(χ1,νο-1),ΜετΥ(4-υ1)
      βήμα χ/120, υ*3/44
      Πάχος 3 { Πένα 0 { Κύκλος Γέμισμα Χρ(νο), υ*3/44,3 } }
Τέλος Ρουτίνας
Ρουτίνα ΠιόνιΚιν(χ1, υ1, χ2,υ2, κιν, νο)   
      Θέση ΜετΧ(χ1,νο-1)-κιν*(ΜετΧ(χ1,νο-1)-ΜετΧ(χ2,νο-1))/4,ΜετΥ(4-υ1)-κιν*(ΜετΥ(4-υ1)-ΜετΥ(4-υ2))/4
      βήμα χ/120, υ*3/44
      Πάχος 3 { Πένα 0 { Κύκλος Γέμισμα Χρ(νο), υ*3/44,3 } }
Τέλος Ρουτίνας
Ρουτίνα Βάλε_Τίτλο(τ$, χ1, μυ, υ2)
      Αν Ταύτιση("Α") Τότε { Διάβασε Τοπικά χ2 } Αλλιώς χ2=χ.σημειά
      Τοπική μ,μχ
      μ=μυ/30*ύψος.σημείου/15
      μχ=(χ2-χ1-Μέγεθος.χ(τ$, "Arial Black",μ)) Δια 2
      Αν μχ<0 Τότε  {
            μ=μεγαλο.σειράς(μ/2,6)
            μχ=(χ2-χ1-Μέγεθος.χ(τ$, "Arial Black",μ)) Δια 2
      }
      θέση μχ+χ1, υ2
      Επιγραφή τ$, "Arial Black",μ
Τέλος Ρουτίνας
Ρουτίνα ΠιόνιΣτοΠλαίσιο(χ1, μυ, υ2, χ2, ν, νο)
      Τοπική μ,μχ
      μχ=(χ2-χ1)/6
    Θέση χ1+μχ+χ/30, υ2+μυ+(υ-μυ*2)*(νο-.5)/4
    Πάχος 3 { Πένα 0 { Κύκλος Γέμισμα χρ(νο), υ*3/44,3 } }
Τέλος Ρουτίνας
Ρουτίνα ΛεζάνταΣτοΠλαίσιο(χ1, μυ, υ2, χ2, ν, νο, Λ$)
      Τοπική μ,μχ
      μχ=(χ2-χ1)/6
      Διαμέσου Βάλε_Τίτλο(Λ$,χ1, μυ*2,υ2+(υ-μυ*2)*(νο-.5)/4, χ2) 
Τέλος Ρουτίνας
Ρουτίνα ΠλαίσιοΠαικτών(χ1, μυ, υ2, χ2, ν)
      Τοπική μ,μχ
      μχ=(χ2-χ1)/6
      Θέση χ1+μχ, υ2+μυ
      Πάχος 2 {
            Χρώμα 3 {
                  Βάψε μχ*4, υ-μυ*2
            }
      }
Τέλος Ρουτίνας



Δεν υπάρχουν σχόλια:

Δημοσίευση σχολίου

You can feel free to write any suggestion, or idea on the subject.