用C#编写俄罗斯方块游戏-含代码
效果展示
简介:
俄罗斯方块是很多人儿时玩过的游戏,作者本人也不例外,那是我玩的是手持式液晶屏游戏机,其趣味性极强,成为了儿时不可或缺的美好记忆。本文展示如何通过C#设计这样一款桌面游戏,同时也展示了如何规范的编写代码,对于C#初学者或迫切需要规范编码的人群非常友好。
项目结构
代码将游戏分成两部分:
1、Tetris.Core是一个动态链接库(DLL),他主要实现游戏的数据结构、逻辑以及算法,其实现与图形界面完全无关,所以可以方便的移植到别的UI实现方式,如WPF、Web,甚至可以移植到Web,而不需要修改Tetris.Core中的代码。
2、TetrisWF是实现展示游戏的UI模块,砖块的绘制和用户的交互动作都由他来实现,由于游戏功能已经在Core中实现,所以此模块的代码相对较少。
游戏核心类Game的实现代码
using System;
using System.Drawing;
using System.Timers;
namespace Tetris.Core
{
/// <summary>
/// 定义游戏对象
/// </summary>
public class Game
{
private Timer tmrEngine = null;//游戏执行时钟或引擎
#region 基础数据结构
/// <summary>
/// 获取游戏当前的分数,从0开始
/// </summary>
public int Score {
get; private set; }
/// <summary>
/// 获取游戏当前等级, 从1开始
/// </summary>
public int Level {
get; private set; }
/// <summary>
/// 墙体对象
/// </summary>
public Wall Wall {
get; }
/// <summary>
/// 获取当前砖块对象
/// </summary>
public Block Block {
get; private set; }
/// <summary>
/// 获取当前砖块的中心点位置
/// </summary>
public Point CurrentBlockPosition {
get; private set; } = Point.Empty;
/// <summary>
/// 获取下一个砖块对象
/// </summary>
public Block NextBlock {
get; private set; }
#endregion
/// <summary>
/// 设置或获取游戏的绘制宿主
/// </summary>
public IDrawing DrawingHost {
get; set; } = null;
/// <summary>
/// 获取一个值,该值指示游戏是否已经结束
/// </summary>
public bool IsGameOver {
get; private set; } = false;
/// <summary>
/// 获取砖块仓库对象
/// </summary>
private BlockStore BlockStore {
get; } = null;
/// <summary>
/// 游戏结束时触发
/// </summary>
public event EventHandler GameOver = null;
public Game(int wallWidth, int wallHeight, BlockStore blockStore)
{
this.Block = null;
this.BlockStore = blockStore;
this.NextBlock = blockStore.CreateNextBlock();
this.Wall = new Wall(wallWidth, wallHeight, Color.Black);
}
/// <summary>
/// 开始游戏
/// </summary>
public void Start()
{
if (IsGameOver)
{
Wall.Reset();
IsGameOver = false;
}
if (tmrEngine == null)
{
tmrEngine = new Timer();