4

私は vim の学習を開始し、1978 年の古典的な Space Invaders に似たゲームを bash でシェル スクリプト作成し始めました。私はASCIIアートに比較的慣れていないので、宇宙船などのコンテンツをプログラムで定義するか、ファイルからキャラクターのコンテンツを読み取る方が良いか知りたいですか? もしそうなら、あなたは何を推奨し、どのようにプログラムで解決しますか?

#!/bin/bash

function getShip() { 
declare -r FILENAME=/Users/demetriusford/space_ship

for index in $FILENAME; do
  cat $index
done
}

ファイルの内部:

   *   /\   *
   !__/()\__!
   /==:  :==\
     (/\/\)
4

2 に答える 2

2

2013 年の「プログラミング言語とプログラムの史上最悪の不一致」賞を受賞する可能性があるにもかかわらず、x86 で記述された会計パッケージ、COBOL ベースのオペレーティング システム、または Pascal で記述されたものなどの候補に立ち向かいます:-) 、bash スクリプトで直接その形状をコーディングする方が簡単であることがわかるでしょう。

形状をコード自体から分離する差し迫った必要性はないようです。


tput手始めに、(curses と terminfo データベース) を使用して、ウィンドウの下部に沿って船をアニメーション化する小さなスクリプトを次に示します。

正確World of Warcraftではありませんが、良い出発点になるはずです。最初に、決して変わらないもの、出荷と弾丸の文字列、およびさまざまな画面座標のものを設定します。

#!/bin/bash

bull1=' *        * '
bull2='            '

ship1=' ^   /\   ^ '
ship2=' !__/()\__! '
ship3=' /==:  :==\ '
ship4='   (/\/\)   '

tput clear
((line1 = $(tput lines) - 6))
((line2 = line1 + 1))
((line3 = line2 + 1))
((line4 = line3 + 1))

((maxcol = $(tput cols) - 15))

次に、関連する変数を初期化し、無限ループに入ります。

((bullline = 1))
((bullcol = 1))
((curcol = 1))
((coldir = 1))
while true ; do

ループ内では、以前の値を空白にして新しい値を書き込むことで、スプライトを移動するだけです。箇条書きの位置もこのセクションで更新されます。とにかく端の文字を空白にするスペースで囲まれているため、船を明示的に空白にする必要はないことに注意してください。

    tput cup $bullline $bullcol ; echo "$bull2"
    if [[ $bullline -le 2 ]] ; then
        ((bullline = line1 - 1))
        ((bullcol = curcol))
    else
        ((bullline = bullline - 2))
    fi
    tput cup $bullline $bullcol ; echo "$bull1"

    tput cup $line1 $curcol ; echo "$ship1"
    tput cup $line2 $curcol ; echo "$ship2"
    tput cup $line3 $curcol ; echo "$ship3"
    tput cup $line4 $curcol ; echo "$ship4"

次に、船が左右に動くように変数を更新し、最後にアニメーションがスムーズになるように少し遅延させます。

    ((curcol = curcol + coldir))
    if [[ $curcol -eq $maxcol ]] ; then
        ((coldir = -coldir))
    else
        if [[ $curcol -eq 1 ]] ; then
            ((coldir = -coldir))
        fi
    fi
    sleep 0.1
done

最終的に得られるのは、プラットフォームの制限を考えると、耐えられるように見えるアニメーションです。

      * *

        ^ /\ ^
        !__/()\__!
        /==: :==\
          (/\/\)
于 2012-12-02T22:15:26.160 に答える