1. 程式人生 > 實用技巧 >Typescript 裝飾者模式(Decorator)

Typescript 裝飾者模式(Decorator)

此部落格連結:

1.分析

1.1貪吃蛇遊戲規則

要求蛇頭吃小球,每吃一個小球后,蛇身就變長一點,當蛇頭碰到蛇身時,遊戲結束。

1.2分析

根據作業要求,蛇能轉換方向,自動前進,碰撞檢測,隨機障礙。 這裡的每個要求都可以細分為小的任務,大的方向可以按照顯示蛇,自動前進,轉換方向,碰撞檢測,隨機障礙的順序進行程式設計。

2.設計

2.1技術原型

  1. 先在螢幕能夠顯示一個符號。
  2. 控制單個符號移動。
  3. 增加符號長度。
  4. 控制多個符號移動,後面的符號跟著前面的符號移動。

2.2需求實現

  1. 以#代表邊界。使用雙重迴圈判斷邊界條件,在邊界顯示牆。
  2. 以@代表蛇頭,+代表蛇的身體。以*代表豆子。
  3. 使用w,s,a,d,按鍵控制上下左右四個方向移動蛇。
  4. 移動蛇身,先移動頭部,在移動身體,這裡需要注意不是整體移動,是需要一個動態移動。
  5. 檢測蛇能移動的邊界。
  6. 檢測蛇吃到豆子。
  7. 當蛇吃到豆子後,蛇身增長。

3關鍵技術

3.1蛇身和蛇頭移動

3.1.1說明

當蛇頭移動時,蛇身應該隨著蛇頭的移動而移動,這裡是把第一節蛇身移動到蛇頭的位置,把蛇身的第二節移動到蛇身的第一節,依次類 推, 就感覺蛇身在隨著蛇頭的移動而移動。

3.1.2程式碼

        for(k=len;k>1;k--)
	{
		snick[k][0]=snick[k-1][0];
		snick[k][1]=snick[k-1][1];
	}

3.2顯示蛇身

3.2.1說明

顯示蛇身時,需要判斷蛇頭是朝那個方向移動的,因為蛇向左移動時,需要先顯示蛇的最後一節尾巴;蛇向右移動時,需要先顯示蛇的第一節尾巴,還需要注意在顯示完蛇身後,需要把橫座標加一。

3.2.2程式碼

	          if(der=='r'){
		    	for(k=len+1;k>=1;k--){              
			       if((snick[k][0]==j)&&(snick[k][1]==i))
			       {
                                         printf("*");
					 j++;
			       }
			}
		   }
		   else	if(der=='l')
		   {
			    for(k=1;k<len+1;k++){              
			        if((snick[k][0]==j)&&(snick[k][1]==i))
				{
                                         printf("*");
					 j++;
				}
			    }
		  }
		   else 
		   {
			   for(k=1;k<len+1;k++){              
			        if((snick[k][0]==j)&&(snick[k][1]==i))
				{
                                         printf("*");
					 j++;
				}
			   }
		   }

4.測試及除錯程式碼

4.1測試1

說明

顯示邊框時,邊框和符號在同一行的位置,邊框會超出邊界顯示。

動圖

除錯

經過除錯,發現在輸出身體時,沒有把橫座標向前移動一個位置,導致後面不滿足條件時,就輸出一個空格,所有有幾個身體就會多輸出幾個空格。

4.2測試2

說明

一開始我單純使用的空格和換行顯示的蛇頭,在顯示身體時,遍歷身體的長度,然後顯示身體,但是這裡有二個問題,當改變蛇頭位置時,身體會整體跟著蛇頭變,並沒有先頭動,身體沿著蛇頭經過的路徑運動。

修改

一開始想著把蛇身的座標存到一個二維陣列中,然後把蛇頭的座標賦值給陣列中第一個數,當蛇移動時,依次把前面的值賦值給後面,就可以看起來效果是蛇移動一樣。

設計

技術原型

  1. 用二維陣列顯示多個字元。下圖問題
  2. 控制字元移動。這裡有問題,解釋如問題3所示。
  3. 增加字元長度。

忘記輸出空格時判斷。

需求

  1. 顯示一個蛇頭,一個蛇身,邊框。
  2. 移動蛇頭和蛇身,通過按鍵控制蛇頭移動,然後把前面蛇身的值賦值給後面的蛇身,但是這需要注意兩點,1)先把蛇頭的位置記錄下來,2)蛇身向前移動時,要先移動身體,在把蛇頭的值賦值給第一個蛇身,要不第一個蛇身的值會被蛇頭覆蓋,蛇身會少一節。
  3. 蛇吃到一個豆子後,蛇身增加一節。
  4. 使蛇自動移動。
  5. 判斷遊戲結束。

4.3測試3

說明

使用按鍵移動蛇

測試

按鍵測試,使用按鍵,使字元移動。但是字元只能每次移動兩個位置,而且按任意鍵都能移動。

修改

最後發現是把判斷輸入的是哪個按鍵語句寫成了賦值語句。

4.4測試4

說明

移動蛇身體時,發現當蛇向下移動時,蛇身體會少一個。

除錯

發現是顯示蛇身體時,是從頭後面第一個身體開始遍歷顯示的,當蛇向左移動時,在遍歷身體中,找到蛇身第一節時,就顯示了,但是蛇身後面的幾節就顯示不了。

修改

給蛇左右移動時,新增方向判斷,如果是向左移動,則從蛇的最後一節身體開始遍歷,如果蛇向右移動,則從蛇頭後的第一節蛇身開始遍歷。

4.5測試

說明

蛇自動移動。

除錯

  1. 蛇是斜著移動的。

修改

當蛇自動移動時,把向左移動和向右移動的橫座標寫成了縱座標改變。

5.psp