[C#] 纯文本查看 复制代码
using System;
using System.Drawing;
using System.Windows.Forms;
namespace 俄罗斯方方块
{
public partial class FrmMain : Form
{
public FrmMain() {
InitializeComponent();
xuanze();//选择种类
}
Point[,] ai ={{new Point(150,0),new Point(150,-30),new Point(120,-30),new Point(180,-30)},//T
{new Point(150,0),new Point(150,-30),new Point(150,-60),new Point(150,-90)},//长条
{new Point(150,0),new Point(150,-30),new Point(150,-60),new Point(120,-60)},//L
{new Point(150,0),new Point(180,0),new Point(150,-30),new Point(120,-30)},//Z
{new Point(150,0),new Point(180,0),new Point(150,-30),new Point(180,-30)}};//方块
Random r = new Random();//随机种子
int bi = 0;//方块的种类
private void load(object sender, EventArgs e) {
}
void xuanze() {//选择种类
bi = r.Next(0, 5);
a.Location = ai[bi, 0];
b.Location = ai[bi, 1];
c.Location = ai[bi, 2];
d.Location = ai[bi, 3];
jieshu();//游戏结束判断
}
private void FrmMain_KeyUp(object sender, KeyEventArgs e) {
int i = 0;
int key = e.KeyValue;//37左38上39右40下
i = key == 37 ? xialuo(-30, 0) : key == 39 ? xialuo(30, 0) : key == 40 ? xialuo(0, 30) : i;
if (key == 40 && (a.Top == 300 || b.Top == 300 || c.Top == 300 || d.Top == 300)) i = 1;//移动出界判断
if (key == 37 && (a.Left == 0 || b.Left == 0 || c.Left == 0 || d.Left == 0)) i = 1;
if (key == 39 && (a.Left == 270 || b.Left == 270 || c.Left == 270 || d.Left == 270)) i = 1;
if (key == 38) i = xuanzhuan();//旋转碰撞判断
if (i == 0)
switch (key) {
case 37: a.Left -= 30; b.Left -= 30; c.Left -= 30; d.Left -= 30; break;
case 39: a.Left += 30; b.Left += 30; c.Left += 30; d.Left += 30; break;
case 40: a.Top += 30; b.Top += 30; c.Top += 30; d.Top += 30; break;
case 38:
if (bi < 4)//if里面是旋转的算法
{
int m = b.Top - 30, n = b.Left - 30;
c.Location = new Point(c.Top - m + n, 60 - (c.Left - n) + m);
a.Location = new Point(a.Top - m + n, 60 - (a.Left - n) + m);
d.Location = new Point(d.Top - m + n, 60 - (d.Left - n) + m);
}
break;
}
}
void jishi(object sender, EventArgs e) {
if (xialuo(0, 30) == 1) huahua();
panduan();
a.Top += 30; b.Top += 30; c.Top += 30; d.Top += 30;
}
void panduan() {//最下碰撞判断
if (a.Top == 300 || b.Top == 300 || c.Top == 300 || d.Top == 300)
huahua();//画画
}
void huahua() {//画画
Point[] pp = { a.Location, b.Location, c.Location, d.Location };
for (int i = 0; i < 4; i++) {
Label s = new Label();
s.BackColor = Color.Blue;
s.Size = new Size(30, 30);
s.Location = pp;
s.BorderStyle = BorderStyle.FixedSingle;
Controls.Add(s);
}
xiaotu();//消图
xuanze();//选择种类
}
int xialuo(int x, int y) {//移动碰撞判断
foreach (Control i in Controls)
if (i.BackColor == Color.Blue)
if (i.Location == new Point(a.Left + x, a.Top + y) || i.Location == new Point(b.Left + x, b.Top + y) || i.Location == new Point(c.Left + x, c.Top + y) || i.Location == new Point(d.Left + x, d.Top + y))
return 1;
return 0;
}
int xuanzhuan() {//旋转碰撞判断
Point[] pp = { a.Location, b.Location, c.Location, d.Location };
int m = pp[1].Y - 30, n = pp[1].X - 30;
pp[2] = new Point(pp[2].Y - m + n, 60 - (pp[2].X - n) + m);
pp[0] = new Point(pp[0].Y - m + n, 60 - (pp[0].X - n) + m);
pp[3] = new Point(pp[3].Y - m + n, 60 - (pp[3].X - n) + m);
foreach (Control i in Controls)
if (i.BackColor == Color.Blue)
if (i.Location == pp[1] || i.Location == pp[0] || i.Location == pp[2] || i.Location == pp[3])
return 1;
return 0;
}
void xiaotu() {//消图
int k = 0;
for (int m = 0; m < 4; m++)
for (int i = 0; ((k = 0) == 0) && i <= 300; i += 30) {
foreach (Control l in Controls) if (l.BackColor == Color.Blue && l.Top == i) k++;
if (k > 9)
foreach (Control l in Controls) {
if (l.Top == i) l.Location = new Point(-100, -100);
if (l.Top < i) l.Top += 30;
}
}
foreach (Control l in Controls) if (l.Location == new Point(-100, -100)) Controls.Remove(l);
}
void jieshu() {//游戏结束判断
foreach (Control i in Controls)
if (i.BackColor == Color.Blue)
if (i.Location == a.Location || i.Location == b.Location || i.Location == c.Location || i.Location == d.Location) {
tm.Stop();
if (MessageBox.Show("游戏结束,是否重新开始?", "提示", MessageBoxButtons.OKCancel) == DialogResult.OK) {
} else {
Close();
}
}
}
}
}