using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using ShiftOS.Engine; namespace ShiftOS.WinForms.Applications { [Launcher("ShiftSweeper", true, "shiftsweeper", "Games")] [RequiresUpgrade("shiftsweeper")] [WinOpen("shiftsweeper")] [DefaultIcon("iconShiftSweeper")] public partial class ShiftSweeper : UserControl, IShiftOSWindow { private bool gameplayed = false; private int mineCount = 0; private int[,] minemap; //Represents status of tiles. 0-8 = how many mines surrounding. -1 = mine. -2 = flagged mine. -3 to -11 = flagged safe. private Timer ticking = new Timer(); private int minetimer; public ShiftSweeper() { InitializeComponent(); } public void OnLoad() { buttonE.Visible = true; buttonM.Visible = ShiftoriumFrontend.UpgradeInstalled("shiftsweeper_medium"); buttonH.Visible = ShiftoriumFrontend.UpgradeInstalled("shiftsweeper_hard"); ticking.Interval = 1000; } public void OnSkinLoad() { } public bool OnUnload() { return true; } public void OnUpgrade() { } private void buttonE_Click(object sender, EventArgs e) { startGame(0); } private void startGame(int d) { lbltime.Text = "Time: 0"; minetimer = 0; ticking.Start(); switch (d) { case 0: mineCount = 10; minefieldPanel.ColumnCount = 9; minefieldPanel.RowCount = 9; break; case 1: mineCount = 40; minefieldPanel.ColumnCount = 16; minefieldPanel.RowCount = 16; break; case 2: mineCount = 99; minefieldPanel.ColumnCount = 30; minefieldPanel.RowCount = 16; break; default: throw new NullReferenceException(); } lblmines.Text = "Mines: " + mineCount.ToString(); buttonE.Enabled = false; buttonM.Enabled = false; buttonH.Enabled = false; gameplayed = true; makegrid(); } private void makegrid() { Random rnd1 = new Random(); minemap = new int[minefieldPanel.ColumnCount, minefieldPanel.RowCount]; // Makes the minefield full of buttons for (int x = 0; x < minefieldPanel.ColumnCount; x++) { for (int y = 0; y < minefieldPanel.RowCount; y++) { minemap[x, y] = 0; minefieldPanel.Controls.Add(makeButton(x, y), x, y); } } // Placing the mines int currminecount = mineCount; while (currminecount > 0) { int mineX = rnd1.Next(minefieldPanel.ColumnCount); int mineY = rnd1.Next(minefieldPanel.RowCount); if (minemap[mineX, mineY] == 0) { minemap[mineX, mineY] = -1; currminecount--; } } // Setting the numbers for (int x = 0; x < minefieldPanel.ColumnCount; x++) { for (int y = 0; y < minefieldPanel.RowCount; y++) { if (minemap[x, y] != -1) { int numMines = 0; for (int xx = -1; xx < 2; xx++) { for (int yy = -1; yy < 2; yy++) { if (x + xx >= 0 && y + yy >= 0 && x + xx < minefieldPanel.ColumnCount && y + yy < minefieldPanel.RowCount) { if (minemap[x + xx, y + yy] == -1) numMines++; } } } minemap[x, y] = numMines; } } } } private Button makeButton(int col, int row) { Button bttn = new Button(); bttn.Text = ""; bttn.Name = col.ToString() + " " + row.ToString(); Controls.AddRange(new System.Windows.Forms.Control[] { bttn, }); bttn.Size = new System.Drawing.Size(minefieldPanel.Width / minefieldPanel.ColumnCount, minefieldPanel.Height / minefieldPanel.RowCount); bttn.Click += new System.EventHandler(bttnOnclick); bttn.MouseDown += new MouseEventHandler(mouseDwn); bttn.MouseUp += new MouseEventHandler(mauseUp); bttn.MouseHover += new EventHandler(mauseHov); bttn.BackgroundImage = Properties.Resources.SweeperTileBlock; bttn.MouseClick += new System.Windows.Forms.MouseEventHandler(this.bttnOnRightClick); return bttn; } private void bttnOnRightClick(object sender, MouseEventArgs e) { if (!ticking.Enabled) return; Button bttnClick = sender as Button; if (bttnClick == null) return; if (e.Button == MouseButtons.Left | e.Button == MouseButtons.Middle) return; } private void mauseHov(object sender, EventArgs e) { pictureBox1.BackgroundImage = Properties.Resources.SweeperNormalFace; } private void mauseUp(object sender, MouseEventArgs e) { pictureBox1.BackgroundImage = Properties.Resources.SweeperNormalFace; } private void mouseDwn(object sender, EventArgs e) { pictureBox1.BackgroundImage = Properties.Resources.SweeperClickFace; } private void bttnOnclick(object sender, EventArgs e) { if (!ticking.Enabled) return; Button bttnClick = sender as Button; if (bttnClick == null) return; //not a button. string[] split = bttnClick.Name.Split(new Char[] { ' ' }); int x = System.Convert.ToInt32(split[0]); int y = System.Convert.ToInt32(split[1]); if (minemap[x, y] == -1) { ticking.Enabled = false; buttonE.Enabled = true; buttonM.Enabled = true; buttonH.Enabled = true; for (int xx = 0; xx < minefieldPanel.ColumnCount; xx++) { for (int yy = 0; yy < minefieldPanel.RowCount; yy++) { minefieldPanel.GetControlFromPosition(xx, yy).Enabled = false; if (minemap[xx, yy] == -1) { minefieldPanel.GetControlFromPosition(xx, yy).BackgroundImage = Properties.Resources.SweeperTileBomb; } } } } else if (minemap[x, y] < -1) return; else removeBlank(x, y); } private void removeBlank(int x, int y) { if (!minefieldPanel.GetControlFromPosition(x, y).Enabled) return; else { minefieldPanel.GetControlFromPosition(x, y).Enabled = false; trueform(x, y); for (int xx = -1; xx < 2; xx++) { for (int yy = -1; yy < 2; yy++) { if (x + xx >= 0 && y + yy >= 0 && x + xx < minefieldPanel.ColumnCount && y + yy < minefieldPanel.RowCount) { if (minefieldPanel.GetControlFromPosition(x + xx, y + yy).Enabled && minemap[x+xx,y+yy] != -1 && minemap[x + xx, y + yy] != -2) { minefieldPanel.GetControlFromPosition(x, y).Enabled = false; if (minemap[x, y] == 0) { removeBlank(x + xx, y + yy); } } } } } } } private void trueform(int x, int y) { Button bttn = (Button)minefieldPanel.GetControlFromPosition(x, y); if (minemap[x,y] == 0) bttn.BackgroundImage = Properties.Resources.SweeperTile0; else if (minemap[x, y] == 1) bttn.BackgroundImage = Properties.Resources.SweeperTile1; else if (minemap[x, y] == 2) bttn.BackgroundImage = Properties.Resources.SweeperTile2; else if (minemap[x, y] == 3) bttn.BackgroundImage = Properties.Resources.SweeperTile3; else if (minemap[x, y] == 4) bttn.BackgroundImage = Properties.Resources.SweeperTile4; else if (minemap[x, y] == 5) bttn.BackgroundImage = Properties.Resources.SweeperTile5; else if (minemap[x, y] == 6) bttn.BackgroundImage = Properties.Resources.SweeperTile6; else if (minemap[x, y] == 7) bttn.BackgroundImage = Properties.Resources.SweeperTile7; else if (minemap[x, y] == 8) bttn.BackgroundImage = Properties.Resources.SweeperTile8; } private void buttonM_Click(object sender, EventArgs e) { startGame(1); } private void buttonH_Click(object sender, EventArgs e) { startGame(2); } } }