这个学期学了C#,大作业是交一个游戏成品,所以写了一个俄罗斯方块,有较完整的注释。
只提供部分代码用于学术交流,请勿转载,如有发现侵权必究。
各部分实现原理请见于文章最后。
该代码分为4大部分–主窗体类、方块类合集、其他窗体类、其他普通类.详情见下图右边。
主窗体运行效果如下
主窗体类部分代码如下
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
using System.Threading;
using System.Media;
namespace Tetris
{
public partial class Form1 : Form
{
public bool ff = false; //为true则表示需要阻止下移方法冻结地图
public static SoundPlayer sp = new SoundPlayer(); //播放声音的对象
public static bool voice = true;
public static bool music = true;
public static bool iop = true;
public static int mapRow = 20;
public static int mapCol = 12;
Graphics h;
Graphics h1;
Graphics h2;
Brush w;
Brush w1;
Brush r;
Brush black;
Brush blue;
Brush orage;
int bSize ;
int [,] bk;
Block block;
int[,] map;
public static bool rc = false; //复活成功校验码
Thread thread3 =null; //定义线程3,
Thread thread2 = null; //定义线程2
const bool xc3 = true; //线程3whil循环终止条件,永远为true;while循环永远执行
bool xc2= true; //线程2while循环暂停的条件,永远为true
public static bool xc2n = true; //线程2while循环内部判断条件,true为关闭线程
public static int nd = 0; //该变量名用于控制难度,为0嗲表线程睡眠500
public static readonly object Lock = new object(); //Lock对象用于互斥锁
public int Score = 0; //分数
public static bool f4 = false; //用于限制开始游戏前进行按键修改造成游戏开始
public static bool f5 = false; //限制暂停按钮被按下时,下移键其作用,true代表需要暂停
public static Form1 frmthis; //储存自身对象
public static bool ifblack = false; //黑色大方块是否出现
public Form1()
{
InitializeComponent();
panel1.BackColor = Color.White;
frmthis = this; //储存自身对象
w = Brushes.White;
w1 = Brushes.White; //变量初始化
r = Brushes.Red;
black = Brushes.Black;
blue = Brushes.Blue;
orage=Brushes.Orange;
h = this.panel1.CreateGraphics();
h1 = this.panel1.CreateGraphics();
h2 = this.panel1.CreateGraphics();
bSize = 30;
frmthis.axWindowsMediaPlayer1.URL = "背景音乐.mp3";
frmthis.axWindowsMediaPlayer1.Ctlcontrols.play();
Random r1 = new Random();
int a = 2;// r1.Next(1, 8);
if (a == 1)
{
block = new BlockCT(1); //产生方块长条类对象 指定类型为1
}
if (a == 2)
{
block = new BlockL(1);
}
if (a == 3)
{
block = new BlockT(1);
}
if (a == 4)
{
block = new BlockTian(1);
}
if (a == 5)
{
block = new BlockZ(1);
}
if (a == 6)
{
block = new BlockTu(1);
}
if (a == 7)
{
block = new BlockShi(1);
}
map = new int[mapRow, mapCol];
}
private void panel1_Paint(object sender, PaintEventArgs e)
{
}
private void drawMap()
{
lock (Lock)
{
for (int i = 0; i < mapRow; i++)
for (int j = 0; j < mapCol; j++)
{
/*
if (map[i, j] == 0)
{
h.FillRectangle(w, j * bSize - 1, i * bSize - 1, bSize - 1, bSize - 1);
}*/
if (map[i, j] == 1)
{
h.FillRectangle(r, j * bSize - 1, i * bSize - 1, bSize - 1, bSize - 1);
// h1.DrawImage(bit, (j + block.col) * 30 + 1, (i + block.row) * 30 + 1);
//g//NC.DrawImage(imgbg, 1, 1, 28, 28);
}
if (map[i, j] == 2)
{
h.FillRectangle(blue, j * bSize - 1, i * bSize - 1, bSize - 1, bSize - 1);
}
if (map[i, j] == 3) //将橙色方块画出来
{
h.FillRectangle(orage, j * bSize - 1, i * bSize - 1, bSize - 1, bSize - 1);
}
if (map[i, j] == 4) //将黑色方块画出来
{
h.FillRectangle(black, j * bSize - 1, i * bSize - 1, bSize - 1, bSize - 1);
}
}
}
}
public void drawMap1()
{
lock (Lock)
{
for (int i = 0; i < mapRow; i++)
for (int j = 0; j < mapCol; j++)
{
if (map[i, j] == 0)
{
h.FillRectangle(w, j * bSize - 1, i * bSize - 1, bSize - 1, bSize - 1);
}
if (map[i, j] == 1)
{
h.FillRectangle(r, j * bSize - 1, i * bSize - 1, bSize - 1, bSize - 1);
// h1.DrawImage(bit, (j + block.col) * 30 + 1, (i + block.row) * 30 + 1);
//g//NC.DrawImage(imgbg, 1, 1, 28, 28);
}
if (map[i, j] == 2)
{
h.FillRectangle(blue, j * bSize - 1, i * bSize - 1, bSize - 1, bSize - 1);
}
if (map[i, j] == 3) //将橙色方块画出来
{
h.FillRectangle(orage, j * bSize - 1, i * bSize - 1, bSize - 1, bSize - 1);
}
if (map[i, j] == 4) //将黑色方块画出来
{
h.FillRectangle(black, j * bSize - 1, i * bSize - 1, bSize - 1, bSize - 1);
}
}
}
}
private void drawBlock()
{
lock(Lock){
// gNC.DrawImage(imgbg, 1, 1, 28, 28);
bk = block.getBlock();
for (int i = 0; i < bk.GetLength(0); i++) //注意长度表示
for (int j = 0; j < bk.GetLength(1); j++)
{
/* if (i == 0 && bk[i, j] == 1) //如果是第零行并且为红色方块,上方方块涂白
{
h1.FillRectangle(w, (j + block.col) * bSize - 1,
(i + block.row) * bSize - 1, bSize - 1, bSize - 1);
}
* */
if (bk[i, j] == 1) //将红色方块画出来
{
h1.FillRectangle(r, (j + block.col) * bSize - 1,
(i + block.row) * bSize - 1, bSize - 1, bSize - 1);
// h1.DrawImage(bit, (j + block.col) * 30 + 1, (i + block.row) * 30 + 1);
// gNC.DrawImage(imgbg, 1, 1, 28, 28);
}
if (bk[i, j] == 2) //将蓝色方块画出来
{
h1.FillRectangle(blue, (j + block.col) * bSize - 1,
(i + block.row) * bSize - 1, bSize - 1, bSize - 1);
}
if (bk[i, j] == 3) //将橙色方块画出来
{
h1.FillRectangle(orage, (j + block.col) * bSize - 1,
(i + block.row) * bSize - 1, bSize - 1, bSize - 1);
}
if (bk[i, j] == 4) //将黑色方块画出来
{
h1.FillRectangle(black, (j + block.col) * bSize - 1,
(i + block.row) * bSize - 1, bSize - 1, bSize - 1);
}
}
}
}
public void drawBlock2()//下移用
{
lock(Lock){
// gNC.DrawImage(imgbg, 1, 1, 28, 28);
bk = block.getBlock();
for (int i = 0; i < bk.GetLength(0); i++) //注意长度表示
for (int j = 0; j < bk.GetLength(1); j++)
{
if (i == 0 && (bk[i, j] == 1||bk[i, j]