Πέμπτη 31 Μαρτίου 2016

Αναθεώρηση 198 - Και παιχνίδι τύπου Pong

Διόρθωσα το H (δούλευε ως OR αλλά από μια αλλαγή που έκανα για βελτιστοποίηση..το είχα χαλάσει..ένα 1 είχε γίνει 2...)



Το παιχνίδι παίζεται με ένα άτομο. Σκοπός είναι να περάσει ο παίκτης 10 μπαλιές ανάμεσα στην τρύπα από την αριστερή "ρακέτα". Αυτή η τρύπα μετακινείται! Επίσης πρέπει να αποφύγει να ρίξει την μπάλα με γωνία τέτοια που να μην μπορεί να την χτυπήσει (η ρακέτα του παίκτη δεν πάει πολύ ψηλά, ούτε πολύ χαμηλά). Θέλει εξάσκηση, και συγκέντρωση για να κερδίσει κανείς.
Το παιχνίδι παίζεται σε πλήρη οθόνη (μάλιστα γράφουμε στο περιθώριο, τη κύρια οθόνη την έχουμε περιορίσει, είναι το μήνυμα που βλέπουμε στην παύση). Αν πατήσει κανείς το Escape και βγει στην μικρή οθόνη στο μέσον, με Φόρμα 60,30 επανέρχεται μια μεγάλη οθόνη για αν δουλέψουμε τον διορθωτή καλύτερα).


\\ Πρόγραμμα Μοναχός - Παιχνίδι τύπου Pong
γραμματοσειρά "Tahoma"
Σβήσε
Τύπος 18, 8000,2400
Κίνηση Κέντρο
Τμήμα Χτύπος {
              Φωνή 2, 100,"g"
              Παίξε 2, 127
}
Διαμέσου Συναρτήσεις
Περιθώριο 12 { 
Ανανέωση 5000
Πίνακας Ψ$()
Ψ$()=Αρ$()
Οθόνη 5,0
Πένα 14
Ανανέωση 50
α$=""
β$=""
β1$=""
Θέση 0,0
Βάψε 300,Υ.σημεία, 15
θέση 0,0
Αντέγραψε 300,300 στο α$
Αντέγραψε 300,1800 στο β$
Αντέγραψε 300,Υ.σημεία στο β1$
Πάλι:
Δείκτη.Μορφή Κρύψε
οθόνη #222222,0
Τύπωσε @(5,5),
Πένα 7 {
      Αναφορά {Παιχνίδι Μοναχός
            Πάτησε P/Π για παύση
            Πάτησε διάστημα...
            ...για τερματισμό
            }
      }
Για ι=0 έως Υ.σημεία ανά ύψος.σημείου*2 { Θέση 0,ι : Χάραξε Χ.σημεία, 0, #555555 }
χκ=αΚ(χ.σημεία/2-150)
χκ1=χκ-300*7
χκ2=χκ+900
χα2=1000
χα1=400
χδ1=χ.σημεία-1000
χδ2=χδ1+600
Για ι=0 έως Υ.σημεια-300 ανά 600 { Αντέγραψε χκ, ι με α$ }
Σκορ1=0
Σκορ2=0
Αντέγραψε χκ1, 900 με ψ$(Σκορ1)
Αντέγραψε χκ2, 900 με ψ$(Σκορ2)
Υα=-900
Υα1=Υα-Υ.σημεία/4
Υα2=Υα1+Υ.σημεία/2
Υβ=Υ.σημεία+900
Υαβ=30
Παίκτης 1, 850,Υα  Με β1$
Παίκτης 2, χδ1,10000  Με β$
Παίκτης 3,  850,Υβ  Με β1$
Υ2=Υ.Σημεια-900-1000
Χμ=Χκ
Υμ=3000+τυχαίος(2,5)*300
Παίκτης 4, Χμ,Υμ  Με α$
Για ι=1 εως 4 { Παίκτης ι Δείξε }
Υ3=Υ.Σημεία-300
Χ3=Χ.Σημεία-300
Υ4=Υ.Σημεία/2
Τχ=120
Τμ=120
Υπ=Δείκτης.Υ
Υ=ΥΠ
Νήμα {
      Υπ=Υ : Υ=Δείκτης.Υ
} ως Νμ κάθε 25
Αναμονή 100
Νήμα {
      Χμ+=Τχ
      Υμ+=Τμ
      Αν Υ<1900 τότε { Υ=1900: Υπ=1900   } αλλιώς.αν Υ>Υ2 τότε Υ=Υ2: Υπ=Υ2
      Αν Υμ<300 τότε { Τμ-! : Υμ+=Τμ  } αλλιώς.αν Υμ>Υ3 τότε Τμ-! : Υμ+=Τμ
      Αν σύγκρουση(4, 100, χα1,Υα-Υ4, χα2, Υα+Υ4) τότε {
            Τχ-! : Χμ+=Τχ*2 
            Χτύπος
       } αλλιώς.αν σύγκρουση(4, 100, χα1,Υβ-Υ4, χα2, Υβ+Υ4) τότε {     
            Τχ-! : Χμ+=Τχ*2
            Χτύπος
       } αλλιώς.αν σύγκρουση(4, 100, χδ1,Υ-900, χδ2, Υ+900) τότε {
       Τχ=-Απολ(Τχ) : Χμ+=Τχ*2
       Τχ=μικρό.σειράς(-ακ(Λογ(Απολ(Υ-Υπ)+2))*90, Τχ/2, -120) 
       Τμ=Σημ(Τμ)*Απολ(Ακ((Υμ-Υ)/10))+Σημ(Τμ)*60
       Χτύπος
      }
      Σημ 1 : δρομέας 0,ύψος-1 : Τύπωσε πάνω $(,8),Χμ, Υμ , Απολ(Υ-Υπ), Τχ, Τμ
      Παίκτης 2,,Υ
      Παίκτης 4, Χμ,Υμ     
} ως Μπ κάθε 10
Νήμα {
Πένα 7 {
      δρομέας 0,0 : Τύπωσε μέρος $(6,8),@(πλάτος -7), ~(Πένα,#555555),Γραφή$(Τώρα,"hh:mm:ss")
}
} ως Ττ κάθε 1000
Ανανέωση 50
Κρ=Αληθές
τέρμα=Ψευδές
Κύριο.Έργο 100 {
      Αν Κρ Τότε {
      Υα+=Υαβ
      Υβ+=Υαβ
      Αν Υα>Υα2 Τότε { Υαβ-! } Αλλιώς.Αν Υα<Υα1 τότε Υαβ-!
      Παίκτης 1,,Υα
      Παίκτης 3,,Υβ
      Σημ 2 : δρομέας 0,ύψος-1 : Τύπωσε πάνω $(,8), Υα, Υβ
      }
      Αν χμ>Χ3  ή χμ<1000 τότε {
      Αν χμ>Χ3 τότε {
      Σκορ1++
      Αντέγραψε χκ1, 900 με ψ$(Σκορ1)
      } αλλιώς {
      Σκορ2++
      Αντέγραψε χκ2, 900 με ψ$(Σκορ2)
      }
      Αν Σκορ1=10 ή Σκορ2=10 τότε διέκοψε
            Χμ=Χκ
            Υμ=3000+τυχαίος(2,5)*300
            Τχ=120
            Τμ=120*Σημ(Τμ)
            Αν τυχαίος(2)=1 τότε Τχ-!
      }
      Επίλεξε με Ενκομ$
      Με "π","p","Π","P"
            {
                  Αν Κρ τότε { 
                        Νήμα Μπ Κράτα
                        Επίπεδο {
                              Οθόνη 0, 0
                              Πένα 15 {
                                    Δρομέας 0, ύψος/2-1
                                    Τύπωσε Πάνω $(6),"Πάτα το πλήκτρο P ή Π για συνέχεια.."
                                    Τύπωσε Υπό
                                    Τύπωσε Πάνω $(6)," ή διάστημα για να τερματίσω"
                              }
                              Άναψε
                        }
                  } Αλλιώς {
                  Επίπεδο {
                        Σβήσε
                        Οθόνη 5
                  }
                  Νήμα Μπ ξεκίνα
                  }
                  Κρ~
            }
      Με " "
            {
                  Νήμα Μπ Κράτα   
                  Δείκτη.Μορφή Δείξε                  
                  αν Ρώτα("Θα να σταματήσεις","Μοναχός","Ναι","Όχι")=1 τότε { 
                        Τέρμα=Αληθές
                  } Αλλιώς  Δείκτη.Μορφή Κρύψε                  
                  Νήμα Μπ ξεκίνα
            }
      Τέλος Επιλογής
      Αν τέρμα τότε έξοδος
}
Αν κρ Αλλιώς { Επίπεδο {Σβήσε : Οθόνη 5} : κρ~ }
Αν Ρώτα("Θα ξαναπαίξουμε","Μοναχός","Ναι","Όχι")=1 τότε προς Πάλι
Παίκτης 0
Οθόνη 5
}
Φόρμα 60,30
Άναψε
Τέλος
Συναρτήσεις:
Συνάρτηση Αρ$ {
Χ=0
Υ=0
Μηδέν$={_***_
                  *___*
                  *___*
                  *___*
                  *___*
                  *___*
                  _***_
                  }
Ένα$={__*__
                  _**__
                  *_*__
                  __*__
                  __*__
                  __*__
                  *****
                  }
Δύο$={_***_
                  *___*
                  ____*
                  _***_
                  *____
                  *____
                  *****
                  }
Τρία$={_***_
                  *___*
                  ____*
                  __**_
                  ____*
                  *___*
                  _***_
                  }
Τέσσερα$={___*_
                  __**_
                  _*_*_
                  *__*_
                  *****
                  ___*_
                  ___*_
                  }
Πέντε$={*****
                  *____
                  ****_
                  ____*
                  ____*
                  *___*
                  _***_
                  }
Έξι$={_***_
                  *___*
                  *____
                  ****_
                  *___*
                  *___*
                  _***_
                  }
Επτά$={*****
                  ____*
                  ___*_
                  __*__
                  __*__
                  __*__
                  __*__
                  }
Οκτώ$={_***_
                  *___*
                  *___*
                  _***_
                  *___*
                  *___*
                  _***_
                  } 
Εννιά$={_***_
                  *___*
                  *___*
                  _****
                  ____*
                  *___*
                  _***_
                  } 
Δέκα$={*__*_
                  *_*_*
                  *_*_*
                  *_*_*
                  *_*_*
                  *_*_*
                  *__*_
                  }   
Πίνακας Ψ$(11), Ψ1$(11)
Πλ1=300
Ύψ1=300
Ψ$(0)=Μηδέν$,Ένα$, Δύο$, Τρία$, Τέσσερα$,Πέντε$, Έξι$, Επτά$, Οκτώ$, Εννιά$, Δέκα$
      Για Ψ=0 έως 10 {
      οθόνη #222222,0
      Για ι=0 έως 7*Ύψ1 ανά ύψος.σημείου*2 {
      Θέση 0,ι
      Χάραξε Χ.σημεία, 0, #555555
      }
      Θ=1
      Θέση Χ,Υ
      Για Κ=0 έως 7 {
            Για Ι=0 έως 4 {
                       Αν Μεσ$(Ψ$(Ψ),Θ,1)="*" τότε { Βάψε Πλ1, Ύψ1,15 }  Αλλιώς Βήμα Πλ1, Ύψ1 'Αλλιώς Βάψε Πλ1, Ύψ1, #222222
                       βημα 0, -Ύψ1
                  Θ++
            }
            Βήμα -5*Πλ1, Ύψ1
            Θ+=2
      }
      Α$=""
      Θέση Χ,Υ
      Αντίγραψε Πλ1*5,Ύψ1*7 στο Α$
      Ψ1$(Ψ)=Α$
      }
=Ψ1$()
}
Επιστροφή











Κατέβασε το αρχείο gsb εδώ:
Περιστρεφόμενη μπίλια και αλλαγή μεγέθους!



Εικόνα από υπολογιστή με Windows 7 (τα παραπάνω είναι από Virtual Box) 1440Χ900


 

Τρίτη 29 Μαρτίου 2016

Σχεδίαση αριθμών Bitmap

Σε αυτή την ανάρτηση θα δούμε πως σχεδιάζουμε αριθμούς bitmap. Οι bitmap αριθμοί είναι στην ουσία εικόνες αριθμών. Σε μελλοντική ανάρτηση θα έχω φτιάξει ένα Pong και οι αριθμοί του σκορ θέλω να φαίνονται με τελείες, έτσι αποφάσισα να το μελετήσω το θέμα!

Πρώτη ιδέα είναι να φτιάξω τους αριθμούς κάπως ώστε να βλέπω πως είναι πριν γίνουν εικόνες! Υπολογίζω λοιπόν ότι κάθε αριθμός θα πιάνει 5Χ7 κουκίδες (χωρίς τυχόν κενό χώρο).
Σε ένα αλφαριθμητικό θα βάλω αστέρι * όπου θα σημαίνει χρώμα λευκό και κάτω παύλα _ που θα σημαίνει φόντο. Μπορώ να προσθέτω κενά τα οποία τα αφαιρεί ο διερμηνευτής από την θέση της αγκύλης στο τέλος. Εδώ φαίνεται το μηδές. Θα φτιάξω όλα τα νούμερα και θα τα φορτώσω σε ένα πίνακα. Η μεταβλητή Μηδέν$ έχει το εικονικό μηδέν, και ο τρόπος που φτιάχτηκε δίνει μια αναπαράσταση την ώρα που γράφεται στον διορθωτή με συμβολικούς χαρακτήρες * και _.

Μηδέν$={_***_
                  *___*
                  *___*
                  *___*
                  *___*
                  *___*
                  _***_
                  }

Μπορώ να τυπώνω με μια ρουτίνα το νούμερο καθορίζοντας το μέγεθος του αστεριού. Αυτό λέγεται rendering, ή αναπαράταση του εικονικού σε εικόνα που βλέπω στην οθόνη.
Εδώ είναι το απλό πρόγραμμμα που κάνει την απλή δουλειά να εμφανίσει ένα νούμερο δέκα φορές

Μηδέν$={_***_
                  *___*
                  *___*
                  *___*
                  *___*
                  *___*
                  _***_
                  }
Φόντο 5,1 \\ Ματζέντα προς Μπλε
Οθόνη 5,-5 \\ Ολίσθηση πέντε γραμμές στο κάτω μέρος της οθόνης
Πλ1=πλάτος.σημείου*12
Ύψ1=ύψος.σημείου*20
Ανανέωση 5000
για Ι=0 έως 9 {
      Αρ(Μηδέν$,Ι*8*πλ1,0)
}
Ανανέωση 50
Τύπωσε "οκ"
Ρουτίνα Αρ(Σχ$, Χ, Υ)
Τοπικές Ι,Μ, Κ, Θ=1
Για Κ=0 έως 7 {
      Για Ι=0 έως 5 {
      Θέση Χ+Ι*Πλ1, Υ+Κ*Ύψ1
      Αν Μεσ$(Σχ$,Θ,1)="*" τότε { Βάψε Πλ1, Ύψ1,15 } Αλλιώς Βάψε Πλ1, Ύψ1, 5,1,1,0
            Θ++
      }
      Θ++
}
Τέλος Ρουτίνας

Πιο γρήγορο είναι να φτιάξουμε έναν πίνακα με εικόνες και να βάζουμε την εικόνα, αντί να διαβάζουμε το αλφαριθμητικό κάθε φορά και να σχεδιάζουμε πάλι το νούμερο. Έκανα μερικές αλλαγές. Αντί  ρουτίνας Αρ() έχω μια συνάρτηση που επιστρέφει εικόνα σε αλφαριθμητικό.
Επειδή χρησιμοποιώ εσωτερικά στην  Αρ$()  τις Πλ1 και Ύψ1 τις ορίζω γενικές (τις χρησιμοποιώ και στο κύριο πρόγραμμα)
Το πρόγραμμα κάνει αντίστροφη μέτρηση από το 9999 στο 0000. Στη Για δεν χρειάζεται να γράψουμε το βήμα (το βρίσκει ο διερμηνευτής μόνος του). Στη Μ2000 οι επαναλήψεις Για θα γίνουν μια φορά όπως και να έχει το πράγμα!
Τον πίνακα Ψηφ$() τον περνάμε με αναφορά στη ρουτίνα και έτσι επιστρέφει γεμάτος..με τα αλφαριθμητικά - πατρόν σε νούμερα! Μετά δημιουργούμε κάθε νούμερο και το γράφουμε σε έναν άλλο πίνακα Ψηφ.Τελ$()
Η Ανανέωση 50 μέσα στη Για εξασφαλίζει ότι θα δούμε τις τέσσερις εικόνες ταυτόχρονα.

Συνάρτηση Αρ$ {
Διάβασε Σχ$, Χ, Υ
Θ=1
Θέση Χ,Υ
Βάψε 5*πλ1,7*ύψ1,0
Θέση Χ,Υ
Για Κ=0 έως 7 {
      Για Ι=0 έως 4 {
                 Αν Μεσ$(Σχ$,Θ,1)="*" τότε { Βάψε Πλ1, Ύψ1,15 } Αλλιώς Βάψε Πλ1, Ύψ1, 5,1,1,0
                 βημα 0, -Ύψ1
            Θ++
      }
      Βήμα -5*πλ1, Ύψ1
      Θ+=2
}
Α$=""
Θέση Χ,Υ
Αντίγραψε πλ1*5,ύψ1*7 στο Α$
=Α$
}
Φόντο 5,1
Οθόνη 5,-5
Πίνακας Ψηφ$(), Ψηφ.Τελ$(10)
Ψηφία(&Ψηφ$())
Γενική Πλ1=πλάτος.σημείου*30, Ύψ1=ύψος.σημείου*30
Ανανέωση 20000
Για ι=0 έως 9{
      Ψηφ.Τελ$(ι)=Αρ$(Ψηφ$(ι), πλ1*5,1800)
}
Φόντο 5, 1
Αρ.Περ=(χ.σημεια-πλ1*6*4+πλ1)/2

πλ1_1=πλ1*6+Αρ.Περ
πλ1_2=πλ1*12+Αρ.Περ
πλ1_3=πλ1*18+Αρ.Περ
Ανανέωση 50
\\ Αντίστροφη μέτρηση
Για ι=9999 εώς 0 {
Αντέγραψε Αρ.Περ, 1800 με Ψηφ.Τελ$(ι δια 1000)
Αντέγραψε πλ1_1, 1800 με Ψηφ.Τελ$((ι δια 100) υπολ 10)
Αντέγραψε πλ1_2, 1800 με Ψηφ.Τελ$((ι δια 10) υπολ 10)
Αντέγραψε πλ1_3, 1800 με Ψηφ.Τελ$(ι υπολ 10)
Ανανέωση 50
}
Τύπωσε "οκ"
Ρουτίνα Ψηφία(&Ψ$())
Μηδέν$={_***_
                  *___*
                  *___*
                  *___*
                  *___*
                  *___*
                  _***_
                  }
Ένα$={__*__
                  _**__
                  *_*__
                  __*__
                  __*__
                  __*__
                  *****
                  }
Δύο$={_***_
                  *___*
                  ____*
                  _***_
                  *____
                  *____
                  *****
                  }
Τρία$={_***_
                  *___*
                  ____*
                  __**_
                  ____*
                  *___*
                  _***_
                  }
Τέσσερα$={___*_
                  __**_
                  _*_*_
                  *__*_
                  *****
                  ___*_
                  ___*_
                  }
Πέντε$={*****
                  *____
                  ****_
                  ____*
                  ____*
                  *___*
                  _***_
                  }
Έξι$={_***_
                  *___*
                  *____
                  ****_
                  *___*
                  *___*
                  _***_
                  }
Επτά$={*****
                  ____*
                  ___*_
                  __*__
                  __*__
                  __*__
                  __*__
                  }
Οκτώ$={_***_
                  *___*
                  *___*
                  _***_
                  *___*
                  *___*
                  _***_
                  }
Εννιά$={_***_
                  *___*
                  *___*
                  _****
                  ____*
                  *___*
                  _***_
                  }
Πίνακας Ψ$(10)
Ψ$(0)=Μηδέν$,Ένα$, Δύο$, Τρία$, Τέσσερα$,Πέντε$, Έξι$, Επτά$, Οκτώ$, Εννιά$
Τέλος Ρουτίνας




Εδώ είναι μια εικόνα 1440Χ900 με
Γενική Πλ1=πλάτος.σημείου*40, Ύψ1=ύψος.σημείου*40