2018年1月16日 星期二

小山的 C# 教學-第45課-五子棋小遊戲(六)-重構與最後準備

本課簡介

本課為五子棋系列第六課
此次會先來修復上次課程最後發現的 Bug
接著稍微整理一下一些遊戲邏輯的程式碼
結尾時來為最後的課程做一些準備!

教學影片

注意:影片有高畫質 720P 的選項,可以看得更清楚喔!



重點提示


製作重點

  • Board 內的邊界判斷 Bug 其實是因為沒有在 Board 內限定棋盤交叉點數目造成的
  • 增加一個 class Game 來處理遊戲相關邏輯,使得程式碼更有結構性
  • 讓 Board 能夠回答在某個給定座標點上放置的棋子是甚麼顏色

製作步驟

  1. 解決邊界 Bug
    1. 在 Board 內新增一個常數 NODE_COUNT = 9
    2. 在 findTheClosetNode(int x, int y) 內,判斷 findTheClosetNode(int pos) 傳回的數字是不是介於 0 到 NODE_COUNT - 1 之間。若不是就回傳 NO_MATCH_NODE。
  2. 新增一個遊戲管理 class Game
    1. 把 Form1 中 board 跟 nextPieceType 兩個變數移到 Game 裡面
    2. 在 Form1 內新增一個 Game 的變數 game
    3. 新增一個 public method,CanBePlaced(int x, int y),內容就是呼叫 board.CanBePlaced(x, y)
    4. 新增一個 public method,PlaceAPiece(int x, int y)
      1. 把 Form1 內 MouseDown 的程式碼貼到這裡
      2. 把 e.x 與 e.y 改成 x 跟 y
      3. 把 Controls.Add 的程式碼刪除
      4. 讓此 method 把棋子往外 return
    5. (選擇性) 把 nextPieceType 都改成 currentPlayer
  3. 修改 Form1 的程式碼
    1. 把原本呼叫 board 的地方都改成 game
    2. 把 MouseDown 內處理 nextPieceType 的程式碼刪除
  4. 讓 Piece 回傳自己的 PieceType (顏色)
    1. 在 Piece 內新增一個 public abstract method,GetPieceType(),回傳 PieceType
    2. 在 BlackPiece 內實作 GetPieceType,回傳 PieceType.BLACK
    3. 在 WhitePiece 內實作 GetPieceType,回傳 PieceType.WHITE
  5. 在 PieceType 內新增一個常數,NONE
  6. 在 Board 內新增一個 public method,GetPieceType(int nodeIdX, int nodeIdY),回傳 PieceType
    1. 檢查 pieces[nodeIdX, nodeIdY] 是否為 null,是的話就回傳 PieceType.NONE
    2. 不是的話回傳 pieces[nodeIdX, nodeIdY].GetPieceType()

練習

  1. 要怎麼在 Game 裡面判斷遊戲是否出現五顆相同顏色的棋子連成一條線?
  2. 有一方勝利後,要如何顯示給使用者知道?
這兩個問題將在下次課程中解答!

相關資訊連結


多型(C# 程式設計手冊) | Microsoft Docs
https://docs.microsoft.com/zh-tw/dotnet/csharp/programming-guide/classes-and-structs/polymorphism

沒有留言:

張貼留言