黑視窗文字動畫—笨笨蛇

基本題:乒乓運動(100%)

有一條蛇,蛇身分成了L段(L自行輸入),它騷包得很,每段的蛇皮上依照英文字母順序刺了青(字母不重複出現),有一天不小心被關到了一個寬75長23的框框中,框框的邊也是到處用隨機的方式以蛇身上的英文字母塗了鴉。此時,被困的笨笨蛇緊張得要命,四處想找洞鑽出來,於是就在框框中到處亂爬,因為它不聰明,所以每當蛇頭碰到框框的邊時,就開始轉向,也就是說,如果把它身體每段的運動速度分成x軸方向(x_vel\in\{+1,-1\})和y軸方向(y_vel\in\{+1,-1\}),則當碰到上或下邊時就必須

y_vel = -y_vel;

而當碰到左或右邊時就必須

x_vel = -x_vel;

根據物理學中的運動模型,如果蛇的某段身體原來的位置是在(old_x, old_y),則下一個時間點這段身體的位置應該變成(new_x,new_y),其中

new_x = old_x + x_vel;

new_y = new_y + y_vel;

請各位同學發揮你們的思考力來想想看,要如何模擬這條笨笨蛇在框中的爬行?爬行時,如果蛇頭碰到框邊,請把碰撞到框邊上的英文字母顯示出來哦!

進階題:超時空傳送器(30%)

可能有些同學仍然覺得不過癮吧!如果想接受挑戰,就來吧!

有人發明了一個超時空傳送器來幫笨笨蛇脫困,當蛇頭碰到框邊時,該傳送器就會根據蛇頭撞擊框邊上的英文字,把蛇體上有該英文字母的那一段傳送走,而在那一段之後的蛇段則自動往前遞補。利用這種傳送方式,請同學模擬一下,看看這條笨笨蛇有沒有機會逐漸自框中全部被傳送出去?

 

提示:

可將蛇段宣告成

class SnakeBody {
public:
   SnakeBody (int x_vel, int y_vel, int xpos, int ypos, char s)
   {
      if (abs(x_vel)<=1&& abs(y_vel)<=1&& xpos>=0 && xpos<W && ypos>=0 && ypos<W)
      {
          x_velocity = x_vel;
          y_velocity = y_vel;
          x = xpos;
          y = ypos;
          tattoo = s;
      }
   }
   SnakeBody (){}
   char tattoo;
   int x_velocity;
   int y_velocity;
   int x;
   int y;
};

所以一條笨笨蛇就可以用STL容器來實作了。例如:

vector<SnakeBody> snake;

而動畫輸出可以用一個二維字元陣列來實做,例如:

char Screen[23][75];

在這個陣列上在正確位置填入框邊字元和蛇身刺青,如下圖:

snake

另外,動畫迴圈大概可以如此設計

  time_step = 0;
  stop = false;

  while (!stop)
  {
     move_snakebodies();
     refresh_screen();
     if (snake.empty())
        stop = true;
     time_step ++;

  }

註:同學可利用你熟習的任何C++或C指令來完成此作業。建議可使用STL,會蠻方便的。

Available from: Saturday, 23 May 2009, 12:15 PM
Due date: Sunday, 7 June 2009, 12:00 PM