/
KarelTheRobot.gsb
1535 lines (1492 loc) · 82.8 KB
/
KarelTheRobot.gsb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
ΤΜΗΜΑ ΓΕΝΙΚΟ Α {// Έκδοση 1.0
Λίστα1$={
{
"Magic Id" : "11223344Karel",
"Locale Id" : 1032,
"\u03A4\u03AF\u03C4\u03BB\u03BF\u03C2 \u039A\u03CC\u03C3\u03BC\u03BF\u03C5" : "\u039A\u039F\u03A3\u039C\u039F\u03A31",
"\u039A\u03CC\u03C3\u03BC\u03BF\u03C2" : {
"\u03A0\u03BB\u03AC\u03C4\u03BF\u03C2" : 20,
"\u038E\u03C8\u03BF\u03C2" : 10,
"\u0395\u03BC\u03C0\u03CC\u03B4\u03B9\u03B1" : {
"1, 1" : 1, "1, 2" : 1, "1, 3" : 1, "1, 4" : 1, "1, 5" : 1, "1, 6" : 1, "1, 7" : 1, "1, 8" : 1, "1, 9" : 1,
"2, 1" : 1, "2, 5" : 3, "2, 9" : 1, "3, 1" : 1, "3, 4" : 1, "3, 5" : 1, "3, 6" : 1, "3, 9" : 1, "4, 1" : 1,
"4, 5" : 1, "4, 9" : 1, "5, 1" : 3, "5, 2" : 3, "5, 3" : 3, "5, 4" : 3, "5, 5" : 3, "5, 6" : 3, "5, 7" : 3,
"5, 8" : 3, "5, 9" : 3, "6, 1" : 1, "6, 4" : 1, "6, 5" : 2, "6, 9" : 1, "7, 1" : 1, "7, 4" : 1, "7, 5" : 2,
"7, 9" : 1, "8, 1" : 1, "8, 2" : 1, "8, 3" : 2, "8, 4" : 1, "8, 5" : 2, "8, 6" : 1, "8, 7" : 1, "8, 8" : 1,
"8, 9" : 1, "9, 1" : 1, "9, 2" : 3, "9, 3" : 2, "9, 4" : 3, "9, 5" : 1, "9, 9" : 1, "10, 1" : 1, "10, 2" : 1,
"10, 4" : 3, "10, 5" : 2, "10, 9" : 1, "11, 1" : 1, "11, 3" : 3, "11, 4" : 2, "11, 5" : 1, "11, 9" : 1,
"12, 1" : 1, "12, 2" : 3, "12, 3" : 1, "12, 4" : 1, "12, 5" : 3, "12, 6" : 1, "12, 7" : 1, "12, 8" : 1,
"12, 9" : 1, "13, 1" : 1, "13, 2" : 2, "13, 3" : 3, "13, 5" : 3, "13, 9" : 1, "14, 1" : 1, "14, 3" : 2,
"14, 5" : 1, "14, 9" : 1, "15, 1" : 3, "15, 2" : 1, "15, 3" : 1, "15, 4" : 1, "15, 5" : 2, "15, 6" : 1,
"15, 7" : 1, "15, 8" : 1, "15, 9" : 1, "16, 1" : 1, "16, 5" : 1, "16, 9" : 1, "17, 1" : 1, "17, 5" : 1,
"17, 9" : 1, "18, 1" : 1, "18, 2" : 3, "18, 3" : 1, "18, 4" : 1, "18, 5" : 1, "18, 6" : 1, "18, 7" : 1,
"18, 8" : 1, "18, 9" : 2, "19, 1" : 1, "19, 2" : 4, "19, 3" : 4, "19, 4" : 4, "19, 5" : 4, "19, 6" : 4,
"19, 7" : 4, "19, 8" : 4, "19, 9" : 1
},
"\u039C\u03C0\u03B9\u03BC\u03C0\u03B5\u03C1" : {
"2, 4" : 1, "2, 8" : 1, "2, 9" : 1, "3, 3" : 1, "3, 6" : 1, "4, 2" : 1, "5, 4" : 1, "6, 2" : 1, "6, 4" : 1,
"6, 8" : 1, "7, 4" : 1, "9, 2" : 1, "9, 3" : 1, "9, 4" : 1, "9, 9" : 1, "10, 3" : 1, "10, 4" : 1, "10, 6" : 1,
"10, 7" : 1, "11, 2" : 1, "11, 4" : 1, "11, 5" : 1, "13, 3" : 1, "15, 6" : 1, "15, 7" : 1, "16, 3" : 1,
"17, 3" : 1, "17, 9" : 1, "18, 9" : 1, "19, 6" : 1
},
"\u03A3\u03BA\u03BF\u03C0\u03CC\u03C2" : 2,
"\u03A3\u03B7\u03BC\u03B5\u03B9\u03CE\u03C3\u03B5\u03B9\u03C2" : ""
},
"\u039A\u03AC\u03C1\u03B5\u03BB" : {
"\u03A3\u03AC\u03BA\u03BF\u03C2" : 10,
"\u0398\u03AD\u03C3\u03B7\u03A7" : 5,
"\u0398\u03AD\u03C3\u03B7\u03A5" : 1,
"\u0392\u03BB\u03AD\u03C0\u03B5\u03B9" : 2,
"\u03A7\u03C1\u03CE\u03BC\u03B1" : -16776960
}
}
}
Τιτλ$="Κόσμος του Κάρελ"
Τίτλος Τιτλ$
Ελληνικά
Γραμματοσειρά "Verdana"
Φαρδια 1
// Αλλαγή του πλάτους του ΤΑΒ (στη κονσόλα καλύτερα, αλλά και εδώ δεν πειράζει):
// Σ ή Συγγραφή (είναι ίδιο με το edit)
Συγγραφή ! 3
Περί ! ""
Περί Κάλεσε {
Επίλεξε με Περί$
Με "Σχεδιασμός"
{
Περί "Σχεδιασμός", χ.σημεία*2/3, υ.σημεία*2/3, {
[Επιστροφή]
Ο Κάρελ μετακινείται με τα πλήκτρα Βορράς, Ανατολή, Νότος, Δύση χωρίς να τον εμποδίζουν τα τοιχώματα. Από τη λίστα Καθαρό, μέχρι Δεξί Άκρο, επιλέγουμε τι θα βάλουμε στο διαγώνιο (Νοτιοανατολικά). Για να δούμε γραμμές πρέπει να υπάρχουν δυο τουλάχιστον εισαγωγές. Οπότε βάζουμε κάτι και μετακινούμε τον Κάρελ ανατολικά ή νότια.
Με τα εργαλεία στη λίστα Αλλαγή Στοιχείου μπορούμε να φτιάξουμε οποιοδήποτε σχέδιο χωρισμάτων. Τα χωρίσματα τα εμφανίζει το πρόγραμμα σαν να γράφει κείμενο. Σε κάθε νέα γραμμή κοιτάει την προηγούμενη, ακριβώς πάνω από κάθε θέση αν έχει "οδηγία" για να συνεχίσει κάποιες γραμμές.
}
}
Με "Αποθήκευση"
{
Περί "Αποθήκευση", χ.σημεία*2/3, υ.σημεία*2/3, {
[Επιστροφή]
Ο κόσμος αποθηκεύεται σε αρχείο με κατάληξη kword, και είναι της μορφής json. Αυτός ο Κόσμος χρησιμοποιείται από την εφαρμογή που εκτελεί τη προγράμματα της γλώσσας Κάρελ.
Σε περίπτωση που δεν μπορείτε να αποθηκεύσετε (δεν αφήνει το πλαίσιο διαλόγου να γράψετε όνομα αρχείου) τότε συμβαίνει ο φάκελος που πάτε να γράψετε να είναι μαρκαρισμένος ως μόνο για ανάγνωση. Αν και άλλες διαδικασίες χρησιμοποιούν τους φακέλους χωρίς τον έλεγχο αυτό, το πλαίσιο διαλόγου για την αποθήκευση αρχείου το χρησιμοποιεί. Σε αυτήν την περίπτωση πρέπει να μπείτε μέσω cmd.exe στο φάκελο που περιέχει τον φάκελο που είναι μόνο για ανάγνωση και να δώσετε το attrib -r όνομα_φακέλου. Δηλαδή αυτό είναι θέμα χειρισμού του λειτουργικού και του συστήματος αρχείων, και όχι του προγράμματος.
}
}
Με "Ρομπότ"
{
Περί "Ρομπότ", χ.σημεία*2/3, υ.σημεία*2/3, {
[Επιστροφή]
Το ρομπότ κανονικά προχωράει μόνο μπροστά, και στρίβει μόνο αριστερά. Κινείται μόνο στους δρόμους και τις λεωφόρους. (αυθαίρεται μπορούμε να λέμε τις κάθετες δρόμους, και τις οριζόντιες λεωφόρους).
Τα τοιχώματα στο τελικό πρόγραμμα (που εκτελεί προγράμματα στη γλώσσα Κάρελ) είναι "ηλεκτροφόρα" δηλαδή αν πέσει πάνω τους ο Κάρελ, τερματίζει η λειτουργία του.
}
}
Με "Σελίδα Git"
win "https://github.com/M2000Interpreter/KarelTheRobot"
Με "Χειρισμός Προγράμματος"
{
Περί "Χειρισμός Προγράμματος", χ.σημεία*2/3, υ.σημεία*2/3, {
[Επιστροφή]
Στα μπλε πλαίσια αν πατηθούν και τραβήξουμε το δείκτη θα δούμε μόνο οδηγίες, δεν θα περάσει η εντολή. Εξαίρεση σε αυτό έχουν τα πλήκτρα με τα σημεία του ορίζοντα, επειδή έχουν επανάληψη, δηλαδή όσο τα "πατάμε" προχωράει ο Κάρελ.
Ειδικά το πλήκτρο Εμπρός, έχει δυο διαφορετικές λειτουργίες ανάλογα αν φτιάχνουμε το κόσμο ή αν κάνουμε έλεγχο. Κατά τη δημιουργία του κόσμου, με σύντομο πάτημα απλά μας λέει τι κάνει, αλλά αν το κρατήσουμε παραπάνω θα δώσει μια απλή μετακίνηση εμπρός (αν γίνεται), και αν συνεχίσουμε να το κρατάμε πατημένο θα ξεκινήσει η γρήγορη μετακίνηση εμπρός. Κατά τον έλεγχο το πλήκτρο Εμπρός πάει μόνο μια θέση μπροστά (αν γίνεται). Σε αυτήν την κατάσταση λειτουργίας, η γρήγορη κίνηση γίνεται με το αριστερό πλήκτρο του ποντικιού.
}
}
Με "Έλεγχος"
{
Περί "Σχεδιασμός", χ.σημεία*2/3, υ.σημεία*2/3, {
[Επιστροφή]
Μπορείτε να δοκιμάσετε σαν παιχνίδι το κόσμο που φτιάξατε. Στο τέλος του παιχνιδιού ο κόσμος ξαναφτιάχνεται στην αρχική του μορφή (πιθανόν θα έχετε αφαιρέσει ή μετακινήσει ή προσθέσει τα μπίμπερ).
Πάντα στις κάτω γραμμές φαίνονται οι "συνθήκες" του Κάρελ, που λένε τι έχει από εμπόδια γύρω του, αν έχει κάτι στη διασταύρωση (μπίμπερ, τουλάχιστον ένα), αν έχει κάτι στο σάκο του (μπίμπερ, τουλάχιστον ένα).
}
}
Με "*", "Επιστροφή"
{
Περί "Δημιουργία του Κόσμου του Κάρελ", χ.σημεία*2/3, υ.σημεία*2/3, {
Δείτε επίσης [Σχεδιασμός], [Σελίδα Git]
[Έλεγχος],
[Αποθήκευση],
[Ρομπότ],
[Χειρισμός Προγράμματος]
Ο κόσμος του Κάρελ, έχει σταθερές λεωφόρους και δρόμους και εμείς βάζουμε χωρίσματα και μπίμπερ. Τα μπίμπερ ο Κάρελ μπορεί να τα μαζέψει αλλά και να τα αφήσει, ανάλογα την άσκηση. Τα μπίμπερ μένουν στις διασταυρώσεις. Τα χωρίσματα βρίσκονται πάντα μεταξύ διασταυρώσεων.
Το μέγεθος μπορεί να είναι από 5Χ5 μέχρι 20Χ20, και η περίμετρός του δεν έχει χωρίσματα. Ο Κάρελ δεν μπορεί να βγει από το κόσμο του, επειδή δεν υπάρχει άλλος χώρος, και εμφανίζεται στο ραντάρ του Εμπόδιο. Ο Κάρελ πάντα μετακινείται από διασταύρωση σε διασταύρωση, και ποτέ δεν μένει σε ενδιάμεσο χώρο, μεταξύ γειτωνικών διασταυρώσεων.
Το ραντάρ του Κάρελ εντοπίζει εμπόδια μπροστά, δεξιά, αριστερά και πίσω. Επίσης εντοπίζει αν υπάρχουν μπίμπερ στη τρέχουσα διασταύρωση (αλλά όχι τον αριθμό τους). Επίσης γνωρίζει αν έχει στο σάκο του μπίμπερ, αλλά πάλι δεν ξέρει πόσα έχει.
Στο πρόγραμμα δημιουργίας του κόσμου του Κάρελ, δεν υπάρχουν ατυχήματα για τον Κάρελ. Αν χρησιμοποιήσουμε την κίνηση εμπρος, και πέσουμε σε τοίχο, δεν θα συμβεί τίποτα, απλά δεν θα περάσει ο Κάρελ. Στο κανονικό πρόγραμμα η πρόσκρουση σε τοίχο σημαίνει σφάλμα και τερματίζει την εκτέλεσή του. Για λόγους σχεδιασμού ο Κάρελ μπορεί να περάσει μέσα από τοίχους χρησιμοποιώντας τα πλήκτρα με τα σημεία του ορίζοντα.
}
}
Τέλος Επιλογής
}
Διαμέσου ΦόρτωσεΣυνάρτηση
Αδειασε
ΠΕΝΑ 14
Διαφυγή Όχι
Παράθυρο 12, 0 // αλλάξτε το ,0 με ,1 αν θέλετε να ανοίγει στο μόνιτρο 1
// το ! στη Φόρμα μικραίνει κάπως το παράθυρο για τηλεοράσεις που κρύβουν
// κάποια Pixels της προβαλής της επιφάνειας εργασίας. (TV/Monitors)
Σημ 1:
Φόρμα !88, 40
Σημ 2: Φόρμα 64, 40
Φόρμα
Οθόνη #ff77dd,0
Κάρελ1=ΚάρελΣχέδιο(1)
Θέση κλίμαξ.χ/2, κλίμαξ.ψ/2
Διάφανο Καρελ1, 5,15,κλιμαξ.χ/ εικόνα.χ(Κάρελ1)*80,, 1
Πένα , 240:Φόντο 15, 15:Πένα ,255 ' το κάνουμε υδατογράφημα!
Διπλά: Πλάγια
Τύπωσε Πάνω ~(15), $(6), "ΦΤΙΑΧΝΩ ΤΟ ΚΟΣΜΟ ΤΟΥ ΚΑΡΕΛ ΤΟΥ ΡΟΜΠΟΤ"
Πλάγια
Δρομέας 0,0
Για Αυτό {
Στόχοι Νέοι
Μ=0
Πένα 4 {Στόχος Μ,"Κωδ=-1", 1, 1, ,,101, "❎"}
}
Κανονικά
// Χωρισμός οθόνης: κόσμος | εντολές
// Κάτω "Πληροφορίες"
Δρομέας 0,2
Θέση !
θέσηΣ=θέση.Ψ
Χωρ=Κλίμαξ.χ*2/3
Δρομέας 0, Ύψος-5
Θέση !
ΘέσηΜ1=θέση.ψ
Οθόνη 5, Ύψος-3
Θέση !
ΘέσηΜ=θέση.ψ
Θέση 0, ΘέσηΣ
Πένα , 100
Βάψε Χωρ, ΘέσηΜ-ΘέσηΣ, 15, 0
Θέση Χωρ, ΘέσηΣ
Πένα , 150
Βάψε Κλίμαξ.χ-Χωρ, ΘέσηΜ-ΘέσηΣ, 7,#ffbbbb ,#ffbbbb
Γενική Κωδ=0
Πένα , 255
Οθόνη, -3
αρπ=Πλάτος*2/3+1
αρπ1=1
Απαρ Οδηγίες {Δοκιμή=1}
Μ=0
Πλ=Πλάτος/3-2
Πλ1=Ακ((Πλάτος/3-3)/2)
// Υπολογισμος(2) δίνει το ποσοστό 2 χαρακτήρων σε 9 χαρακτήρες πλάτος,
// Αλλά βάσει του μέτρου του ύψους!
// Επειδή το 1 ύψος δεν έχει τα ίδια twips με το 1 πλάτος, έχουν διαφορετικά μέτρα!
// Και θέλουμε παρακάτω να βάλουμε πλαίσιο πίσω από την εικόνα όσο 3 μέτρα Ύψους
// Το Πλ1*χ.σημεια/Πλάτος είναι τα twips σε πλάτος ΠΛ1
// Το Χ*ψ.σημεία/Ύψος είναι τα τwips σε ύψος Χ
// το μέτρο του πλάτους είναι το χ.σημεια/Πλάτος
// το μέτρο του ύψους είναι το ψ.σημεία/Ύψος
Υπολογισμός=Λάμδα
μαξ=ΠΛ1*χ.σημεια/Πλάτος,
ΠΛ1
(Χ=-1)->{αν Χ=-1 τότε =100: έξοδος
// εδώ θέλουμε σε "μονάδες κατά ύψος", στο μέτρο του ύψους
=Στρογγ((Χ*ψ.σημεία/Ύψος)/μαξ*100, 3)
}
ΠΛ0=ΠΛ
Μ=0
Απαρίθμηση ΕιδοςΠλήκτρου {Μεγάλο=0, ΑριστΜισό, ΚεντρΜισό, ΔεξΜισό}
Έγγραφο Σημειώσεις$
Ποιός=Λίστα
Εκείνος=Λίστα
Δρομέας ,2
Κεφαλίδα(Μεγάλο, αρπ, ΓΡΑΜΜΗ, "Αλλαγή Στοιχείου")
Μνήμη=Λίστα:="ΚΑΘ":=(Μεγάλο, αρπ, ΓΡΑΜΜΗ+1, Μ+1, "ΚΑΘΑΡΟ", "Αφαιρούμε τοίχωμα")
Στόχος(1, !Μνήμη("ΚΑΘ"))
Προσθήκη Μνήμη,"ΕΜΠ":=(Μεγάλο, αρπ, ΓΡΑΜΜΗ+1, Μ+1, "ΕΜΠΟΔΙΟ", " βάζουμε όλα τα άκρα, αν υπάρχει αριστερά τοίχος μπαίνει αριστερό άκρο, αν υπάρχει πάνω τοίχος μπαίνει άνω άκρο")
// το !Μνήμη("ΕΜΠ") αφήνει ένα αντίγραφο των τιμών στο σωρό τιμών, δηλαδή
// θα περάσουν οι τιμές ως παράμετροι
// Το κάνουμε αυτό για να κρατάμε τις παραμέτρους σε επόμενες περιπτώσεις
// Επειδή ο Στόχος δεν μας επιστρέφει τα στοιχεία που του δίνουμε!
Στόχος(2, !Μνήμη("ΕΜΠ"))
Προσθήκη Μνήμη,"ΑΚΡ":=(Μεγάλο, αρπ, ΓΡΑΜΜΗ+1, Μ+1, "ΑΚΡΟ", "βγάζουμε άνω άκρο")
Στόχος(3, !Μνήμη("ΑΚΡ"))
Προσθήκη Μνήμη,"ΚΑΤΩ":=(Μεγάλο, αρπ, ΓΡΑΜΜΗ+1, Μ+1, "ΚΑΤΩ ΑΚΡΟ", "βγάζουμε κάτω άκρο")
Στόχος(4, !Μνήμη("ΚΑΤΩ"))
Προσθήκη Μνήμη,"ΔΕΞΙ":=(Μεγάλο, αρπ, ΓΡΑΜΜΗ+1, Μ+1, "ΔΕΞΙ ΑΚΡΟ", "βγάζουμε αριστερό άκρο")
Στόχος(5, !Μνήμη("ΔΕΞΙ"))
Προσθήκη Μνήμη,"ΚΑΤΙ":=(Μεγάλο, αρπ, ΓΡΑΜΜΗ+1, Μ+1, "ΜΠΙΜΠΕΡ +1", "βάζουμε ένα μπίμπερ, μπορούμε να βάλουμε όσα θέλουμε στην ίδια θέση")
Στόχος(6, !Μνήμη("ΚΑΤΙ"))
Προσθήκη Μνήμη,"ΚΑΤΙ--":=(Μεγάλο, αρπ, ΓΡΑΜΜΗ+1, Μ+1, "ΜΠΙΜΠΕΡ -1", "Αφαιρούμε ένα μπίμπερ, μέχρι να μην υπάρχουν άλλα, στη θέση!")
Στόχος(7, !Μνήμη("ΚΑΤΙ--"))
Προσθήκη Μνήμη, "Β":=(ΚεντρΜισό, αρπ,ΓΡΑΜΜΗ+2, Μ+1, "ΒΟΡΡΑΣ", "Κίνηση Πάνω")
Στόχος(100, !Μνήμη("Β"))
Προσθήκη Μνήμη, "Δ":=(ΑριστΜισό, αρπ, ΓΡΑΜΜΗ+2, Μ+1, "ΔΥΣΗ", "Κίνηση Αριστερά")
Στόχος(101, !Μνήμη("Δ"))
Προσθήκη Μνήμη, "Α":=(ΔεξΜισό, αρπ, ΓΡΑΜΜΗ, Μ+1, "ΑΝΑΤΟΛΗ", "Κίνηση Δεξιά")
Στόχος(102, !Μνήμη("Α"))
Προσθήκη Μνήμη, "Ν":=(ΚεντρΜισό, αρπ, ΓΡΑΜΜΗ+2, Μ+1, "ΝΟΤΟΣ", "Κίνηση Κάτω")
Στόχος(103, !Μνήμη("Ν"))
Κεφαλίδα(Μεγάλο, αρπ, ΓΡΑΜΜΗ+2, "Τίτλος Κόσμου")
όνομαπίνακα$="ΚΟΣΜΟΣ1"
Τύπος.Αρχείου$="kworld"
όνομααρχείου$=κατ$+όνομαπίνακα$
Προσθήκη Μνήμη, "Τίτλος":=(Μεγάλο, αρπ, ΓΡΑΜΜΗ+1, Μ+1, όνομαπίνακα$, "Γράψε όνομα πίνακα")
Στόχος(200, !Μνήμη("Τίτλος"))
Κεφαλίδα(Μεγάλο, αρπ, ΓΡΑΜΜΗ+2, "Διαστάσεις Κόσμου Π x Y")
Κεφαλίδα(Μεγάλο, αρπ, ΓΡΑΜΜΗ+1, "Χ")
ΧΚ=5
ΨΚ=5
Σταθερη νκ$=" και θα πάρεις νέο Κόσμο, ή πάτα Esc ή άφησε το ίδιο νούμερο για να μείνει ως έχει"
Προσθήκη Μνήμη, "Χ":=(ΑριστΜισό, αρπ, ΓΡΑΜΜΗ, Μ+1, Γραφη$(ΧΚ, ""), "Δώσε τον αριθμό των λεωφόρων (κάθετες γραμμές)"+νκ$)
Στόχος(201, !Μνήμη("Χ"))
Προσθήκη Μνήμη, "Ψ":=(ΔεξΜισό, αρπ, ΓΡΑΜΜΗ, Μ+1, Γραφη$(ΨΚ, ""), "Δώσε τον αριθμό των δρόμων (οριζόντιες γραμμές)"+νκ$)
Στόχος(202, !Μνήμη("Ψ"))
ΚεφαλίδαΔεξιά(ΑριστΜισό, αρπ, ΓΡΑΜΜΗ+2, "Σάκος Κάρελ")
ΣΚ=0
Προσθήκη Μνήμη, "ΣΑΚΟΣ":=(ΔεξΜισό, αρπ, ΓΡΑΜΜΗ, Μ+1, "0", "Βάζουμε πόσα μπιμπερ (ΚΑΤΙ) θα υπάρχουν, στο ξεκίνημα, στον σάκο του Κάρελ")
Στόχος(203, !Μνήμη("ΣΑΚΟΣ"))
μ1$="Η θέση που θα ξεκινήσει, δεν μπορεί να είναι τυχαία!"
ΚεφαλίδαΔεξιά(ΑριστΜισό, αρπ, ΓΡΑΜΜΗ+1, "Αρχική Θέση Χ")
Κάρελ_εισΧ=1
Προσθήκη Μνήμη, "ΚΑΡΕΛ_Χ":=(ΔεξΜισό, αρπ, ΓΡΑΜΜΗ, Μ+1, "1", μ1$)
Στόχος(204, !Μνήμη("ΚΑΡΕΛ_Χ"))
ΚεφαλίδαΔεξιά(ΑριστΜισό, αρπ, ΓΡΑΜΜΗ+1, "Αρχική Θέση Υ")
Κάρελ_εισΥ=1
Προσθήκη Μνήμη, "ΚΑΡΕΛ_Υ":=(ΔεξΜισό, αρπ, ΓΡΑΜΜΗ, Μ+1, "1", μ1$)
Στόχος(205, !Μνήμη("ΚΑΡΕΛ_Υ"))
ΚεφαλίδαΔεξιά(ΑριστΜισό, αρπ, ΓΡΑΜΜΗ+1, "Προσανατολισμός")
Κάρελ_Βλέπει=2
Προσθήκη Μνήμη, "ΒΛΕΠΕΙ":=(ΔεξΜισό, αρπ, ΓΡΑΜΜΗ, Μ+1, Κεφ$(Ζήτα(,,Κάρελ_Βλέπει, 0)#Τιμή$(0)), "Επιλογή Από Λίστα")
Στόχος(206, !Μνήμη("ΒΛΕΠΕΙ"))
ΠρΧ=θέση
ΠρΥ=Γραμμή
ΚεφαλίδαΔεξιά(ΑριστΜισό, αρπ, ΓΡΑΜΜΗ+1, "Χρωματισμός")
Κάρελ_χρώμα=Χρωμα(11) ' μετατροπή τα βασικά σε κανονικά ' Χρώμα(255, 255,255) δίνει άσπρο
Προσθήκη Μνήμη, "ΧΡΩΜΑ":=(ΔεξΜισό, αρπ, ΓΡΑΜΜΗ, Μ+1, "Ρομπότ ", "Επιλογή Χρώματος Από Χρωματολόγιο")
Σταθερή ΎψοςΣτόχου2=2
// δίνουμε δυο επιπλέον στοιχεία. Κανονικά μια ρουτίνα διαβάζει τις παραμέτρους που έχουμε ορίσει
// όμως ο σωρός τιμών είναι ίδιος με αυτόν του τμήματος
// οπότε έχουμε βάλει μια Διάβασε ? που διαβάζει αν υπάρχουν τιμές αλλιώς βάζει αρχικές μόνη της αν είναι νεες,
// αλλιώς αφήνει τις τιμές που έχουν
Στόχος(207, !Μνήμη("ΧΡΩΜΑ"), ΎψοςΣτόχου2, 106)
// Το σχέδιο είναι σχεδιασμένο σε 512Χ512 pixels
// Σε 512*15Χ512*15 αν το πλάτος.σημείου=15 (όπου οι μονάδες είναι dpi, dots per inch, στην οθόνη έχουμε λογική ίντσα)
// Λογική ίντσα σημαίνει ότι υπάρχει ένας συντελεστής Φ όπου αλλάζει κατά Φ τη πραγματική ίντσα,
// δηλαδή Φ*πραγματική ίντσα=Λογική ίντσα. Το Φ δεν το ξέρει ο υπολογιστής.
// Πχ προβάλουμε σε προτζέκτορα, και πάμε την οθόνη όσο θέλουμε από τον προτζέκτορα και αλλάζουμε άμεσα το Φ.
// Οπότε δεν υπάρχει περίπτωση να το γνωρίζει ο υπολογιστής!
// Στον εκτυπωτή όμως το Φ είναι πάντα 1
// Επειδή λοιπόν μειώνουμε το μέγεθος της εικόνας (είναι σχέδιο, emf τύπος), αλλάζει το πάχος γραμμής με συνέπεια:
// κατά την ραστεροποίηση (το σχέδιο να γίνει εικονοστοιχεία), χάνεται πληροφορία και δεν εμφανίζονται οι γραμμές αν δεν πέσουν
// καλά στο εικονοστοιχείο. Οπότε δίνουμε μεγαλύτερο πάχος γραμμής από την αρχή ώστε στο συρίκνωση να υπάρχει αρκετό πάχος
// για να φανούν οι γραμμές
Σταθερή ΠάχοςΓραμμής=38
Κάρελ=ΚάρελΣχέδιο(Κάρελ_χρώμα, ΠάχοςΓραμμής)
// χρωμα 15 λέμε ότι θα χρησιμοποιήσουμε το επιπλέον επίπεδο που αυξάνει βάσει ποσοστού(ών) (ΤΙΜΗ ή και ΒΑΣΗ)
// εξ ορισμού αυτό το επίπεδο έχει ΚΑΘΕΤΗ 0 (το ΚΑΘΕΤΗ 1 το κάνει να μεγαλώνει από κάτω)
// Το μέγεθος μπορεί να είναι -100... 0 ...100
// Αρνητικό νούμερο σημαίνει ότι η εικόνα μπαίνει μπροστά από το αυτό το επίπεδο
// 0 σημαίνει ότι θα πάρει όλο το στόχο (και πάει πίσω όπως στα θετικά νούμερα )
Ποσοστό=Υπολογισμός(ΎψοςΣτόχου2)
Αλλαγή Μ, ΕΙΚΟΝΑ Καρελ, ΜΕΓΕΘΟΣ -80, ΧΡΩΜΑ #AAAAAA, ΤΙΜΗ Ποσοστό
Κεφαλίδα(Μεγάλο, αρπ, ΓΡΑΜΜΗ+3, "Σκοπός του Κάρελ")
Σκοπός=1
Προσθήκη Μνήμη, "ΣΚΟΠΟΣ":=(Μεγάλο, αρπ, ΓΡΑΜΜΗ+1, Μ+1, Κεφ$(Ζήτα(,,Σκοπός)#Τιμή$(0)), "Επιλογή Από Λίστα")
Στόχος(250, !Μνήμη("ΣΚΟΠΟΣ"))
ΣκΧ=θέση
ΣκΥ=Γραμμή
Κεφαλίδα(Μεγάλο, αρπ, ΓΡΑΜΜΗ+2, "Λειτουργία Προγράμματος")
Προσθήκη Μνήμη, "ΑΡΧΕΙΟ":=(ΑριστΜισό, αρπ, ΓΡΑΜΜΗ+1, Μ+1, "ΕΙΣΑΓΩΓΗ", "Καθαρίζει (ρωτάει) και Εισάγει από αρχείο (ρωτάει)")
Στόχος(500, !Μνήμη("ΑΡΧΕΙΟ"))
Προσθήκη Μνήμη, "ΑΠΟΘΗΚΕΥΣΗ":=(ΔεξΜισό, αρπ, ΓΡΑΜΜΗ, Μ+1, "ΕΞΑΓΩΓΗ", "Αποθήκευση (ρωτάει) και Έξοδος (ρωτάει)")
Στόχος(501, !Μνήμη("ΑΠΟΘΗΚΕΥΣΗ"))
Προσθήκη Μνήμη, "ΣΗΜ":=(ΑριστΜισό, αρπ, ΓΡΑΜΜΗ+1, Μ+1, "ΣΗΜΕΙΩΣΕΙΣ", "Σημειώσεις που θέλετε να βγαίνουν στο πρόγραμμα παρουσίασης (οπωσδήποτε όταν ο σκοπός είναι το ΑΛΛΟ), με Esc επιστρέφουμε")
Στόχος(502, !Μνήμη("ΣΗΜ"))
Προσθήκη Μνήμη, "ΒΟΗΘΕΙΑ":=(ΔεξΜισό, αρπ, ΓΡΑΜΜΗ, Μ+1, "ΒΟΗΘΕΙΑ", "Περί Λειτουργίας του Προγράμματος")
Στόχος(503, !Μνήμη("ΒΟΗΘΕΙΑ"))
Προσθήκη Μνήμη, "ΕΛΕΓΧΟΣ":=(ΑριστΜισό, αρπ1, ΓΡΑΜΜΗ, Μ+1, "ΕΛΕΓΧΟΣ", {Δοκιμή το Κόσμου σαν παιχνίδι. Οδηγίες: Αριστερό Πλήκτρο Ποντικιού: ο Κάρελ πάει Μπροστά, Δεξί Πλήκτρο Ποντικιού: ο Κάρελ στρίβει Αριστερά, Πλήκτρο Α: Ο Κάρελ παίρνει αν υπάρχει κάτι, Πλήκτρο Χ: Ο Κάρελ αφήνει αν έχει κάτι στο σάκο, Με Πλήκτρο Esc: Έξοδος})
Στόχος(504, !Μνήμη("ΕΛΕΓΧΟΣ"))
Προσθήκη Μνήμη, "ΕΜΠΡΟΣ":=(ΑριστΜισό, αρπ1+1+ΠΛ1, ΓΡΑΜΜΗ, Μ, "ΕΜΠΡΟΣ", "Κίνηση του Κάρελ Μπροστά!")
Στόχος(505, !Μνήμη("ΕΜΠΡΟΣ"))
Προσθήκη Μνήμη, "ΑΡΙΣΤΕΡΑ":=(ΑριστΜισό, αρπ1+2+2*ΠΛ1, ΓΡΑΜΜΗ, Μ, "ΑΡΙΣΤΕΡΑ", "Στροφή του Κάρελ Αριστερά!")
Στόχος(506, !Μνήμη("ΑΡΙΣΤΕΡΑ"))
Προσθήκη Μνήμη, "ΗΧΟΣ":=(ΑριστΜισό, αρπ1+3+3*ΠΛ1, ΓΡΑΜΜΗ, Μ, "ΗΧΟΣ", "Ο Κάρελ κάνει ΜΠΙΠ όταν παίρνει η αφήνει ΜΠΙΜΠΕΡ!")
Στόχος(507, !Μνήμη("ΗΧΟΣ"))
ΘέσηΣτηΛιστα = λάμδα (μ ως λίστα) ->{
Αν ειναρ τότε τι$=γραφη$(αριθμός,"") αλλιώς διάβασε τι$
// εφόσον δεν έχουν γίνει διαγραφές η λίστα δίνει ίδιους αριθμούς
Αν υπάρχει(μ, τι$) τότε =εκφρ(μ!) αλλιώς =-1 ' πάει στο τελευταίο στοιχείο
}
////////////////////////////////////
// για το χώρο πίσω από το Κόσμο!
Θέση 0, ΘέσηΣ
Αντίγραψε Χωρ, ΘέσηΜ-ΘέσηΣ στο ΠίσωΧώρος$
'ΝέοςΚόσμος(ΧΚ, ΨΚ)
ΝέοςΚόσμοςΑπόΛίστα(Λίστα1$)
'ΔείξεΚόσμο()
///////////////////////
Οθόνη
Νήμα {
Αν πατημένο(2) τότε πληκτρολόγιο δώσε 27,0,0,0
} Ως Ν1 Κάθε 20
Νήμα Ν1 Κράτα
ΜεΉχο=Ψευδές
Υπάρχει.Νέο=Ψευδές
Συνθήκες()
Αυτόματο=Ψευδές
Αναμ=200
Κάθε 1000/10 {
Αν Κωδ>0 Τότε
(Χ,Υ)=(Δείκτης.χ, Δεικτης.ψ)
Αλλαγή Ποιος(Κωδ), ΦΟΝΤΟ #AAAAAA, ΠΕΝΑ 0
// το ! λέει ότι δεν δίνουμε κλειδί αλλά θέση - εδώ είναι από 0 (αρνητικά νούμερα είναι από το τέλος)
Αυτόματο= (100,101,102,103, 505)#Έχει(κωδ)
Οθόνη : Αναφορά Μνήμη(ΘέσηΣτηΛίστα(Ποιός, Κωδ)!)#Τιμή$(5)
Αν κωδ=507 Τότε Αναφορά "Κατάσταση: "+Αν$(ΜεΉχο=Αληθής->"Ναι", "Όχι")
ενώ δείκτης<>0 και όχι Αυτόματο
Αναμονή 10
Τέλος Ενώ
Αν Χ<>Δείκτης.χ και Υ<>δείκτης.ψ τότε
// τίποτα
Αλλιώς.Αν κωδ>199 τότε
Αν κωδ>499 τότε
Αν κωδ=500 τότε
ΕισαγωγήΚόσμου()
Αλλιώς.Αν κωδ=501 τότε
ΕξαγωγήΚόσμου()
Αλλιώς.Αν κωδ=502 τότε
Ανανέωση 5000
ΚάρελΡομπότ=>ΣβήσεΜε
Κράτησε
Θόλωσε()
Δρομέας 0, 2
Ανανέωση 20
Εισαγωγή ! Σημειώσεις$, αρπ-1,ύψος-6, "Σημειώσεις", μήκος(Σημειώσεις$)+1
Ανανέωση 5000
Αφησε
ΚάρελΡομπότ=>ΣχεδίασεΠρώτηΦορά
Ανανέωση 20
Αλλιώς.Αν κωδ=503 Τότε
Περί Δείξε "*"
Αλλιώς.Αν κωδ=504 Τότε
Αλλαγή Ποιος(Κωδ), ΦΟΝΤΟ 1, ΠΕΝΑ #ddffcc
κωδ<=0
Παιχνίδι()
Αλλιώς.Αν κωδ=505 Τότε
Αυτόματο=ψευδές
Αναμονή 200
Αλλαγή Ποιος(Κωδ), ΦΟΝΤΟ 1, ΠΕΝΑ #ddffcc
κωδ<=0
Αναμ=200
Ενώ Δεικτης
Αν Κόσμος.ΚοίταΜπροστά(ΚάρελΡομπότ, Αληθές, ΜεΉχο) τότε
ΚάρελΡομπότ=>ΠηγαινεΕμπρός &παλιόΧ, &παλιόΥ
Συνθήκες()
Ανανέωση 10
Αναμονή Αναμ : Αναμ=20
Αλλιώς
Έξοδος
Τέλος Αν
Τέλος Ενώ
Αλλιώς.Αν κωδ=506 Τότε
Αλλαγή Ποιος(Κωδ), ΦΟΝΤΟ 1, ΠΕΝΑ #ddffcc
κωδ<=0
ΚάρελΡομπότ=>ΚάνεΑριστερά
Αλλιώς.Αν κωδ=507 Τότε
ΜεΉχο~
Αλλαγή Ποιος(Κωδ), ΦΟΝΤΟ 1, ΠΕΝΑ (#ddffcc, 11)#τιμή(Απολ(ΜεΉχο))
ΚάρελΡομπότ=>ΣβήσεΜε
Αλλαγή Ποιος(Κωδ), Πλαισιο 15+ΜεΉχο*4
ΚάρελΡομπότ=>ΣχεδίασεΠρώτηΦορά
κωδ<=0
Τέλος αν
Αλλιώς.Αν κωδ=200 Τότε
ΕισαγωγήΟνόματος(!Μνήμη("Τίτλος"), &όνομαπίνακα$)
Αλλιώς.Αν κωδ=201 Τότε
παλιόΧΚ=ΧΚ
ΕισαγωγήΑριθμού(!Μνήμη("Χ"), &ΧΚ, 5, 30)
ΕμφάνισηΑριθμού(!Μνήμη("ΚΑΡΕΛ_Χ"), &Κάρελ_εισΧ, 1, ΧΚ)
Αν παλιόΧΚ=ΧΚ Αλλιώς
ΝέοςΚόσμος(ΧΚ, ΨΚ)
ΔείξεΚόσμο()
Τέλος Αν
Αλλιώς.Αν κωδ=202 Τότε
παλιόΨΚ=ΨΚ
ΕισαγωγήΑριθμού(!Μνήμη("Ψ"), &ΨΚ, 5, 20)
ΕμφάνισηΑριθμού(!Μνήμη("ΚΑΡΕΛ_Υ"), &Κάρελ_εισΥ, 1, ΨΚ)
Αν παλιόΨΚ=ΨΚ Αλλιώς
ΝέοςΚόσμος(ΧΚ, ΨΚ)
ΔείξεΚόσμο()
Τέλος Αν
Αλλιώς.Αν κωδ=203 Τότε
ΕισαγωγήΑριθμού(!Μνήμη("ΣΑΚΟΣ"), &ΣΚ, 0, 1000)
Αλλιώς.Αν κωδ=204 Τότε
ΕισαγωγήΑριθμού(!Μνήμη("ΚΑΡΕΛ_Χ"), &Κάρελ_εισΧ, 1, ΧΚ)
Αλλιώς.Αν κωδ=205 Τότε
ΕισαγωγήΑριθμού(!Μνήμη("ΚΑΡΕΛ_Υ"), &Κάρελ_εισΥ, 1, ΨΚ)
Αλλιώς.Αν κωδ=206 Τότε
Δρομέας ΠρΧ, ΠρΥ+1
Κάρελ_Βλέπει=Ζήτα(Ποιός(206), Κάρελ_Βλέπει,,0) ' αφήνουμε την τρίτη επιλογή
Για ΚάρελΡομπότ {
.Βλέπει=Κάρελ_Βλέπει
.ΣχεδίασεΞανά
}
Αλλιώς.Αν κωδ=207 Τότε
Σωρός Νέος {
Επίλεξε.Χρώμα Κάρελ_χρώμα
Αν όχι κενό τότε διάβασε Κάρελ_χρώμα
Κάρελ=ΚάρελΣχέδιο(Κάρελ_χρώμα, ΠάχοςΓραμμής)
Αλλαγή Ποιός(207), ΕΙΚΟΝΑ Καρελ, ΦΟΝΤΟ 1, ΠΕΝΑ 15
Κάρελ=ΚάρελΣχέδιο(Κάρελ_χρώμα, Περίγραμμα)
ΚάρελΔυτικά=ΚάρελΣχέδιο(Κάρελ_χρώμα, Περίγραμμα, 1)
ΚάρελΡόμποτ=>ΣχεδίασεΞανά
}
Αλλιώς.Αν κωδ=250 Τότε
Δρομέας ΣκΧ, ΣκΥ+1
Σκοπός=Ζήτα(Ποιός(250), Σκοπός)
Τέλος Αν
Αλλιώς
Αυτόματο=Ψευδές
Αν Κωδ>=1 και Κωδ<=5 τότε
Υπάρχει.Νέο=Αληθές
Αν ΠαλιόΧ<ΧΠ Και ΠαλιόΥ<ΥΠ Τότε
Ανανέωση 5000
ΚάρελΡομπότ=>ΣβήσεΜε
Επίλεξε με Κωδ-1
Με 1
Κόσμος.ΒάλεΕμπόδιο παλιόΧ, ΠαλιόΥ
Με 2
Κόσμος.ΚΑΘΕΤΟΑΚΡΟ παλιόΧ, ΠαλιόΥ
Με 3
Κόσμος.ΒάλεΑΚΡΟ παλιόΧ, ΠαλιόΥ
Με 4
Κόσμος.ΒαλεΔΕΞΙΑΚΡΟ παλιόΧ, ΠαλιόΥ
Αλλιώς Με
Κόσμος.ΚαθάρισεΕμπόδιο παλιόΧ, ΠαλιόΥ
Τέλος Επιλογής
Προηγούμενη=Λίστα
Θέση 0, ΘέσηΣ
Εικόνα ΠίσωΧώρος$
Θέση (Χωρ-ΚΑ*ΧΠ) δια 2-ΚΣ, ((ΘέσηΜ1-ΘέσηΣ)-ΚΑ*(ΥΠ)) δια 2+ΘέσηΣ+ΚΣ
Κόσμος.Εμφάνισε
ΚάρελΡομπότ=>ΣχεδίασεΠρώτηΦορά
Ανανέωση 20
Τέλος Αν
Αλλιώς.Αν Κωδ=6 Τότε
Ανανέωση 10000
Αν Κόσμος.Πόσα(παλιόΧ, παλιόΥ)=0 τότε
ΒάλεΚάτι(παλιόΧ, παλιόΥ, ΚάρελΡομπότ=>Βλέπει)
Τέλος Αν
Κόσμος.ΒάλεΚάτι παλιόΧ, παλιόΥ
Υπάρχει.Νέο=Αληθές
Ανανέωση 20
Αναμονή 200
Αλλιώς.Αν Κωδ=7 Τότε
Ανανέωση 10000
Αν Κόσμος.Πόσα(παλιόΧ, παλιόΥ)=1 τότε
ΒάλεΚενό(παλιόΧ, παλιόΥ, ΚάρελΡομπότ=>Βλέπει)
Τέλος Αν
Κόσμος.ΠάρεΚάτι παλιόΧ, παλιόΥ
Υπάρχει.Νέο=Αληθές
Ανανέωση 20
Αναμονή 200
Αλλιώς
Επανάλαβε
Αν Κωδ=102 και ΠαλιοΧ<ΧΠ Τότε
Για ΚάρελΡομπότ {
.Βλέπει=ΑΝΑΤΟΛΙΚΑ
.ΘέσηΧ++
.ΠηγαινεΕμπρός &παλιόΧ, &παλιόΥ
}
Αναμονή 1
Αυτόματο=Δείκτης<>0
Αλλιώς.Αν Κωδ=101 και ΠαλιοΧ>1 Τότε
Για ΚάρελΡομπότ {
.Βλέπει=ΔΥΤΙΚΑ
.ΘέσηΧ--
.ΠηγαινεΕμπρός &παλιόΧ, &παλιόΥ
}
Αναμονή 1
Αυτόματο=Δείκτης<>0
Αλλιώς.Αν Κωδ=100 και ΠαλιοΥ>1 Τότε
Για ΚάρελΡομπότ {
.Βλέπει=ΒΟΡΕΙΑ
.ΘέσηΥ--
.ΠηγαινεΕμπρός &παλιόΧ, &παλιόΥ
}
Αναμονή 1
Αυτόματο=Δείκτης<>0
Αλλιώς.Αν Κωδ=103 και ΠαλιοΥ<ΥΠ Τότε
Για ΚάρελΡομπότ {
.Βλέπει=ΝΟΤΙΑ
.ΘέσηΥ++
.ΠηγαινεΕμπρός &παλιόΧ, &παλιόΥ
}
Αναμονή 1
Αυτόματο=Δείκτης<>0
Αλλιώς
Αυτόματο=Ψευδές
Τέλος Αν
Αν Αυτόματο Τότε Συνθήκες()
Όσο Αυτόματο
Τέλος Αν
Τέλος Αν
Αν Κωδ>0 Τότε Αλλαγή Ποιος(Κωδ), ΦΟΝΤΟ 1, ΠΕΝΑ #ddffcc
Συνθήκες()
Αν Όχι Αυτόματο τότε Κωδ<=0: Ανανέωση
Αλλιώς.Αν κωδ=-1 τότε
Αν Υπάρχει.Νέο Τότε ΕξαγωγήΚόσμου()
Αν Υπάρχει.Νέο Τότε
Αν Ρώτα("Θές σίγουρα να κλείσεις το πρόγραμμα", τιτλ$, "Ναι", "*Όχι")=1 Τότε Έξοδος
Αλλιώς
έξοδος
Τέλος Αν
Τέλος Αν
Σάρωσε 0.1
Αν Πατημένο(49) τότε έξοδος
}
Κύλιση Χώρισμα 0
Περί ! ""
Νήματα Σβήσε
Στόχοι Νέοι
Τέλος
ΦόρτωσεΣυνάρτηση:
// Οι ορισμοί κανονικής συνάρτησης πάνε στην αρχή της εκτέλεσης
// εδώ μεταθέσαμε το κώδικα προς το τέλος, αλλά σαν ροή παραμένει
// στην αρχή της εκτέλεσης με χρήση της Διαμέσου ΦόρτωσεΣυνάρτηση
// Δείτε μετά τη συνάρτηση την εντολή Επιστροφή
// Αυτή είναι μια απλή ρουτίνα που δεν διαγράφει ό,τι δημιουργεί,
// σε αντίθεση με την ρουτίνα/τέλος Ρουτίνας και το συνάρτηση/τέλος συνάρτησης
// Επίσης μια κανονική συνάρτηση έχει δικό της όνομα χώρου!
// Οπότε εδώ δεν ορίζουμε τοπικές!
Γενική Απαρίθμηση Προσανατολισμός {ΒΟΡΕΙΑ, ΑΝΑΤΟΛΙΚΑ, ΝΟΤΙΑ, ΔΥΤΙΚΑ}
Γενική Απαρίθμηση Πρόσβαση {ΕΚΤΟΣ_ΠΙΝΑΚΑ=-1, ΚΑΘΑΡΟ, ΕΜΠΟΔΙΟ, ΚΑΤΩΑΚΡΟ, ΑΚΡΟ, ΔΕΞΙΑΚΡΟ}
Γενική Απαρίθμηση Τσαντα {ΔΕΝ_ΥΠΑΡΧΕΙ_ΚΑΤΙ=0, ΥΠΑΡΧΕΙ_ΚΑΤΙ=-1}
Συνάρτηση ΚάρελΣχέδιο(χρ=1, παχ ως μακρύς=11, φλιπ=0){
Αν παχ<1 τότε παχ=1
Αν φλιπ Τότε
μχ1=1
μχ=512
Οχ=0
Αλλιώς
Οχ=-πλάτος.σημείου*20
μχ1=-1
μχ=0
Τέλος Αν
πλ=-πλάτος.σημείου*μχ1
Σχέδιο πλάτος.σημείου*512, ύψος.σημείου*512 {
Πένα 0 {Πάχος 1 {
Θέση Οχ+πλάτος.σημείου*(μχ-263*μχ1),ύψος.σημείου*(37+50+312)
Πολύγωνο 0, 0, ύψος.σημείου*70, πλ*106, 0, 0, -ύψος.σημείου*48, -πλ*52, 0, 0, -ύψος.σημείου*22 , -πλ*54, 0
}}
Πένα 0 {Πάχος 1 {
Θέση Οχ+πλάτος.σημείου*(μχ-147*μχ1),ύψος.σημείου*(263)
Πολύγωνο 0, -πλ*82, 0, 0, ύψος.σημείου*96, πλ*43, 0,0, -ύψος.σημείου*53, πλ*39, 0, 0, -ύψος.σημείου*43
}}
Πένα 0 {Πάχος παχ {
Θέση Οχ+πλάτος.σημείου*(μχ-147*μχ1),ύψος.σημείου*(37)
Χρώμα {
Πολύγωνο 11, 0 , ύψος.σημείου*312, πλ*50, ύψος.σημείου*50, πλ*220, 0, 0, -ύψος.σημείου*294, -πλ*68, -ύψος.σημείου*68, -πλ*202, 0
Θέση Οχ+πλάτος.σημείου*(μχ-208*μχ1),ύψος.σημείου*(85)
Πολύγωνο 5, πλ*130, 0, 0, ύψος.σημείου*180, -πλ*130, 0, 0 , -ύψος.σημείου*180
};
Θέση Οχ+πλάτος.σημείου*(μχ-147*μχ1),ύψος.σημείου*37
Χρώμα {
Πολύγωνο χρ, 0 , ύψος.σημείου*312, πλ*50, ύψος.σημείου*50, πλ*220, 0, 0, -ύψος.σημείου*294, -πλ*68, -ύψος.σημείου*68, -πλ*202, 0
Θέση Οχ+πλάτος.σημείου*(μχ-208*μχ1),ύψος.σημείου*(85)
Πολύγωνο 5, πλ*130, 0, 0, ύψος.σημείου*180, -πλ*130, 0, 0 , -ύψος.σημείου*180
}
Θέση Οχ+πλάτος.σημείου*(μχ-268*μχ1),ύψος.σημείου*334
Χάραξε πλ*70
}}
} ως Αλφα
=Αλφα
}
Συνάρτηση Ζήτα(Κωδ=0, ΑρχικήΕπιλογή ως ακέραιος=1, ΑυτόΘέλω ως ακέραιος=0, ποιες_επιλογές=1) {
// ασύγχρονη λειτουργία του μενού επιλογών στην κονσόλα
Γενική Απάντηση=0
Τοπική οκ
Ανανέωση 20
Επιλογή
Επιλογή Βάψε 14,1,7
Αν ποιες_επιλογές=1 Τότε
Επιλογή + "Ψάχνει ένα Μπίμπερ", "Μαζεύει όλα τα Μπίμπερ", "Βάζει Μπίμπερ σε θέσεις", "Πάει στην Περίμετρο", "Άλλο"
Αλλιώς
Επιλογή + "Βορράς", "Ανατολή", "Νότος", "Δύση"
Τέλος Αν
ΑυτόΘέλω=Μικρό.Σειράς(Απολ(ΑυτόΘέλω), Επιλογές)
Αν ΑυτόΘέλω>0 Τότε =(Επιλογή$(ΑυτόΘέλω),): Εξοδος ' εδώ επιστρέφει πίνακα
ΑρχικήΕπιλογή=Μικρό.Σειράς(Απολ(ΑρχικήΕπιλογή), Επιλογές)
Επιλογή @ "Απάντηση=Επιλογή" !
Επιλογή Δείξε ΑρχικήΕπιλογή
ΠαλιάΕπιλογή=-1
Ενώ Απάντηση=0
Αν πατημένο(2) ή πατημένο(27) ή Απάντηση>0 τότε έξοδος
Αν επιλογή>0 και ΠαλιάΕπιλογή<>Επιλογή τότε
ΠαλιάΕπιλογή=Επιλογή
Αν Κωδ>0 Τότε Αλλαγή Κωδ, ΦΡΑΣΗ Κεφ$(Επιλογή$(Επιλογή))
Αν ποιες_επιλογές=1 Τότε
τ$=("Δίνουμε τις αρχικές θέσεις", "Δίνουμε τις αρχικές θέσεις", "Δίνουμε τις τελικές θέσεις", "Σημαίνει έξοδο από Λαβύρινθο", "Γίνεται έλεγχος από τον επόπτη")#Τιμή$(Επιλογή-1)
Αλλιώς
ΚάρελΡομπότ=>Σχεδίασε Επιλογή
τ$="Το ρομπότ Κάρελ κοιτάει προς "+("το Βορρά","την Ανατολή", "το Νότο", "τη Δύση")#Τιμή$(Επιλογή-1)
Τέλος Αν
Οθόνη
Αναφορά τ$
τέλος αν
Ανανέωση 20
Αναμονή 100
Τέλος Ενώ
' εδώ επιστρέφει αριθμό
Απάντηση<=Αν(Απάντηση=0 -> ΑρχικήΕπιλογή, Απάντηση)
Αν Κωδ>0 Τότε Αλλαγή Κωδ, ΦΡΑΣΗ Κεφ$(Επιλογή$(Απάντηση))
=Απάντηση
Επιλογή // Κλείνει το μενού
}
Κλάση ΚΟΣΜΟΣ {
γεγονότα "Αρχή", "ΑλλαγήΓραμμής", "ΔεξιάΚενό", "ΔεξιάΚάτι", "ΔεξιάΕμπόδιο"
Ιδιωτικό:
Πίνακες Κ(), Μ()
μεγΧ=0, μεγΥ=0
Δημόσιο:
Τμήμα ΚαθάρισεΕμπόδιο (Χ ως ακέραιος, Υ ως ακέραιος) {
Αν Χ<1 Η Χ>.μεγΧ Η Υ<1 Η Υ>.μεγΥ Τότε Έξοδος
.Κ(Χ,Υ)=ΚΑΘΑΡΟ
}
Τμήμα ΒάλεΕμπόδιο (Χ ως ακέραιος, Υ ως ακέραιος) {
Αν Χ<1 Η Χ>.μεγΧ Η Υ<1 Η Υ>.μεγΥ Τότε Έξοδος
.Κ(Χ,Υ)=ΕΜΠΟΔΙΟ
}
Τμήμα ΒαλεΔΕΞΙΑΚΡΟ (Χ ως ακέραιος, Υ ως ακέραιος) {
Αν Χ<1 Η Χ>.μεγΧ Η Υ<1 Η Υ>.μεγΥ Τότε Έξοδος
.Κ(Χ,Υ)=ΔΕΞΙΑΚΡΟ
}
Τμήμα ΚΑΘΕΤΟΑΚΡΟ (Χ ως ακέραιος, Υ ως ακέραιος) {
Αν Χ<1 Η Χ>.μεγΧ Η Υ<1 Η Υ>.μεγΥ Τότε Έξοδος
.Κ(Χ,Υ)=ΚΑΤΩΑΚΡΟ
}
Τμήμα ΒάλεΑΚΡΟ (Χ ως ακέραιος, Υ ως ακέραιος) {
Αν Χ<1 Η Χ>.μεγΧ Η Υ<1 Η Υ>.μεγΥ Τότε Έξοδος
.Κ(Χ,Υ)=ΑΚΡΟ
}
Τμήμα ΒάλεΚάτι (Χ ως ακέραιος, Υ ως ακέραιος) {
Αν Χ<1 Η Χ>.μεγΧ Η Υ<1 Η Υ>.μεγΥ Τότε Έξοδος
.Μ(Χ,Υ)++
}
Τμήμα ΠάρεΚάτι (Χ ως ακέραιος, Υ ως ακέραιος) {
Αν Χ<1 Η Χ>.μεγΧ Η Υ<1 Η Υ>.μεγΥ Τότε Έξοδος
Αν .Μ(Χ,Υ)>0 τότε .Μ(Χ,Υ)--
}
Τμήμα ΒάλεΚενό (Χ ως ακέραιος, Υ ως ακέραιος){
Αν Χ<1 Η Χ>.μεγΧ Η Υ<1 Η Υ>.μεγΥ Τότε Έξοδος
.Μ(Χ,Υ)=0
}
Συνάρτηση ΈχειΚατι(Χ ως ακέραιος, Υ ως ακέραιος) {
Αν Χ<1 ή Χ>.μεγΧ ή Υ<1 ή Υ>.μεγΥ Τότε Εξοδος
=.Μ(Χ, Υ)>0
}
Συνάρτηση Πόσα(Χ ως ακέραιος, Υ ως ακέραιος) {
Αν Χ<1 Η Χ>.μεγΧ Η Υ<1 Η Υ>.μεγΥ Τότε Έξοδος
=.Μ(Χ,Υ)
}
Συνάρτηση Βόρεια(&Χ ως ακέραιος, &Υ ως ακέραιος, χε=ψευδής) {
ΑΝ Υ=1 Τότε
Αλλιώς.Αν Χ=1 ή Χ=.ΜεγΧ Τότε
Υ-- : =Αληθής
Αλλιώς.ΑΝ .Κ(Χ,Υ-1)=ΔΕΞΙΑΚΡΟ Η .Κ(Χ-1,Υ-1)=ΚΑΘΑΡΟ Η .Κ(Χ,Υ-1)=ΚΑΘΑΡΟ Τότε
Υ-- : =Αληθής
Αλλιώς.Αν .Κ(Χ,Υ-1)=ΑΚΡΟ ΤΌΤΕ
Υ-- : =Αληθής
Τελος Αν
Αν χε τότε =Αληθής
}
Συνάρτηση Ανατολικά(&Χ ως ακέραιος, &Υ ως ακέραιος, χε=ψευδής) {
Αν Χ=.μεγΧ Τότε
Αλλιώς.Αν Υ=1 ή Υ=.ΜεγΥ Τότε
Χ++:=Αληθής
Αλλιώς.Αν (.Κ(Χ,Υ)<>ΕΜΠΟΔΙΟ ΚΑΙ .Κ(Χ,Υ)<>ΔΕΞΙΑΚΡΟ) Η .Κ(Χ,Υ-1)=ΚΑΘΑΡΟ Τότε
Χ++:=Αληθής
Τελος Αν
Αν χε τότε =Αληθής
}
Συνάρτηση Νότια(&Χ ως ακέραιος, &Υ ως ακέραιος, χε=ψευδής){
Αν Υ=.μεγΥ Τότε
Αλλιώς.Αν Χ=1 ή Χ=.ΜεγΧ Τότε
Υ++ : =Αληθής
Αλλιώς.ΑΝ .Κ(Χ,Υ)=ΔΕΞΙΑΚΡΟ Η .Κ(Χ-1,Υ)=ΚΑΘΑΡΟ Η .Κ(Χ,Υ)=ΚΑΘΑΡΟ Τότε
Υ++ : =Αληθής
Αλλιώς.Αν .Κ(Χ,Υ)=ΑΚΡΟ ΤΌΤΕ
Υ++ : =Αληθής
Τελος Αν
Αν χε τότε =Αληθής
}
Συνάρτηση Δυτικά(&Χ ως ακέραιος, &Υ ως ακέραιος, χε=ψευδής){
ΑΝ Χ=1 Τότε
Αλλιώς.Αν Υ=1 ή Υ=.ΜεγΥ Τότε
Χ-- : = Αληθής
Αλλιώς.Αν (.Κ(Χ-1,Υ)<>ΕΜΠΟΔΙΟ ΚΑΙ .Κ(Χ-1,Υ)<>ΔΕΞΙΑΚΡΟ) Η .Κ(Χ-1,Υ-1)=ΚΑΘΑΡΟ Τότε
Χ-- : = Αληθής
Τελος Αν
Αν χε τότε =Αληθής
}
Συνάρτηση ΚοίταΜπροστά(Ρομπότ ως *ΡΟΜΠΟΤ, ΝαΠάει ως Λογικός=Ψευδής, ΧωρίςΈλεγχο=Ψευδής) {
κάνε ακέραιο θΧ, θΥ, Προσαν, ΟΚ
Για Ρομπότ {
θΧ=.ΘέσηΧ
θΥ=.ΘέσηΥ
Προσαν=.Βλέπει
}
Επίλεξε Με Προσαν
Με ΒΟΡΕΙΑ
ΟΚ=.Βόρεια(&θΧ, &θΥ, ΧωρίςΈλεγχο)
Με ΑΝΑΤΟΛΙΚΑ
ΟΚ=.Ανατολικά(&θΧ, &θΥ, ΧωρίςΈλεγχο)
Με ΝΟΤΙΑ
ΟΚ=.Νότια(&θΧ, &θΥ, ΧωρίςΈλεγχο)
Με ΔΥΤΙΚΑ
ΟΚ=.Δυτικά(&θΧ, &θΥ, ΧωρίςΈλεγχο)
Τέλος επιλογής
Αν ΟΚ Και ΝαΠάει Τότε
Για Ρομπότ {
// θέλει <= και όχι = λόγω του τύπου και του χώρου εδώ!
// ή (.ΘέσηΧ, .ΘέσηΥ)=(θΧ, θΥ)
// ή
//Στη .ΘέσηΧ=θΧ, .ΘέσηΥ=θΥ
.ΘέσηΧ<=θΧ
.ΘέσηΥ<=θΥ
}
Τέλος Αν
=ΟΚ
}
Συνάρτηση ΚοίταΔεξιά(Ρομπότ ως *ΡΟΜΠΟΤ) {
κάνε ακέραιο θΧ, θΥ, Προσαν
Για Ρομπότ {
θΧ=.ΘέσηΧ
θΥ=.ΘέσηΥ
Προσαν=.Βλέπει
}
Επίλεξε Με Προσαν
Με ΔΥΤΙΚΑ
=.Βόρεια(&θΧ, &θΥ)
Με ΒΟΡΕΙΑ
=.Ανατολικά(&θΧ, &θΥ)
Με ΑΝΑΤΟΛΙΚΑ
=.Νότια(&θΧ, &θΥ)
Με ΝΟΤΙΑ
=.Δυτικά(&θΧ, &θΥ)
Τέλος επιλογής
}
Συνάρτηση ΚοίταΑριστερά(Ρομπότ ως *ΡΟΜΠΟΤ) {
κάνε ακέραιο θΧ, θΥ, Προσαν
Για Ρομπότ {
θΧ=.ΘέσηΧ
θΥ=.ΘέσηΥ
Προσαν=.Βλέπει
}
Επίλεξε Με Προσαν
Με ΑΝΑΤΟΛΙΚΑ
=.Βόρεια(&θΧ, &θΥ)
Με ΝΟΤΙΑ
=.Ανατολικά(&θΧ, &θΥ)
Με ΔΥΤΙΚΑ
=.Νότια(&θΧ, &θΥ)
Με ΒΟΡΕΙΑ
=.Δυτικά(&θΧ, &θΥ)
Τέλος επιλογής
}
Συνάρτηση ΚοίταΠίσω(Ρομπότ ως *ΡΟΜΠΟΤ) {
κάνε ακέραιο θΧ, θΥ, Προσαν
Για Ρομπότ {
θΧ=.ΘέσηΧ
θΥ=.ΘέσηΥ
Προσαν=.Βλέπει
}
Επίλεξε Με Προσαν
Με ΝΟΤΙΑ
=.Βόρεια(&θΧ, &θΥ)
Με ΔΥΤΙΚΑ
=.Ανατολικά(&θΧ, &θΥ)
Με ΒΟΡΕΙΑ
=.Νότια(&θΧ, &θΥ)
Με ΑΝΑΤΟΛΙΚΑ
=.Δυτικά(&θΧ, &θΥ)
Τέλος επιλογής
}
Τμήμα Εμφάνισε {
αν .μεγΧ=0 ή .μεγΥ=0 τότε εξοδος
Κάλεσε Γεγονός "Αρχή"
για ι=1 έως .μεγΥ-1
για κ=1 έως .μεγΧ
Επίλεξε Με .Κ(κ, ι)
Με >=ΕΜΠΟΔΙΟ
Κάλεσε Γεγονός "ΔεξιάΕμπόδιο", .Κ(κ, ι)
Με ΚΑΘΑΡΟ
Κάλεσε Γεγονός "ΔεξιάΚενό"
Τέλος Επιλογής
Αν .Μ(κ, ι)>0 Τότε Κάλεσε Γεγονός "ΔεξιάΚάτι"
επόμενο
Κάλεσε Γεγονός "ΑλλαγήΓραμμής"
επόμενο
για κ=1 έως .μεγΧ
Κάλεσε Γεγονός "ΔεξιάΚενό"
Αν .Μ(κ, ι)>0 Τότε Κάλεσε Γεγονός "ΔεξιάΚάτι"
Επόμενο
Κάλεσε Γεγονός "ΑλλαγήΓραμμής"
}
Ιδιότητα ΠακέτοJson$ {
Θέσε {
Ένωσε γονικο μεγΧ, μεγΥ, Μ(), Κ() στη Π, Υ, Μ1(), Κ1()
Όρισε ΟρισμόςΚόσμου ΛίσταJson
Με ΟρισμόςΚόσμου, "itempath" ως Εγγραφή(), "itempath" ως Εγγραφή$()
Μέθοδος ΟρισμόςΚόσμου, "parser", Αξια$ ως ΟρισμόςΚόσμου
Αν Τύπος$(ΟρισμόςΚόσμου)="JsonObject" Τότε
ΔοκιμήΠ=Εγγραφή("Πλάτος")
ΔοκιμήΥ=Εγγραφή("Ύψος")
Αν ΔοκιμήΠ>=5 και ΔοκιμήΠ<=20 και ΔοκιμήΥ>=5 και ΔοκιμήΥ<=20 Τότε
(Π, Υ)=(ΔοκιμήΠ, ΔοκιμήΥ)
Πίνακες Μ1(1 έως Π, 1 έως Υ), Κ1(1 έως Π, 1 έως Υ)=ΚΑΘΑΡΟ
Για ι=1 έως Π: Για κ=1 έως Υ
Μ1(ι,κ)=Εγγραφή("Μπιμπερ.["+γραφη$(ι)+","+γραφη$(κ)+"]")
Επίλεξε Με Εγγραφή$("Εμπόδια.["+γραφη$(ι)+","+γραφη$(κ)+"]")
Με "1"
Κ1(ι, κ)=ΕΜΠΟΔΙΟ
Με "2"
Κ1(ι, κ)=ΚΑΤΩΑΚΡΟ
Με "3"
Κ1(ι, κ)=ΑΚΡΟ
Με "4"
Κ1(ι, κ)=ΔΕΞΙΑΚΡΟ
Τέλος Επιλογής
Επόμενο : Επόμενο
Τέλος Αν
Τέλος Αν
}
Αξία {
Σταθερή μονοπάτι$="assignpath"
Ένωσε γονικο μεγΧ, μεγΥ, Μ(), Κ() στη Π, Υ, Μ1(), Κ1()
Όρισε ΟρισμόςΚόσμου ΛίσταJson
Με ΟρισμόςΚόσμου, "json" ως Φορμάρισμα$()
Μέθοδος ΟρισμόςΚόσμου, μονοπάτι$, "Πλάτος", Π
Μέθοδος ΟρισμόςΚόσμου, μονοπάτι$, "Ύψος", Υ
Για ι=1 έως Π: Για κ=1 έως Υ
Αν Μ1(ι, κ)>0 Τότε Μέθοδος ΟρισμόςΚόσμου, μονοπάτι$, "Μπιμπερ.["+γραφη$(ι)+","+γραφη$(κ)+"]", Μ1(ι, κ)
Αν Κ1(ι, κ)<>0 Τότε Μέθοδος ΟρισμόςΚόσμου, μονοπάτι$, "Εμπόδια.["+γραφη$(ι)+","+γραφη$(κ)+"]", Κ1(ι, κ)
Επόμενο : Επόμενο
Αξία$=Φορμάρισμα$(0)
Όρισε ΟρισμόςΚόσμου Τίποτα
}
}
Ιδιότητα ΧΠ {
Αξια {
Ένωσε γονικό μεγΧ στη Χ
Αξία=Χ
}
}
Ιδιότητα ΥΠ {
Αξια {
Ένωσε γονικό μεγΥ στη Υ
Αξία=Υ
}
}
Κλάση:
Τμήμα Κόσμος (Χ ως ακέραιος, Υ ως ακέραιος){
Πίνακας .Κ(1 εως Χ,1 εως Υ)=ΚΑΘΑΡΟ
Πίνακας .Μ(1 εως Χ,1 εως Υ)=0
.μεγΧ<=Χ
.μεγΥ<=Υ
}
}
Κλάση ΡΟΜΠΟΤ {
γεγονότα "σχεδίασε", "ΚίνησηΜπροστά", "Εικόνα","σχεδίασεΦόντο"
Βλέπει=ΑΝΑΤΟΛΙΚΑ, Εχει=ΔΕΝ_ΥΠΑΡΧΕΙ_ΚΑΤΙ, Πόσα_Εχει=0
ΘέσηΧ=0, ΘέσηΥ=0
Τμήμα ΠηγαινεΕμπρός (&παλιόΧ, &παλιόΥ) {
Κάλεσε Γεγονός "ΚίνησηΜπροστά", παλιόΧ, παλιόΥ, .ΘέσηΧ, .ΘέσηΥ, .Βλέπει
(παλιόΧ, παλιόΥ) = (.ΘέσηΧ, .ΘέσηΥ)
}
Τμήμα ΣβήσεΜε {
Κάλεσε Γεγονός "σχεδίασεΦόντο", .ΘέσηΧ, .ΘέσηΥ
}
Τμήμα ΣχεδίασεΠρώτηΦορά {
Κάλεσε Γεγονός "σχεδίασε", .ΘέσηΧ, .ΘέσηΥ, .Βλέπει, Ψευδές
}
Τμήμα ΣχεδίασεΞανά {
Κάλεσε Γεγονός "σχεδίασε", .ΘέσηΧ, .ΘέσηΥ, .Βλέπει
}
Τμήμα Σχεδίασε (Εκεί=-1) {
Κάλεσε Γεγονός "σχεδίασε", .ΘέσηΧ, .ΘέσηΥ, Εκεί
}
Τμήμα ΣχεδίασεΑντίγραφο (προσανατολισμός, γωνία, μέγεθος) {
// στη θέση του δρομέα γραφικών.
// μέγεθος 100 είναι 512Χ512 pixels (512x15 X 512x15 twips στα 96dpi)
// γωνία σε μοίρες (+, -)
// βάσει προσανατολισμού επιλέγει εικόνα
Κάλεσε Γεγονός "Εικόνα", προσανατολισμός, γωνία, μέγεθος
}
Τμήμα ΚάνεΑριστερά {
Επίλεξε Με .Βλέπει
Με ΝΟΤΙΑ
.Βλέπει<=ΑΝΑΤΟΛΙΚΑ
Με ΔΥΤΙΚΑ
.Βλέπει<=ΝΟΤΙΑ
Με ΒΟΡΕΙΑ
.Βλέπει<=ΔΥΤΙΚΑ
Με ΑΝΑΤΟΛΙΚΑ
.Βλέπει<=ΒΟΡΕΙΑ
Τέλος επιλογής
Κάλεσε Γεγονός "σχεδίασε", .ΘέσηΧ, .ΘέσηΥ, .Βλέπει
}
}
Κάνε ΧΠ=20, ΥΠ=10
Ομάδα ΜεΓεγονότα Κόσμος=Κόσμος(ΧΠ, ΥΠ)
Κάνε Φόντο1=5, ΓραμμηΧρ=7, Τοίχος=1, ΚάτιΧρ=4, γω=0 ' ΓΩΝΙΑ ΕΠΙΠΡΟΣΘΕΤΗ ΓΙΑ ΚΙΝΗΣΗ
Κατάσταση Προηγούμενη
Κάνε Οριζόντιο=0, Κελί=0, ΚΑ=100, ΚΣ=50, ΠίσωΧώρος$
Κάνε αρχηΓραμμήςΧ, αρχηΓραμμής, ΓραμμήΚ, ρχ, ρψ
Φόντο1=5
ΓραμμηΧρ=4
Τοίχος=14
ΚάτιΧρ=4
// Καρελ
Κάνε Κάρελ, ΚάρελΔυτικά
Κάνε Περίγραμμα, μεγ, Κάρελ_χρώμα
// Αρχικά φτιάχνουμε ένα ρομπότ με γεγονότα (στατικό στο τμήμα)
Ομάδα ΜεΓεγονότα Ρομπότ=Ρομποτ()
// για να τπ χειριστούμε από την συνάρτηση Ζήτα(), φτιάχνουμε μια γενική
// που είναι δείκτης στη Ρομπότ, που είναι επώνυμη άρα ο δείκτης είναι αναφορά!
// έτσι έχουμε τοπική τη Ρομπότ και μια γενική που δείχνει την τοπική.
// Στην Ζήτα() η ΚάρελΡομπότ καλεί μια μέθοδο που με τη σειρά της καλεί ένα γεγονός
// έτσι στην ουσία η Ζήτα() καλεί πίσω (call back) από εκεί που κλήθηκε πριν τερματίσει
// Θέλουμε να βλέπουμε να αλλάζει προσανατολισμό το ρομποτ στον εικονικό κόσμο, καθώς επιλέγουμε από τη λίστα!
// Οι πληροφορίες για το κόσμο, όπως εμφανίζεται, αφενός δεν είναι στο ρομπότ, αφετέρου δεν είναι στο αντικείμενο κόσμος.
// Όλα αυτά είναι έξω από τα αντικείμενα.
// Η Ζήτα() έχει 2Χ2 χρήσεις (αυτό δεν είναι καλό, αλλά εδώ έγινε για συντομία)
// Χρησιμοποιεί το μενού επιλογών ασύγχρονα, για να βλέπει που πάει ο δείκτης μας και να μας αλλάζει πληροφορίες.
// Αυτό το κάνει για δυο διαφορετικά μενού. Σε καθένα έχουμε ένα πίνακα αντιστοιχιών. Ζητάμε το νούμερο επιλογής.
// Αυτές είναι οι 2 χρήσεις. Για κάθε όμως μενού μπορούμε να ζητήσουμε την αντιστοιχία σε αλφαριθμητικό. Επειδή όμως
// η Ζήτα() είναι αριθμητική συνάρτηση, δεν θα γυρίσουμε αλφαριθμητικό αλλά πίνακα με ένα στοιχείο αλφαριθμητικό!
// Έτσι η Ζήτα() ή γυρνάει νούμερο η πίνακα!
// Αν στην μεταβλητή που θέλουμε να γράψουμε το αποτέλεσμα είναι πίνακας και βάζουμε νούμερο, θα πάρουμε λάθος.
// Αν είναι νούμερο θα γίνει δείκτης σε πίνακα. Οπότε αν έχουμε φρέσκια μεταβλητή θα πάρει τιμή πρώτη φορά από τη συνάρτηση.
Γενική ΚάρελΡομπότ->Ρομπότ
Κάνε παλιόΧ, παλιόΥ
Για ΚάρελΡομπότ {
.Βλέπει=ΑΝΑΤΟΛΙΚΑ
.ΘέσηΧ=1
παλιόΧ=1
.ΘέσηΥ=1
παλιόΥ=1
}
// Συναρτήσεις εξυπηρέτησης γεγονότων
Συνάρτηση Κόσμος_Αρχή {