網站頁面
課程
成員
一般
主題 1
主題 2
主題 3
主題 4
主題 5
主題 6
主題 7
主題 8
主題 9
主題 10
主題 11
主題 12
主題 13
主題 14
主題 15
黑視窗文字動畫—笨笨蛇
基本題:乒乓運動(100%)
有一條蛇,蛇身分成了L段(L自行輸入),它騷包得很,每段的蛇皮上依照英文字母順序刺了青(字母不重複出現),有一天不小心被關到了一個寬75長23的框框中,框框的邊也是到處用隨機的方式以蛇身上的英文字母塗了鴉。此時,被困的笨笨蛇緊張得要命,四處想找洞鑽出來,於是就在框框中到處亂爬,因為它不聰明,所以每當蛇頭碰到框框的邊時,就開始轉向,也就是說,如果把它身體每段的運動速度分成x軸方向(x_vel)和y軸方向(y_vel),則當碰到上或下邊時就必須
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];
在這個陣列上在正確位置填入框邊字元和蛇身刺青,如下圖:
另外,動畫迴圈大概可以如此設計
time_step = 0;
stop = false;
while (!stop)
{
move_snakebodies();
refresh_screen();
if (snake.empty())
stop = true;
time_step ++;
}
註:同學可利用你熟習的任何C++或C指令來完成此作業。建議可使用STL,會蠻方便的。
開始日期: | 2009年 05月 23日(六.) 12:15 |
截止日期: | 2009年 06月 7日(日.) 12:00 |