欧美大屁股bbbbxxxx,狼人大香伊蕉国产www亚洲,男ji大巴进入女人的视频小说,男人把ji大巴放进女人免费视频,免费情侣作爱视频

歡迎來到入門教程網(wǎng)!

C#教程

當前位置:主頁 > 軟件編程 > C#教程 >

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

來源:本站原創(chuàng)|時間:2020-01-10|欄目:C#教程|點擊: 次

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

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

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

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

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

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

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

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

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

        圖標使用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小游戲

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

上一篇:C# 啟用事務提交多條帶參數(shù)的SQL語句實例代碼

欄    目:C#教程

下一篇:Unity中C#和Java的相互調用實例代碼

本文標題:WPF實現(xiàn)2048小游戲

本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/5252.html

網(wǎng)頁制作CMS教程網(wǎng)絡編程軟件編程腳本語言數(shù)據(jù)庫服務器

如果侵犯了您的權利,請與我們聯(lián)系,我們將在24小時內進行處理、任何非本站因素導致的法律后果,本站均不負任何責任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權所有