Мне нужно решить поведение четырех чисел, которые будут двигаться вниз или вращаться, как смысл игры тетрис. Это то, что я хочу сделать с richTextBox в C#, но мой код все еще работает плохо. Я хочу сделать, как показано ниже. Как я могу сделать, чтобы числа двигались в правильном направлении?
0 0 0 0 1 1 1 1 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0
после перемещения вниз на четыре цифры "1"
0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 1 1 1 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0
или также после вращения по часовой стрелке четырех цифр "1"
0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0 0 0 0
Вот мой код.
string[] pole8x8 = new string[400];
string[] pole4x4 = new string[4*2];
List<string> numbers = new List<string>();
int len = 52;
public Form1()
{
InitializeComponent();
for (int i = 0; i < pole8x8.Length; i+=2)
{
pole8x8[i] = "0 ";
richTextBox1.Text += pole8x8[i];
richTextBox1.BackColor = Color.Black;
richTextBox1.ForeColor = Color.White;
}
for (int i = 0; i < pole4x4.Length; i+=2)
{
pole4x4[i] = "1 ";
richTextBox1.SelectionStart = 18;
richTextBox1.SelectedText = pole4x4[i];
numbers.Add(pole4x4[i]);
}
}
private void button1_Click(object sender, EventArgs e)
{
richTextBox1.SelectionStart += len;
foreach (string s in numbers)
{
richTextBox1.SelectedText = s;
}
}
Ответ 1 · DeadZone
Ну, я думаю, что ваша реализация нуждается в некоторой доработке, но вот код, который будет начинаться с пары фигур и перемещать их дальше. Они... "рассыпаются" внизу, в отличие от тетриса, где формы сохраняют свою жесткость. Но я думаю, что это ответ на ваш вопрос. Остальное зависит от тебя.
Редактировать: я забыл упомянуть. Мой RichTextBox настроен на использование шрифта Courier New. (и неправильный шрифт должен работать.)
public partial class Form1 : Form
{
private int _tickCounter = 0;
private int _tickLimit = 500; // set to 10 or something for the game
private string[,] _dataArray;
public Form1()
{
InitializeComponent();
}
private void timer1_Tick(object sender, EventArgs e)
{
_tickCounter++;
if (_tickCounter >= _tickLimit)
{
// add a piece
AddNewPieceToWell(true);
_tickCounter = 0;
}
else
{
// Move the current pieces downward.
for (int rowCounter = _dataArray.GetUpperBound(0); rowCounter >= 1; rowCounter--)
{
for (int colCounter = 0; colCounter <= _dataArray.GetUpperBound(1); colCounter++)
{
if (_dataArray[rowCounter, colCounter] == " " && _dataArray[rowCounter - 1, colCounter] == "0")
{
_dataArray[rowCounter, colCounter] = "0";
_dataArray[rowCounter - 1, colCounter] = " ";
}
}
}
}
DrawWell();
}
private void Form1_Load(object sender, EventArgs e)
{
InitializeWell();
timer1.Start();
}
private void InitializeWell()
{
_dataArray = new string[,]{
{" ", " ", "0", "0", "0", "0", " ", " "},
{" ", " ", " ", " ", " ", " ", " ", " "},
{" ", " ", " ", " ", " ", " ", " ", " "},
{" ", " ", " ", " ", " ", " ", " ", " "},
{"0", "0", "0", "0", " ", " ", " ", " "},
{" ", " ", " ", " ", " ", " ", " ", " "},
{" ", " ", " ", " ", " ", " ", " ", " "}
};
DrawWell();
}
private void DrawWell()
{
rtbWell.Text = string.Empty;
for (int rowCounter = 0; rowCounter <= _dataArray.GetUpperBound(0); rowCounter++)
{
for (int colCounter = 0; colCounter <= _dataArray.GetUpperBound(1); colCounter++)
{
rtbWell.Text += _dataArray[rowCounter, colCounter];
}
rtbWell.Text += Environment.NewLine;
}
}
private void AddNewPieceToWell(bool RandomPiece = true)
{
// ToDo
}
}