![](https://habrastorage.org/getpro/habr/post_images/c87/378/09d/c8737809dc6fa095a8556a740fae0f9f.gif)
मेरे अगले नियंत्रण में कम्प्यूटेशनल त्रुटियों की एक निश्चित संख्या में खोज करने के बाद, भौतिकी शिक्षक ने कुछ बहुत ही विनम्र वाक्यांश कहा, जो एक महान रूसी भाषा में एक स्वतंत्र अनुवाद में इस तरह लग रहा होगा:
ताकि अगली बार एक सामान्य रेखांकन कैलकुलेटर हो!
निकटतम किताबों की दुकान पर छापे के परिणामस्वरूप (जिले में अधिक प्रासंगिक नहीं थे), TI-84 प्लस का अधिग्रहण किया गया था। सभी नियंत्रणों को लिखे जाने के बाद, यह सवाल उठने लगा: क्या, वास्तव में, यह जानवर कर सकता है? गुग्लिंग द्वारा यह पता चला कि TI-84 प्लस न केवल एक मूल्यवान स्क्वायर रूट एक्सट्रैक्टर है, बल्कि:
- प्रसिद्ध Zilog Z80,
- 24 केबी रैम और 480 केबी फ्लैश उपयोगकर्ता के लिए उपलब्ध है,
- उत्साही लोगों द्वारा लिखे गए उपयोगी (और ऐसा नहीं) कार्यक्रमों का एक गुच्छा।
कटौती के तहत, कैलकुलेटर की एक छोटी समीक्षा और मेरे लेखन के बजाय एक " अनाड़ी " रोबोट " खेल " है । मैं नग्नता के प्रशंसकों से पहले से माफी मांगता हूं - मैं कैलकुलेटर को जुदा नहीं कर सका, और मुझे डर था।
TI-84 + 96x64 ब्लैक एंड व्हाइट स्क्रीन के साथ एक प्रोग्राम करने योग्य रेखांकन कैलकुलेटर है। "बोलता है और समझता है" गणितीय संकेतन (लाइन पर एक तर्क के रूप में, एक वर्ग के रूप में भिन्नताएं, रेखा के नीचे एक तर्क के साथ और इसी तरह):
![](https://habrastorage.org/files/e50/6ca/6fc/e506ca6fc60f4137b7db09ba82ee836c.gif)
यह उपयोगी गणितीय टुकड़ों का एक गुच्छा जानता है, लेकिन इसकी प्रोग्रामबिलिटी हब्र के दृष्टिकोण से अधिक दिलचस्प है।
प्रोग्रामिंग
TI-84 + को "आउट ऑफ द बॉक्स" या तो TI BASIC या मशीन कोड में प्रोग्राम किया जा सकता है। टीआई बेसिक - बेसिक बोली। यह एक "संरचनात्मक" है, न कि "पास्ता" बोली। कीवर्ड के बजाय, टोकन (मेरी राय में, कुछ ऐसा ही स्पेक्ट्रम में था)। यह गणितीय कार्यों के लिए अनुकूलित है, खेल और अन्य अनुप्रयोगों के लिए यह स्वयं के लिए उपयुक्त है, हालांकि निश्चित रूप से आप कुशलता से कुछ भी लिख सकते हैं। माइनस की, यह बहुत धीमी है, क्योंकि व्याख्या के अलावा, सभी गणित चल बिन्दु हैं। लाभों में से - कार्यक्रम बहुत कम जगह लेते हैं।
एक और संभावना मशीन कोड है। आमतौर पर कंप्यूटर पर कोडांतरक द्वारा इकट्ठा किया जाता है। तदनुसार, कार्यक्रमों को परिमाण के कई आदेश तेजी से प्राप्त होते हैं और संबंधित बुनियादी कार्यक्रम की तुलना में दो गुना अधिक होते हैं। वे कैलकुलेटर को भी मार सकते हैं।
उत्साही लोगों ने TI-84 + को प्रोग्राम करने के लिए अन्य तरीके बनाए हैं। शायद सबसे महत्वपूर्ण है AX। यह गणनाकर्ताओं के लिए C का एक एनालॉग है: बेसिक जैसी सिंटैक्स वाली भाषा जो मशीन कोड में अनुवाद करती है। किसी प्रोग्राम को लिखने और संकलित करने के लिए कंप्यूटर की आवश्यकता नहीं होती है (हालांकि एक कैलकुलेटर पर एक बड़ा कार्यक्रम लिखना एक शौकिया आनंद है)। सोलह-बिट अंकगणित का उपयोग करता है, जो निश्चित रूप से देशी आठ-बिट की तुलना में धीमा है।
TI-84 + के लिए कार्यक्रम
यहां कार्यक्रमों का एक समूह है, जिसमें उपयोगी और गेमिंग दोनों हैं। इसके अलावा, टीआई की आधिकारिक वेबसाइट पर कई उपयोगी कार्यक्रम हैं। बॉक्स से बाहर कैलकुलेटर पर, मेमोरी भरी हुई है, लेकिन मानक वितरण में अधिकांश प्रोग्राम बेकार हैं, आप उन्हें सुरक्षित रूप से हटा सकते हैं।
स्मृति के संगठन के बारे में कुछ शब्द: कैलकुलेटर में रैम और फ्लैश (पुरालेख टीआई शब्दावली में) है। दोनों एक तरह के फाइल सिस्टम में व्यवस्थित हैं। प्रोग्राम और डेटा को रैम और फ्लैश दोनों में स्टोर किया जा सकता है। FLASH धीमा है लेकिन बड़ा है। "प्रोग्राम" और डेटा के अलावा, "एप्लिकेशन" को FLASH में संग्रहीत किया जाता है - वे "प्रोग्राम" से अलग होते हैं, जो कि वे FLASH मेमोरी के पृष्ठों पर वितरित किए जाते हैं और प्रोसेसर से अधिक मेमोरी ले सकते हैं।
कैलकुलेटर पर होने के लिए एक उपयोगी चीज एक खोल, एक पुस्तकालय, एक द्विआधारी लोडर, और एक ग्राफिकल इंटरफ़ेस युक्त अनुप्रयोग है। व्यक्तिगत रूप से, मैं दरवाजे सीएस का उपयोग करता हूं। इसका लाभ यह है कि इसमें सभी लोकप्रिय गोले के पुस्तकालय हैं, और माइनस बड़ा है। डोर्स सीएस के रचनाकारों ने इंटरफ़ेस को विंडोज की तरह बनाने की कोशिश की, जिसके लिए TI-84 + अच्छी तरह से काम नहीं करता है, मेरी राय में। हालांकि, डोर सीएस जीयूआई का उपयोग करना आवश्यक नहीं है, यह स्वचालित रूप से ओएस में एकीकृत होता है।
TI-84 + के लिए कुछ रोचक कार्यक्रम:
- उसके बारे में पोर्टल हैबर पर एक पोस्ट था।
- आवर्त सारणी एक उपयोगी चीज है।
- छोटा पक्षी। वह एक
AX रोबोट
पक्षी का पीछा करने और पोर्टल के माध्यम से कूदने के बाद, मैंने खुद कुछ लिखने का फैसला किया। मैंने टास्क को भाषा के रूप में चुना, और टास्क के रूप में रोबोट के बीएसडी को। यह अनाड़ी निकला: अधिकांश मेमोरी पर सरणियों का कब्जा है। लेकिन इसे और अधिक कॉम्पैक्ट कैसे बनाया जाए, मैं कभी नहीं आया।
कार्यक्रम में पांच "भाग" शामिल हैं: आरंभीकरण, प्रतिपादन, एक नया स्तर बनाना, रोबोटों की "खुफिया" और मुख्य चक्र। मूल से अंतर: खेल मैदान 23x15 (प्रत्येक स्प्राइट 4x4 + बॉर्डर है), खेल मैदान में कमी के कारण कम रोबोट, कोई स्कोरिंग नहीं।
प्रारंभ
छिपा हुआ पाठ
.ROBOTS .IMAGES .EMPTY .ROBOT .JUNK .PLAYER .STONE .STONE [000000000000000020702000000000007070700000000000702070000000000020707000000000002070700000000000]->Pic1 .FIELD Buff(23*15)->Str1 Buff(23*15)->Str2 Buff(23*15)->Str3 1->L
यहां सब कुछ सरल है। पहले प्रोग्राम के नाम के साथ हेडर आता है, फिर स्प्रैक्स के साथ एक हेक्साडेसिमल स्ट्रिंग। AX 8x8 स्प्राइट का समर्थन करता है, जबकि मेरे पास 4x4 स्प्राइट हैं, इसलिए इनमें से अधिकांश स्टॉक शून्य हैं। इसके अलावा, मैंने "खाली" स्प्राइट का इस्तेमाल किया और प्रतिपादन को सरल बनाने के लिए कब्र के साथ स्प्राइट को दो बार दोहराया।
इसके बाद, खेल क्षेत्र के साथ सरणियों को आरंभीकृत किया जाता है। Str1 - मुख्य खेल मैदान, Str2 - सहायक, Str3 - खिलाड़ी की त्रुटियों को रोकने के लिए पुराने खेल मैदान की एक प्रति। चर एल - स्तर।
AX (और TI-BASIC) के विशेष सिंटैक्स पर ध्यान दें: असाइनमेंट दाएं से बाएं होता है।
एक नया स्तर बनाएं
छिपा हुआ पाठ
Lbl NEWLVL Fill(Str1,15*23,0) L*5->R For(R) rand^15->I rand^23->J I*23+J+Str1->P 1->{P} End rand^23->X rand^15->Y 3->{Y*23+X+Str1} Return
सबसे पहले, खेल का मैदान शून्य पर रीसेट किया जाता है, फिर उस पर रोबोट रखे जाते हैं (अंक 1)। मूल में, प्रत्येक स्तर पर दस रोबोट दिखाई दिए, मेरे पास एक छोटा खेल मैदान है, इसलिए मैंने पांच चुने। ओवरले के कारण एल * 5 से कम रोबोट हो सकते हैं, मैंने इसे एक फिच पर विचार करने का फैसला किया। फिर खिलाड़ी की स्थिति का चयन किया जाता है (अंक 3 का अंकुर), फिर से: मूल के विपरीत, जहां आप शून्य चाल पर मर सकते हैं, मेरा खिलाड़ी रोबोट को "मारता है" यदि यह खेल की शुरुआत में उस पर लैंड करता है।
ड्राइंग
छिपा हुआ पाठ
Lbl DRAW ClrDraw VLine(0,0,62) VLine(94,0,62) HLine(0,0,94) HLine(62,0,94) For(I,0,22) For(J,0,14) Pt-On(I*4+1,J*4+2,{J*23+I+Str1}*8+Pic1) End:End DispGraph Return
यहाँ, फिर से, सब कुछ सरल है। शायद यह कहने लायक है कि बृहदान्त्र ऑपरेटरों का एक विभाजक है, और Pt-On एक स्प्राइट ड्राइंग है। लाब्ले - टैग, लाबेल से। AX घुंघराले ब्रेसिज़ दिए गए पते पर एक बाइट का मूल्य है।
रोबोट का आंदोलन
छिपा हुआ पाठ
Lbl STEP 0->R Fill(Str2,23*15,0) For(I,0,22):For(J,0,14) J*23+I->A {A+Str1}->B If B=2 2->{A+Str2}:End If B=1: R+1->R (J+SIGN(J,Y))*23+I+SIGN(I,X)+Str2->A {A}+({A}<2)->{A} End End:End Copy(Str2,Str1,23*15) Y*23+X+Str1->A {A}+3->{A} Return Lbl SIGN ([r1]<[r2])-([r1]>[r2]) Return
यहां गंदे हैक शुरू हो जाते हैं। कार्यक्रम खेल मैदान को स्कैन करता है, रोबोट की तलाश करता है, और उन्हें खिलाड़ी की ओर ले जाता है। AX में तुलनात्मक संचालन एक लौटता है, इसलिए {A} + ({A} <2) -> {A} A और अगर A केवल दो से कम है तो वेतन वृद्धि। फिर खिलाड़ी की स्थिति को चिह्नित किया जाता है।
मुख्य चक्र
छिपा हुआ पाठ
While 1 0->G NEWLVL() DRAW() While R>0 X->M:Y->N Copy(Str1,Str3,23*15) If G<200 getKey^^r->G ReturnIf G=9 G^100->K End If K=47 rand^23->X rand^15->Y STEP() DRAW() If {A}!=3 getKey^^r:Return End Else (K=51)+(K=48)+(K=45)-(K=49)-(K=46)-(K=43)->I ((K>=43) and (K<=45))-((K>=49) and (K<=51))->J If ((J+Y)<15) and ((J+Y)>=0) and ((I+X)<23) and ((I+X)>=0) X+I->X:Y+J->Y Else:0->G End STEP() If {A}!=3 M->X:N->Y Copy(Str3,Str1,23*15) 0->G End End
वास्तव में, आप कोड की गुणवत्ता में गिरावट का निरीक्षण कर सकते हैं: मुझे तीन बार मुख्य चक्र को फिर से लिखना पड़ा (TI-84 के लिए कमांड "बैकअप करें" पहले से कहीं अधिक प्रासंगिक है), और अंत में मैं थक गया। नतीजा वही हुआ जो हुआ।
स्पष्टीकरण:
R खेल मैदान पर रोबोट की संख्या है। यदि अधिक रोबोट नहीं हैं, तो स्तर पारित हो गया है।
getKey ^ ^ r एक कीस्ट्रोक की प्रतीक्षा करता है, फिर एक स्कैन कोड देता है। अपनी आपराधिक योजना को साकार करते हुए, मैंने इस तथ्य का उपयोग किया कि 2 मोडिफायर संख्या कुंजियों के स्कैन कोड में एक सौ जोड़ता है। इस प्रकार, एक नई कुंजी नहीं पढ़ी जाती है यदि 2 को दबाया गया है - इस तरह से पुनरावृत्ति का एहसास होता है। सही स्कैन कोड को चर G में संग्रहीत किया जाता है, और यदि G 200 से अधिक है, तो नया कमांड पढ़ा नहीं जाता है।
स्कैन कोड 147 - कुंजी "5"। खेल में, यह एक टेलीपोर्टेशन टीम है। टेलीपोर्टेशन एकमात्र ऐसा कदम है जिस पर खेल समाप्त हो सकता है, इसलिए इसे अलग से संसाधित किया जाता है।
स्कैन कोड 43 ... 45, 49 ... 51, 46 और 48 संख्यात्मक कुंजी हैं, खिलाड़ी उन पर चलता है। चलते समय आप एक खिलाड़ी को नहीं मार सकते हैं, इसलिए खेल की स्थिति को स्थानांतरित होने तक बचाया जाता है और बहाल किया जाता है यदि खिलाड़ी किसी से सामना करता है। इस स्थिति में, जी रीसेट है।
यह सब कैसे दिखता है:
छिपा हुआ पाठ
.ROBOTS .IMAGES .EMPTY .ROBOT .JUNK .PLAYER .STONE .STONE [000000000000000020702000000000007070700000000000702070000000000020707000000000002070700000000000]->Pic1 .FIELD Buff(23*15)->Str1 Buff(23*15)->Str2 Buff(23*15)->Str3 1->L While 1 0->G NEWLVL() DRAW() While R>0 X->M:Y->N Copy(Str1,Str3,23*15) If G<200 getKey^^r->G ReturnIf G=9 G^100->K End If K=47 rand^23->X rand^15->Y STEP() DRAW() If {A}!=3 getKey^^r:Return End Else (K=51)+(K=48)+(K=45)-(K=49)-(K=46)-(K=43)->I ((K>=43) and (K<=45))-((K>=49) and (K<=51))->J If ((J+Y)<15) and ((J+Y)>=0) and ((I+X)<23) and ((I+X)>=0) X+I->X:Y+J->Y Else:0->G End STEP() If {A}!=3 M->X:N->Y Copy(Str3,Str1,23*15) 0->G End End DRAW() End L+1->L End Return Lbl DRAW ClrDraw VLine(0,0,62) VLine(94,0,62) HLine(0,0,94) HLine(62,0,94) For(I,0,22) For(J,0,14) Pt-On(I*4+1,J*4+2,{J*23+I+Str1}*8+Pic1) End:End DispGraph Return Lbl NEWLVL Fill(Str1,15*23,0) L*5->R For(R) rand^15->I rand^23->J I*23+J+Str1->P 1->{P} End rand^23->X rand^15->Y 3->{Y*23+X+Str1} Return Lbl STEP 0->R Fill(Str2,23*15,0) For(I,0,22):For(J,0,14) J*23+I->A {A+Str1}->B If B=2 2->{A+Str2}:End If B=1: R+1->R (J+SIGN(J,Y))*23+I+SIGN(I,X)+Str2->A {A}+({A}<2)->{A} End End:End Copy(Str2,Str1,23*15) Y*23+X+Str1->A {A}+3->{A} Return Lbl SIGN ([r1]<[r2])-([r1]>[r2]) Return
आपका ध्यान के लिए धन्यवाद!
संदर्भ:
खासकर पढ़ने वालों के लिए:
![](https://habrastorage.org/getpro/habr/post_images/aff/083/395/aff0833956dc046a7d2f5879313c282e.png)