以下是我根据陈广老师视频,自己敲的代码,日后会不断更新。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace Tetris
{
public partial class FrmConfig : Form
{
public FrmConfig()
{
InitializeComponent();
}
private bool[,] struArr=new bool[5,5]; //此处bool值数组应用不明白,怎么会返回一个bull值呢?
private Color blockColor = Color.Red;
private void lblMode_Click(object sender, EventArgs e)
{
}
private void lblMode_Paint(object sender, PaintEventArgs e)
{
Graphics gp = e.Graphics;
gp.Clear(Color.Black);
Pen p = new Pen(Color.White);
for (int i = 31; i < 155; i = i + 31)
gp.DrawLine(p, 1, i, 155, i);
for (int i = 31; i < 155; i = i + 31)
gp.DrawLine(p, i, 1, i, 155);
SolidBrush s = new SolidBrush(blockColor);
for (int x = 0; x < 5;x++ )
{
for (int y = 0; y < 5;y++ )
{
if (struArr[x,y])
{
gp.FillRectangle(s, 31 * x + 1, 30 * y + 1, 30, 30);
}
}
}
}
private void lblMode_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button != MouseButtons.Left)
return;
int xPos, yPos;
xPos = e.X / 31;
yPos = e.Y / 31;
struArr[xPos, yPos] = !struArr[xPos, yPos];
bool b = struArr[xPos, yPos]; // 此处不解?
Graphics gp = lblMode.CreateGraphics();
SolidBrush s = new SolidBrush(b?blockColor:Color.Black);
gp.FillRectangle(s, 31 * xPos + 1, 30 * yPos + 1, 30, 30);
gp.Dispose();
}
private void lblColor_Click(object sender, EventArgs e)
{
colorDialog1.ShowDialog();
blockColor = colorDialog1.Color;
lblColor.BackColor = colorDialog1.Color;
lblMode.Invalidate();
}
private void btnAdd_Click(object sender, EventArgs e)
{
bool isEmpty = false;
foreach (bool i in struArr)
{
if (i)
{
isEmpty = true;
break;
}
}
if (!isEmpty)
{
MessageBox.Show("图案为空","提示窗口",MessageBoxButtons.OK,MessageBoxIcon.Information);
return;
}
StringBuilder sb = new StringBuilder(25);
foreach (bool i in struArr)
{
sb.Append(i?"1":"0");
}
string blockString = sb.ToString();
foreach (ListViewItem item in lsvBlockSet.Items)
{
if(item.SubItems[0].Text==blockString)
{
MessageBox.Show("图案已经存在", "提示窗口", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
}
ListViewItem myItem = new ListViewItem();
myItem = lsvBlockSet.Items.Add(blockString);
myItem.SubItems.Add(Convert.ToString(blockColor.ToArgb()));
}
private void lsvBlockSet_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
{
if (e.IsSelected)
{
blockColor = Color.FromArgb(int.Parse(e.Item.SubItems[1].Text));
lblColor.BackColor = blockColor;
string s = e.Item.SubItems[0].Text;
for (int i = 0; i < s.Length;i++ )
{
struArr[i / 5, i % 5] = (s[i] == '1') ? true : false;
}
lblMode.Invalidate();
}
}
private void btnDel_Click(object sender, EventArgs e)
{
if(lsvBlockSet.SelectedItems.Count==0)
{
MessageBox.Show("请在右边选择一个条目进行删除!", "提示窗口", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
lsvBlockSet.Items.Remove(lsvBlockSet.SelectedItems[0]);
btnClear.PerformClick();
}
private void btnClear_Click(object sender, EventArgs e)
{
for (int x = 0; x < 5;x++ )
{
for (int y = 0; y < 5; y++)
{
struArr[x, y] = false;
}
}
lblMode.Invalidate();
}
private void btnUpdate_Click(object sender, EventArgs e)
{
if (lsvBlockSet.SelectedItems.Count == 0) //判断是否有项目被选中
{
MessageBox.Show("请在右边选择一个条目进行修改!", "提示窗口", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
bool isEmpty = false; //判断图案是否为空
foreach(bool i in struArr)
{
if(i)
{
isEmpty = true;
break;
}
}
if(!isEmpty)
{
MessageBox.Show("图案为空,请先用鼠标点击左边图案再进行修改!", "提示窗口", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
StringBuilder sb = new StringBuilder(25);
foreach(bool i in struArr) //把图案的字符串信息转换为二维数组信息
{
sb.Append(i?"1":"0");
}
lsvBlockSet.SelectedItems[0].SubItems[0].Text = sb.ToString(); //改变图案信息
lsvBlockSet.SelectedItems[0].SubItems[0].Text = Convert.ToString(blockColor.ToArgb()); //改变颜色信息
}
}
}