俄罗斯方块
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Threading.Tasks; 9 using System.Windows.Forms; 10 11 namespace ShapeUI 12 { 13 public partial class forShape : Form 14 { 15 public forShape() 16 { 17 InitializeComponent(); 18 } 19 private void forShape_Load(object sender, EventArgs e) 20 { 21 lblGrade.Text = "0";//显示等级 22 lblScore.Text = "0";//显示分数 23 Helper.Speed = 550; 24 tirShape.Interval = Helper.Speed; 25 lblSpeed.Text = Helper.Speed.ToString();//显示速度 26 } 27 private bool Stop(int key) //结束操作 28 { 29 bool b = true; 30 foreach (Control c in gpbGame.Controls) 31 { 32 if (c.Enabled) 33 { 34 int x = c.Location.X; 35 int y = c.Location.Y; 36 //判断是否撞墙 37 if (x >= gpbGame.Width - 20 && key == 68) 38 { 39 b = false; 40 break; 41 } 42 else if (x <= 0 && key == 65) 43 { 44 b = false; 45 break; 46 } 47 else if (y >= gpbGame.Height - 20 && key == 83) 48 { 49 b = false; 50 Enableds();//如果是下落操作碰到墙则固定形状 51 break; 52 } 53 } 54 } 55 return b; 56 } 57 public void Enableds()//固定 58 { 59 foreach (Control c in gpbGame.Controls) 60 { 61 if (c.Enabled) 62 { 63 c.KeyDown -= buttons_KeyDown;//消除按钮事件 64 c.Enabled = false; 65 int Red = new Random().Next(1, 256); 66 int Green = new Random().Next(1, 256); 67 int Blue = new Random().Next(1, 256)>100?250:0; 68 //固定变换颜色 69 c.BackColor = Color.FromArgb(Red, Green, Blue); 70 } 71 //判断游戏结束 72 if (!c.Enabled && c.Location.Y <= 40) 73 { 74 tirShape.Stop(); 75 MessageBox.Show("Game Over");//游戏结束,初始化游戏窗口 76 lblGrade.Text = "0";//初始化等级 77 lblScore.Text = "0";//初始化分数 78 Helper.Speed = 550; 79 tirShape.Interval = Helper.Speed; 80 lblSpeed.Text = Helper.Speed.ToString();//初始化速度 81 this.gpbGame.Controls.Clear(); 82 return; 83 } 84 } 85 GetShape();//生成新的形状 86 } 87 private void GetShape() //生成形状 88 { 89 Helper.Score(gpbGame, lblScore);//加分判断 90 lblGrade.Text = Helper.Grade.ToString();//刷新等级 91 tirShape.Interval = Helper.Speed; 92 lblSpeed.Text = Helper.Speed.ToString();//刷新速度 93 IShapes s = null; 94 if(checkAdd.Checked) 95 s = CreateShape.createShape(-1);//得分模式 96 else 97 s = CreateShape.createShape(new Random().Next(1, 6));//获取形状 98 foreach (Control c in s.Getbuttons()) 99 { 100 c.KeyDown += buttons_KeyDown;//添加事件 101 gpbGame.Controls.Add(c); 102 c.Focus();//获取焦点 103 } 104 } 105 private void buttons_KeyDown(object sender, KeyEventArgs e)//键盘事件 106 { 107 MoveShape(e.KeyValue);//移动判断 108 } 109 private bool Impacts(int x, int y, int key) //向下碰撞到方块 110 { 111 bool b = true; 112 foreach (Control c in gpbGame.Controls) 113 { 114 if (c.Enabled) 115 { 116 //判断是否碰撞到方块 117 if (c.Location.X == x && c.Location.Y == y) 118 { 119 if (key == 83)//如果是向下降落的操作便固定 120 Enableds(); 121 b = false; 122 break; 123 } 124 125 } 126 } 127 return b; 128 } 129 private void MoveShape(int key)//移动位置 130 { 131 if (Stop(key))//是否碰撞 132 { 133 //预计下一步将要发生的事情 134 foreach (Control c in gpbGame.Controls) 135 { 136 if (!c.Enabled) 137 { 138 int x = c.Location.X; 139 int y = c.Location.Y; 140 if (key == 65) 141 x += 20; 142 else if (key == 68) 143 x -= 20; 144 else if (key == 87) 145 { 146 //ChangeShape(); 147 } 148 else if (key == 83) 149 { 150 y -= 20; 151 } 152 if (!Impacts(x, y, key))//判断是否与方块碰撞,是则结束 153 return; 154 } 155 } 156 //如果预计通过则实施操作 157 foreach (Control c in gpbGame.Controls) 158 { 159 if (c.Enabled) 160 { 161 int x = c.Location.X; 162 int y = c.Location.Y; 163 if (key == 65) 164 x -= 20; 165 else if (key == 68) 166 x += 20; 167 else if (key == 87) 168 { 169 Helper.ChangeShape(gpbGame);//变换 170 return;//变换形状后结束方法,否则会导致循环变换 171 } 172 else if (key == 83) 173 { 174 y += 20; 175 } 176 c.Location = new Point(x, y);//移动操作 177 } 178 } 179 } 180 } 181 private void btnBegin_Click(object sender, EventArgs e)//开始游戏 182 { 183 if (btnBegin.Text == "游戏开始") 184 { 185 btnBegin.Text = "重新开始"; 186 } 187 else 188 { 189 btnBegin.Text = "游戏开始"; 190 } 191 lblGrade.Text = "0";//初始化等级 192 lblScore.Text = "0";//初始化分数 193 Helper.Speed = 550; 194 tirShape.Interval = Helper.Speed; 195 lblSpeed.Text = Helper.Speed.ToString();//初始化速度 196 this.gpbGame.Controls.Clear();//初始化游戏窗口 197 GetShape();//生成形状 198 tirShape.Start(); 199 } 200 201 private void btnEnd_Click(object sender, EventArgs e)//游戏结束 202 { 203 tirShape.Stop(); 204 Application.Exit(); 205 } 206 207 private void tirShape_Tick(object sender, EventArgs e)//计时器 208 { 209 MoveShape(83);//默认自动下降操作 210 } 211 212 private void btnStop_Click(object sender, EventArgs e)//暂停游戏 213 { 214 if (tirShape.Enabled) 215 { 216 tirShape.Stop(); 217 forStop f = new forStop(); 218 f.ShowDialog();//暂停中 219 tirShape.Start();//暂停结束 220 } 221 } 222 223 private void btnCue_Click(object sender, EventArgs e)//游戏操作提示 224 { 225 forCue f = new forCue();//提示 226 f.ShowDialog();//显示提示 227 } 228 } 229 }
1 using System; 2 using System.Collections.Generic; 3 using System.Drawing; 4 using System.Linq; 5 using System.Text; 6 using System.Threading.Tasks; 7 using System.Windows.Forms; 8 9 namespace ShapeUI 10 { 11 public static class Helper 12 { 13 public static int Speed { get; set; }//速度 14 public static int Grade { get; set; }//等级 15 public static List<button> Getbuttons(int[,] points) //组成形状 16 { 17 List<button> bs = new List<button>(); 18 for (int i = 0; i < 4; i++) 19 { 20 button b = new button(); 21 b.Location = new System.Drawing.Point(points[0, i], points[1, i]);//初始化坐标 22 if (i == 1) 23 { 24 b.Tag = "point";//定义原点 25 } 26 else 27 b.Tag = ""; 28 bs.Add(b); 29 } 30 return bs; 31 } 32 public static void Score(GroupBox gpbGame, Label lblScore)//得分 33 { 34 int length = gpbGame.Width / 20; 35 for (int i = 0; i < length; i++)//没行都判断是否满足加分条件 36 { 37 AddScore(i,gpbGame,lblScore);//加分操作 38 } 39 } 40 public static void AddScore(int rowPage, GroupBox gpbGame,Label lblScore) 41 { 42 int count = 0; 43 int length = gpbGame.Width / 20;//列数 44 List<button> list = new List<button>(); 45 foreach (Control c in gpbGame.Controls) 46 { 47 if (c is button && !c.Enabled && c.Location.Y == gpbGame.Height - 20 * rowPage)//判断是否为指定行的区域 48 { 49 count++; 50 list.Add(c as button);//要删除的控件 51 } 52 if (count >= length) 53 { 54 int score = Convert.ToInt32(lblScore.Text); 55 lblScore.Text = (score += 1).ToString();//刷新分数 56 if(score == 5)//分数等级 57 { 58 Grade = 1; 59 Speed = 550; 60 }else if(score == 15) 61 { 62 Grade = 2; 63 Speed = 450; 64 } 65 else if (score == 35) 66 { 67 Grade = 3; 68 Speed = 400; 69 } 70 else if (score == 80) 71 { 72 Grade = 4; 73 Speed = 350; 74 } 75 else if (score == 200) 76 { 77 Grade = 5; 78 Speed = 300; 79 } 80 foreach (button b in list) 81 { 82 b.Dispose();//引用类型会同步所有的地址 83 } 84 85 Subtract(count, rowPage,gpbGame);//位置下降 86 foreach (Control b in gpbGame.Controls) 87 { 88 if (b is button && !b.Enabled && b.Location.Y == gpbGame.Height - 20 * rowPage) 89 { 90 count--; 91 if (count == 0)//在次满足等分条件递归调用加分 92 Score(gpbGame,lblScore); 93 } 94 } 95 return; 96 } 97 } 98 } 99 public static void Subtract(int count, int rowPage, GroupBox gpbGame)//减行 100 { 101 foreach (Control bb in gpbGame.Controls) 102 { 103 if (bb is button && !bb.Enabled && bb.Location.Y == gpbGame.Height - 20 * rowPage) 104 { 105 count--;//判断整行是否有控件 106 } 107 } 108 foreach (Control b in gpbGame.Controls) 109 { 110 //如果该行是空的则下降一行 111 if (count == 13 && !b.Enabled && b.Location.Y <= gpbGame.Height - 20 * rowPage) 112 { 113 int y = b.Location.Y; 114 b.Location = new Point(b.Location.X, y += 20); 115 } 116 } 117 } 118 119 public static void ChangeShape(GroupBox gpbGame)//变换位置 120 { 121 int pointx = 0; 122 int pointy = 0; 123 //先取到原点坐标 124 foreach (Control c in gpbGame.Controls) 125 { 126 if (c.Enabled)//原点坐标为100,40 127 { 128 if (c.Tag.ToString() == "point") 129 { 130 pointx = c.Location.X;//得到原点坐标 131 pointy = c.Location.Y; 132 break; 133 } 134 } 135 } 136 137 bool b = true; 138 foreach (Control c in gpbGame.Controls) 139 { 140 if (c.Enabled)//原点坐标为第二个方块坐标 141 { 142 int x = c.Location.X - pointx; 143 int y = -c.Location.Y + pointy;//得到相对坐标 144 int X = y + pointx; 145 int Y = x + pointy;//相对于原点的坐标 146 //判断方块是否超出边界 147 if (X >= gpbGame.Width || X < 0 || Y > gpbGame.Height || Y < 0) 148 { 149 b = false; 150 c.BackColor = Color.Black; 151 break; 152 } 153 //判断方块是否碰到方块 154 foreach (Control cc in gpbGame.Controls) 155 { 156 if (!cc.Enabled) 157 { 158 if (X == cc.Location.X && Y == cc.Location.Y) 159 { 160 b = false; 161 break; 162 } 163 } 164 } 165 } 166 } 167 if (b)//判断操作可行 168 { 169 foreach (Control c in gpbGame.Controls) 170 { 171 if (c.Enabled) 172 { 173 int x = c.Location.X - pointx; 174 int y = -c.Location.Y + pointy; 175 c.Location = new Point(y + pointx, x + pointy); } 176 } 177 } 178 } 179 180 } 181 }
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace ShapeUI 8 { 9 public class CreateShape 10 { 11 public static IShapes createShape(int shape) 12 { 13 IShapes s = null; 14 switch(shape) 15 { 16 case 1: 17 s = new Shape1(); 18 break; 19 case 2: 20 s = new Shape2(); 21 break; 22 case 3: 23 s = new Shape3(); 24 break; 25 case 4: 26 s = new Shape4(); 27 break; 28 case 5: 29 s = new Shape5(); 30 break; 31 } 32 return s; 33 } 34 } 35 }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ShapeUI { public interface IShapes { List<button> Getbuttons(); } }
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace ShapeUI 8 { 9 public class Shape1 : IShapes 10 { 11 //山字型 12 private int[,] points = new int[,] { {80,100,120,100 }, {40,40,40,20 } };//初始化形状坐标 13 public List<button> Getbuttons()//返回一个形状 14 { 15 return Helper.Getbuttons(points); 16 } 17 } 18 }
其它几个形状也都是一样的