TI-84 +



私の次のコントロールで特定の数の計算エラーを発見した物理学の先生は、生の偉大なロシア語への無料翻訳では次のように聞こえるであろう非常に丁寧なフレーズをいくつか言いました。

そのため、次回は通常のグラフ計算機がありました!


最寄りの書店への襲撃の結果(地区にはこれ以上関連するものはありませんでした)、 TI-84 Plusが買収されました。 すべてのコントロールが作成された後、疑問が生じました。実際、この獣は何ができるのでしょうか? グーグルで調べたところ、TI-84 Plusは貴重な平方根抽出器であるだけでなく、



カットの下に、電卓の小さなレビューと、私の執筆のかなり不器用な「ロボット」ゲームがあります。 ヌードのファンには事前に謝罪します-電卓を分解できず、恐れていました。



TI-84 +は、96x64の白黒画面を備えたプログラム可能なグラフ計算機です。 数学的表記(「a overb」の部分、線の下に引数がある平方根など)を「話し、理解する」:



多数の有用な数学的部分を知っていますが、そのプログラム可能性はHabrの観点からより興味深いです。



プログラミング





TI-84 +は、TI BASICまたはマシンコードのいずれかで「そのまま」プログラムできます。 TI BASIC-BASICa方言。 これは「構造的」であり、「パスタ」方言ではありません。 キーワードの代わりに、トークン(私の意見では、そのようなものはSpectrumにありました)。 数学的な操作、ゲーム、その他のアプリケーション向けに最適化されていますが、もちろん何でも巧みに書くことができます。 マイナスでは、解釈に加えて、すべての数学が浮動小数点であるため、非常に遅くなります。 利点-プログラムが占めるスペースはごくわずかです。



別の可能性はマシンコードです。 通常、コンピューターのアセンブラーによって組み立てられます。 したがって、プログラムは、対応する基本プログラムよりも数桁速く、2倍速く取得されます。 彼らは電卓を殺すこともできます。



愛好家は、TI-84 +をプログラムする他の方法を作成しました。 おそらく最も重要なのはAXです。 これは、計算機用のCの類似物です。マシンコードに変換されるBasicに似た構文を持つ言語です。 プログラムを作成してコンパイルするためにコンピューターを必要としません(ただし、電卓で大きなプログラムを作成するのはアマチュアの喜びです)。 もちろん16ビットの算術演算を使用しますが、これはもちろんネイティブの8ビットよりも低速です。



TI-84 +向けのプログラム





ここには、多数のプログラムを備えたアーカイブがあります-便利でゲーム用です。 また、TIの公式 Webサイトには、多くの便利なプログラムがあります。 箱から出してすぐに使える電卓では、メモリはいっぱいですが、標準の配信のほとんどのプログラムは役に立たないので、安全に削除できます。



メモリの構成に関するいくつかの言葉:計算機にはRAMとFLASH(TIの用語ではアーカイブ)があります。 どちらも一種のファイルシステムで構成されています。 プログラムとデータは、RAMとフラッシュの両方に保存できます。 フラッシュは遅くなりますが、大きくなります。 「プログラム」とデータに加えて、「アプリケーション」はFLASHに保存されます。「プログラム」とは異なり、FLASHメモリのページに分散され、プロセッサが対応できる以上のメモリを占有できます。



電卓で役立つのは、シェル、ライブラリを含むアプリケーション、バイナリローダー、およびグラフィカルインターフェイスです。 個人的には、 Doors CSを使用しています。 その利点は、人気のあるすべてのシェルのライブラリが含まれていることと、マイナスが大きいことです。 Doors CSの作成者は、私の意見では、インターフェイスをWindowsのように見せようとしましたが、TI-84 +はうまく機能しません。 ただし、Door CS GUIを使用する必要はなく、OSに自動的に統合されます。



TI-84 +の興味深いプログラム:







AXロボット





鳥を追いかけ、ポータルを飛び越えて、自分で何かを書くことにしました。 言語としてAXを選択し、タスクとしてロボットのBSDを選択しました。 ぎこちなく判明しました:メモリのほとんどが配列で占められています。 しかし、それをもっとコンパクトにする方法は、私は思いつきませんでした。



プログラムは、初期化、レンダリング、新しいレベルの作成、ロボットの「知能」、およびメインサイクルの5つの「パーツ」で構成されています。 オリジナルとの違い:競技場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
      
      







ここではすべてが簡単です。 最初にプログラムの名前のヘッダーがあり、次にスプライトのある16進数の文字列があります。 AXは8x8スプライトをサポートしていますが、私は4x4スプライトを持っているので、これらのストックのほとんどはゼロです。 また、レンダリングを簡素化するために、「空の」スプライトを使用し、墓でスプライトを2回繰り返しました。



次に、ゲームフィールドを持つ配列が初期化されます。 Str1-メインの競技場、Str2-補助、Str3-プレイヤーのエラーを防ぐための古い競技場のコピー。 変数L-レベル。



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)。 オリジナルでは、各レベルに10台のロボットが登場しました。私は競技場が小さいので、5台を選びました。 オーバーレイのためにL * 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はスプライトの描画であると言う価値があります。 Lbl-タグ、LaBeLから。 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の比較演算は1を返すため、{A} +({A} <2)-> {A}は、Aが2未満の場合にのみ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
      
      







実際、コードの品質の低下を確認できます。メインサイクルを3回書き直さなければならず(TI-84 +の「バックアップを行う」コマンドはこれまで以上に関連性があります)、最終的に疲れました。 結果は何が起こったかです。



説明:



Rは競技場のロボットの数です。 ロボットがこれ以上ない場合、レベルは合格です。



getKey ^^ rはキーストロークを待機してから、スキャンコードを返します。 私の犯罪計画を実現するために、私は第2修飾子が数字キーのスキャンコードに100を追加するという事実を使用しました。 したがって、2番目のキーが押された場合、新しいキーは読み取られません-このようにして、繰り返しが実現されます。 真のスキャンコードは変数Gに格納され、Gが200より大きい場合、新しいコマンドは読み込まれません。



コード147-キー「5」をスキャンします。 ゲームでは、これはテレポーテーションチームです。 テレポーテーションはゲームを終了できる唯一の動きなので、個別に処理されます。



スキャンコード43 ... 45、49 ... 51、46、および48は数字キーであり、プレーヤーはそれらを移動します。 移動中にプレイヤーを殺すことはできないため、ゲームの状態は移動するまで保存され、プレイヤーが誰かに遭遇した場合は復元されます。 この場合、Gはリセットされます。



すべての組み立て方法:




非表示のテキスト
 .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
      
      







ご清聴ありがとうございました!




参照:







特に読む人のために:







All Articles