2007年11月4日 星期日

8 Puzzle Game finished


 
 
【心得】

既然已經得到讓 Image 移動的方法,就可以把這個遊戲弄出來了!!
其實是因為根本就不知道作業要做到怎麼樣的程度,所以就一直寫下去
然後就...
 
其實程式碼本身很粗糙,而且沒有寫演算法就在 coding
所以有次在測試的時候,run 出來的結果跟我想要的差了十萬八千里 囧rz
 
總的來說,會覺得程式不好寫只是因為對 BCB 不熟
工具列、元件、函式、Windows API 都不知道有哪些
網路上跟 BCB 有關的教學又是少之又少 ="=
 
【Coding 實記】
1.
其實首先要解決的問題是,我的 8 puzzle 讀取的時候會缺左中和左下的圖
情況就跟 Shun 的一樣 ※連結過去
 
一開始我以為是讀取時座標的問題,可是怎麼算都對,所以我也不知所以然
就在程式裡面動點手腳才把星座圖九宮格弄出來 (偷吃步 XD)
 
重新從 for loop 計算後,
才發現少放了一行 rtOI = Rect(x,y,x+92,y+92)
所以左中和左下的圖才會沒有顯示出來
 
2.
確定九個小圖都可以讀出來後,先想到的是 8 puzzle 擺放的位置
一開始我是打算讓 Image 隨機讀取 8 個區塊
可是這樣做除了 CopyRect 要怎麼放 Image Title 的 (x,y) 很麻煩之外
在後面的程式裡,也不好紀錄 Image 移動後的位置
 
要改用別的方法,
一樣是讓 Image 照順序讀取 8 個區塊,然後讓 Image 隨機擺放
因為要紀錄 Image 的位置,所以我用了一個 LO[9] 的 int array ,
紀錄 Image 在 8 puzzle 的位置 0~8
 
以上圖來說 LO 的內容是這樣的 { 7 , 0 , 6 , 4 , 3 , 2 , 5 , 8 }
(搭配下一張圖看比較好懂)
這是表示 Image1 現在在 7 的位置,Image2 在 0 的位置,
其他依此類推
 
3.
因為要隨機擺放 Image ,用 (x,y) 座標來更動 Image 的 Top 和 Left 會比較好
所以再設一個 int array xyLO[9][2],用來紀錄 LO的 (x,y) 座標
上面的數字是 LO,下面的是 xyLO
以下的文章內容都會用 LO 表示 Image 所在的位置
LO[1] 這樣是表示 array 內的內容
所以我用 LO 1 來表示圖中 1 的位置 ( 上中 )
其他依此類推
再用 for loop 去跑
 /* 重設 image 位置 */
 int iX=328; // Image1 的 Left
 int iY=40; // Image1 的 Top
 int k=0;
 for(int i=0;i<3;i++)
 {
  for(int j=0;j<3;j++)
  {
   BMP[k]->Top = iY+xyLO[k][0]*96; // Image 的大小是 92*92
   BMP[k]->Left = iX+xyLO[k][1]*96; // 再加上間隔距離所以是 96
   k++;
  }
 }
 
當初就是這個部份沒有分清楚,
所以在測試的時候才會發生 Image 通通跑錯位置的烏龍
害我百思不得其解
 
4.
圖片的隨機放置完成後,再來是圖片的移動
這邊要考慮到的有
A.只有正中央 LO 4 的 Image 可以做四個方向的移動,
 其他的 Image 可以移動的方向都有限制
 比如 LO 0 ,只能做往右和往下的移動
B.要判斷 Image 9 是不是在被點擊的 Image 旁邊
 比如 當我點 LO 7 的時候,要去找 Image9 有沒有在 LO 4、6、8 三個位置
C.找到 Image9 在被點擊圖片的旁邊後,要怎麼去做 Image 的互換
 
solve A:
我只想到用 switch 配上 if ,來做判斷
 switch(i)
 {
  case 0:
   { ... } break;
  case 1:
   { ... } break;
  ...
  ...
  case 8:
   { ... } break;
 }
 
solve B:
我用在 switch 裡的 if ,針對 Image9 的 Top 和 Left 屬性做判斷
ex:
 case 2: // 被點擊的 Image 在 LO 2
 {
  // 判斷 Image9 在 LO 1
  if(BMP[8]->Top==40 && BMP[8]->Left==424)
  { ... }
  // 判斷 Image9 在 LO 5
  else if(BMP[8]->Top==136 && BMP[8]->Left==520)
  { ... }
 }
 
solve C:
直接去更動 Image(i) 和 Image9 的 Top 或 Left 屬性
ex:
 case 2: // 若被點擊的 Image 在 LO 2
 {
  // 判斷 Image9 在 LO 1
  if(BMP[8]->Top==40 && BMP[8]->Left==424)
  {
   BMP[i]->Left = 424; // 把 Image(i) 挪到 LO 1
   BMP[8]->Left = 520; // 把 Image9 挪到 LO 2
   LO[i] = 1; // Image(i) 改變位置了,LO[i] 裡面的資料也要跟著改
  }
  ...
 
5.
確認所有圖片都可以正常移動後,就是要判斷過關的條件
只要用 for loop 去跑 LO array 裡面是不是從 0 排到 8 就可以了
 
6.
接著要製作執行檔
總不能叫沒有安裝 BCB 的人先裝 BCB 才能玩吧
 
這樣新產生的 exe 檔就可以拿去給別人玩了 XD
 
最下面還有更換 exe 檔的 Icon 的方法
BCB 內建的小圖... 不怎麼好看 = =a
 
【程式下載】
WebHd 群組: rome
網頁下載連結:
8 Puzzle Game (遊戲執行檔)
Image 移動 ( 含程式碼 )
Image 8 Puzzle 亂排 ( 含程式碼 )
 
 
下面兩個是有人問我要怎麼做才弄出來的
都弄好了就順便放上來分享
群組 rome 裡面都有,
附上網頁下載是因為最近網路硬碟還滿常掛的
 
 
 

沒有留言:

張貼留言