国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > C# > 正文

WPF實(shí)現(xiàn)2048小游戲

2020-01-24 00:20:40
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

        前幾天空閑的時(shí)候,實(shí)現(xiàn)了一個(gè)2048游戲。除了可以設(shè)置行數(shù)和列數(shù)之外,支持修改顯示名稱(chēng),比如下面,改成神雕俠侶中的角色名稱(chēng):

        游戲邏輯比較簡(jiǎn)單,大家都應(yīng)該玩過(guò)。

        這里主要實(shí)現(xiàn)了四個(gè)類(lèi):Game、GameBoard還有ColorBlock和BoardGridLine。

        Game類(lèi)主要用來(lái)實(shí)現(xiàn)游戲的控制,比如初始化、添加新的色塊、移除色塊、控制色塊上下左右移動(dòng)、改變積分,觸發(fā)游戲結(jié)束等。

        GameBoard繼承自Canvas,實(shí)現(xiàn)了色塊的合并、檢測(cè)每個(gè)格子的狀態(tài)等,另外提供了Game控制色塊移動(dòng)的接口。

        ColorBlock類(lèi)繼承自Shape類(lèi),用于自定義色塊的顯示,包含XY坐標(biāo)、顏色、顯示文字等依賴(lài)屬性,可以進(jìn)行動(dòng)畫(huà),另外還實(shí)現(xiàn)了具體的上下左右移動(dòng)的方法。最初幾個(gè)顏色是手動(dòng)設(shè)置,等到色塊越來(lái)越多,就隨機(jī)生成一種顏色。

        BoardGridLine也繼承自Shape類(lèi),用于繪制Canvas底部的網(wǎng)格。

        另外,游戲使用一個(gè)簡(jiǎn)單的文本文件保存設(shè)置,包括行數(shù)與列數(shù),以及顯示文字及其對(duì)應(yīng)顏色,具體操作在Settings類(lèi)中。

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

        圖標(biāo)使用Expression Design制作:

 

游戲效果如下:

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");  }  //合并,是否繼續(xù)  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小游戲

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 无为县| 新建县| 商水县| 黔西县| 确山县| 佛冈县| 深泽县| 华容县| 达州市| 资溪县| 家居| 泸水县| 淳化县| 宁都县| 如皋市| 涡阳县| 隆安县| 乐清市| 东兰县| 元阳县| 盐津县| 安国市| 宜城市| 大港区| 漯河市| 垣曲县| 西峡县| 墨玉县| 赤水市| 西乌珠穆沁旗| 玛多县| 化德县| 图们市| 富民县| 定边县| 临澧县| 镇雄县| 怀柔区| 永登县| 吴川市| 五家渠市|