a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C# > 正文

WPF實現2048小游戲

2019-10-29 21:02:45
字體:
來源:轉載
供稿:網友

        前幾天空閑的時候,實現了一個2048游戲。除了可以設置行數和列數之外,支持修改顯示名稱,比如下面,改成神雕俠侶中的角色名稱:

WPF,2048游戲

        游戲邏輯比較簡單,大家都應該玩過。

        這里主要實現了四個類:Game、GameBoard還有ColorBlock和BoardGridLine。

        Game類主要用來實現游戲的控制,比如初始化、添加新的色塊、移除色塊、控制色塊上下左右移動、改變積分,觸發游戲結束等。

        GameBoard繼承自Canvas,實現了色塊的合并、檢測每個格子的狀態等,另外提供了Game控制色塊移動的接口。

        ColorBlock類繼承自Shape類,用于自定義色塊的顯示,包含XY坐標、顏色、顯示文字等依賴屬性,可以進行動畫,另外還實現了具體的上下左右移動的方法。最初幾個顏色是手動設置,等到色塊越來越多,就隨機生成一種顏色。

        BoardGridLine也繼承自Shape類,用于繪制Canvas底部的網格。

        另外,游戲使用一個簡單的文本文件保存設置,包括行數與列數,以及顯示文字及其對應顏色,具體操作在Settings類中。

        最后,按鍵事件封裝在KeysNavigation中。

        圖標使用Expression Design制作:

 WPF,2048游戲

游戲效果如下:

WPF,2048游戲WPF,2048游戲

Game.cs

 

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Windows.Documents;namespace game2048{ public class Game {  public enum State  {    Idel,   Start,   Running,  }  ColorBlock[,] fillState;  private int score = 0;  private int step = 0;  public ColorBlock[,] FillState  {    get   {    return fillState;   }  }  GameBoard board;  public Game(GameBoard board)  {   this.board = board;   fillState = new ColorBlock[board.RowCount, board.ColumnCount];   for (int i = 0; i < board.RowCount; i++)   {    for (int j = 0; j < board.ColumnCount; j++)    {     fillState[i, j] = null;    }   }  }  public void init()  {   Settings.load();   ColorBlock block = new ColorBlock(board);   ColorBlock block1 = new ColorBlock(board);   //FillState[block.XIndex, block.YIndex] = block;   // FillState[block1.XIndex, block1.YIndex] = block1;   //BlockList.Add(block);   //BlockList.Add(block1);  }  public void addNew()  {   if (board.hasNoPlace())   {    gameOver(false);    return;   }   ColorBlock block = new ColorBlock(board);   //FillState[block.XIndex, block.YIndex] = block;   //BlockList.Add(block);  }  public void remove(int xIndex,int yIndex)  {   if (FillState[yIndex, xIndex] != null)   {    board.Children.Remove(FillState[yIndex, xIndex]);    FillState[yIndex, xIndex] = null;   }  }  public void toLeft()  {   bool add = false;   for (int i = 0; i < board.ColumnCount; i++)   {    for (int j = 0; j < board.RowCount; j++)    {     if (FillState[j, i] != null)     {      add |= FillState[j, i].moveLeft();     }    }   }   if (add)   {    addNew();    fireSetpChanged();   }  }  public void toRight()  {   bool add = false;   for (int i = board.ColumnCount-1; i >=0 ; i--)   {    for (int j = 0; j < board.RowCount; j++)    {     if (FillState[j, i] != null)     {      add |= FillState[j, i].moveRight();     }    }   }   if (add)   {    addNew();    fireSetpChanged();   }  }  public void toUp()  {   bool add = false;   for (int i = 0; i < board.ColumnCount; i++)   {    for (int j = 0; j < board.RowCount; j++)    {     if (FillState[j, i] != null)     {      add |= FillState[j, i].moveUp();     }    }   }   if (add)   {    addNew();    fireSetpChanged();   }  }  public void toDown()  {   bool add = false;   for (int i = 0; i < board.ColumnCount; i++)   {    for (int j = board.RowCount-1; j >=0; j--)    {     if (FillState[j, i] != null)     {      add |= FillState[j, i].moveDown();     }    }   }   if (add)   {    addNew();    fireSetpChanged();   }  }  public delegate void onScoreChange(int score);  public event onScoreChange onScoreChangeHandler;  public delegate void onStepChange(int step);  public event onStepChange onStepChangeHandler;  public delegate void onGameOver(bool success);  public event onGameOver onGameOverHandler;  public void fireSetpChanged()  {   step++;   if (onStepChangeHandler != null)    onStepChangeHandler(step);  }  /// <summary>  /// 增加積分  /// </summary>  /// <param name="offset"></param>  public void incScore(int offset)  {   score += offset;   if (onScoreChangeHandler != null)   {    onScoreChangeHandler(score);   }  }  public void gameOver(bool success)  {   if (onGameOverHandler != null)   {    onGameOverHandler(success);   }  }  public void reset()  {   score = 0;   step = 0;   if (onStepChangeHandler != null)    onStepChangeHandler(step);   if (onScoreChangeHandler != null)    onScoreChangeHandler(score);   for (int i = 0; i < board.RowCount; i++)   {    for (int j = 0; j < board.ColumnCount; j++)    {     remove(i, j);    }   }  } }}

GameBoard.cs

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Windows.Controls;using System.Diagnostics;namespace game2048{ public class GameBoard : Canvas, IControlable {  private int rowCount = 4;    public int RowCount  {   get   {    return rowCount;   }   set   {    rowCount = value;   }  }  private int columnCount = 4;  public int ColumnCount   {   get   {    return columnCount;   }   set   {    columnCount = value;   }  }  Game game = null;  public GameBoard()  {   this.Focusable = true;   this.Focus();   this.reset();  }  public void reset()  {   Settings.load();   RowCount = Settings.rowCount;   ColumnCount = Settings.columnCount;  }  public void init(Game game)  {   this.game = game;   game.init();  }  public void toLeft()  {   game.toLeft();   Debug.WriteLine("Left");  }  public void toRight()  {   game.toRight();   Debug.WriteLine("Right");  }  public void toUp()  {   game.toUp();   Debug.WriteLine("Up");  }  public void toDown()  {   game.toDown();   Debug.WriteLine("Down");  }  //合并,是否繼續  public bool union(int xIndex, int yIndex, Direction dirct)  {   switch (dirct)   {    case Direction.Left:     game.remove(xIndex - 1, yIndex);     break;    case Direction.Right:     game.remove(xIndex + 1, yIndex);     break;    case Direction.Up:     game.remove(xIndex, yIndex - 1);     break;    case Direction.Down:     game.remove(xIndex, yIndex + 1);     break;    default:     break;   }   bool ret = game.FillState[yIndex, xIndex].changeText();   if (ret)   {    game.gameOver(true);    return false;   }   game.incScore(game.FillState[yIndex, xIndex].TextIndex);   return true;  }  public int getState(int xIndex, int yIndex)  {   if (xIndex < 0 || xIndex > columnCount - 1)    return 0;   if (yIndex < 0 || yIndex > rowCount - 1)    return 0;   if (game.FillState[yIndex,xIndex] == null)    return 0;   return game.FillState[yIndex, xIndex].TextIndex;  }  public bool hasNoPlace()  {   return this.Children.Count == this.RowCount * this.ColumnCount+1;  }  public bool isLocationFilled(int xIndex,int yIndex)  {   if (xIndex < 0 || xIndex > columnCount-1)    return true;   if (yIndex < 0 || yIndex > rowCount-1)    return true;   if (game.FillState[yIndex, xIndex] == null)    return false;   return game.FillState[yIndex, xIndex].TextIndex>0;  }  public void setState(int xIndex,int yIndex,ColorBlock block)  {   game.FillState[yIndex, xIndex] = block;  } }}

源碼下載地址:2048小游戲

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 国产久| 一级黄色片欧美 | 日韩欧美一区二区三区久久婷婷 | 亚洲一二三 | 日本福利一区二区 | 在线观看成人小视频 | 国产在线一区观看 | 永久看片 | 久久久网 | 国产不卡一区 | 国产综合视频在线播放 | 成人高清在线 | 日韩国产在线播放 | 精品国产乱码久久久久久蜜柚 | 欧美一区二区黄色片 | 精品久久久久久久久久久久 | 日韩欧美理论片 | 日韩精品一区二区三区在线观看 | 91精品国产91久久久久久久久久久久 | 久久综合久久综合久久综合 | 国产精品久久久久9999鸭 | 一区二区欧美日韩 | 国产在线一区二区三区在线观看 | 成人精品一区二区三区中文字幕 | 就操成人网 | 亚洲精品日韩色噜噜久久五月 | 黄页免费看 | 99免费精品| 精久视频| 成人国产精品一级毛片视频 | 国产精自产拍久久久久久 | 91麻豆精品国产91久久久资源速度 | 成人三级免费 | 免费黄色毛片视频 | 国产成人在线看 | 国产精品丝袜一区二区 | 激情视频在线观看免费 | 在线区| 精品亚洲永久免费精品 | 成年入口无限观看网站 | 久久va|