欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

扫雷-----C#窗体

程序员文章站 2022-03-04 12:29:15
...
 

using System;

using System.Collections.Generic;

using System.Text;

using System.Drawing;

using System.Windows;

using System.Windows.Forms;

namespace winmine

{

public class Map

{

public static int Time = 0;

public static bool GameOver = false;

public static bool IsSuccess = false;

public static int UserMineCount = 0;

public static int Width = 17 * 10;

public static int Height = 17 * 10;

public static int BlockWidth = 16;

public static int MineNumber = 10;

public static int RowCount = 9;

public static int ColumnCount = 9;

public static int MainMarked = 0;

public static int BlockOpen = 0;

public static List<BlockData> BlockDataList = new List<BlockData>();

static Map()

{

Init();

}

public static void Init()

{

GameOver = false;

Time = 0;

Height = RowCount * BlockWidth;

Width = ColumnCount * BlockWidth;

}

static void OpenUnit(BlockData bd)

{

if (!bd.IsMine)

{

if (bd.State == BlockState.Open || bd.State == BlockState.UserMine)

{

return;

}

bd.State = BlockState.Open;

BlockGraphics.DrawBlock(bd);

BlockOpen++;

if (bd.MineCount == 0)

{

foreach (BlockData bd1 in bd.BlockList)

{

OpenUnit(bd1);

}

}

}



}

public static void Showall()

{

foreach (BlockData bd in Map.BlockDataList)

{

if (bd.State == BlockState.Closed)

{

bd.State = BlockState.Open;

}



}

}

public static void DrawBlocks()

{

if (!Map.GameOver)

foreach (BlockData bd in Map.BlockDataList)

{

BlockGraphics.DrawBlock(bd);

}

else

{

foreach (BlockData bd in Map.BlockDataList)

{

if (!bd.IsMine && bd.State == BlockState.UserMine)

{

BlockGraphics.DrawBlock(bd.x, bd.y, BlockGraphics.MineBlastMap);

}

else if (bd.IsMine)

{

BlockGraphics.DrawBlock(bd.x, bd.y, BlockGraphics.MineMap);

}

else

{

BlockGraphics.DrawBlock(bd);

}

}

}

}

public static bool IsSuccessful()

{

if (Map.UserMineCount == 0)

{

int i = 0;

for (i = 0; i < Map.BlockDataList.Count; i++)

{

if (!Map.BlockDataList[i].IsMine && Map.BlockDataList[i].State == BlockState.UserMine)

{

break;

}



}

if (i < Map.BlockDataList.Count)

{

return false;

}

else

{

return true;

}

}

else

{

return false;

}

}

public static void SingleClick(int x, int y)

{

BlockData bd = GetBlock(x, y);

if (GameOver)

{

return;

}

if (bd != null && bd.IsMine)

{



GameOver = true;

Showall();

DrawBlocks();

}

else

{

OpenUnit(bd);

}

if (IsSuccessful())

{

Map.IsSuccess = true;



}

}

public static BlockData GetBlock(int x, int y)

{

if (x >= Map.ColumnCount * Map.BlockWidth || y > Map.RowCount * Map.BlockWidth)

{

return null;

}

int index = (y / Map.BlockWidth) * Map.ColumnCount + (x / Map.BlockWidth) % Map.ColumnCount;

if (index < BlockDataList.Count)

{

return BlockDataList[index];

}

else

{

return null;

}



}

public static int GetBlockIndex(int x, int y)

{

if (x >= Map.ColumnCount * Map.BlockWidth || y > Map.RowCount * Map.BlockWidth)

{

return -1;

}

int index = (y / Map.BlockWidth) * Map.ColumnCount + (x / Map.BlockWidth) % Map.ColumnCount;

if (index < BlockDataList.Count)

{

return index;

}

else

{

return -1;

}

}

}

public enum BlockState

{

Closed, Open, UserMine

}

public class BlockGraphics

{

public static Graphics G;

public static Graphics GG;

public static Bitmap MemImage;

public static Font DrawFont = new Font("Arial", 12, FontStyle.Bold);

public static Bitmap ClosedMap;//Map for the closed state

public static Bitmap OpenMap;//Map for the open state

public static Bitmap BlankOpenMap;//Map for the blank state

public static Bitmap UserMineMap;//Map for the mine user marked

public static Bitmap MineBlastMap;//Map for the BlastMine

public static Bitmap MineMap;//Map for the Mine



static BlockGraphics()

{



ClosedMap = new Bitmap((Image)new Bitmap("image/closed.gif"), new Size(Map.BlockWidth, Map.BlockWidth));

OpenMap = new Bitmap((Image)new Bitmap("image/open.gif"), new Size(Map.BlockWidth, Map.BlockWidth));

BlankOpenMap = new Bitmap((Image)new Bitmap("image/open.gif"), new Size(Map.BlockWidth, Map.BlockWidth));

UserMineMap = new Bitmap((Image)new Bitmap("image/usermine.gif"), new Size(Map.BlockWidth, Map.BlockWidth));

MineBlastMap = new Bitmap((Image)new Bitmap("image/MineBlast.gif"), new Size(Map.BlockWidth, Map.BlockWidth));

MineMap = new Bitmap((Image)new Bitmap("image/Mine.gif"), new Size(Map.BlockWidth, Map.BlockWidth));

}



public static void DrawBlock(int x, int y, Bitmap b)

{

if (G != null)

{

G.DrawImage(b, x, y);

GG.DrawImage(b, x, y);

}

}

public static void DrawBlock(BlockData bd)

{

Bitmap b = BlockGraphics.BlankOpenMap;

switch (bd.State)

{

case BlockState.Closed: { b = BlockGraphics.ClosedMap; break; }

case BlockState.Open: { b = BlockGraphics.OpenMap; break; }

case BlockState.UserMine: { b = BlockGraphics.UserMineMap; break; }

}

DrawBlock(bd.x, bd.y, b);

if (bd.State == BlockState.Open && bd.MineCount != 0)

{

StringFormat drawFormat = new StringFormat();

SolidBrush drawBrush = new SolidBrush(System.Drawing.Color.Blue);

switch (bd.MineCount)

{

case 1: { drawBrush = new SolidBrush(System.Drawing.Color.Blue); break; }

case 2: { drawBrush = new SolidBrush(System.Drawing.Color.Green); break; }

case 3: { drawBrush = new SolidBrush(System.Drawing.Color.Red); break; }

case 4: { drawBrush = new SolidBrush(System.Drawing.Color.Red); break; }

case 5: { drawBrush = new SolidBrush(System.Drawing.Color.Blue); break; }

case 6: { drawBrush = new SolidBrush(System.Drawing.Color.Blue); break; }

case 7: { drawBrush = new SolidBrush(System.Drawing.Color.Blue); break; }

case 8: { drawBrush = new SolidBrush(System.Drawing.Color.Blue); break; }



}

G.DrawString(bd.MineCount.ToString(), DrawFont, drawBrush, bd.x, bd.y, drawFormat);

GG.DrawString(bd.MineCount.ToString(), DrawFont, drawBrush, bd.x, bd.y, drawFormat);

}

}

public BlockGraphics()

{



}

}

public class BlockData

{

public int ID = 0;

public int x;

public int y;

public int MineCount = 0;//The mine count around it

public List<BlockData> MineList = new List<BlockData>();

public List<BlockData> BlockList = new List<BlockData>();

public int UserMineCount = 0;//The mine count around it which user marked

public BlockState State = BlockState.Closed;

public bool IsMine = false;

public BlockData(int x, int y, int MineCount)

{

this.x = x;

this.y = y;

this.MineCount = MineCount;

}

public BlockData(int x, int y)

{

this.x = x;

this.y = y;

}

}

}