Перемещение чисел в richTextBox на С#

Мне нужно решить поведение четырех чисел, которые будут двигаться вниз или вращаться, как смысл игры тетрис. Это то, что я хочу сделать с 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;
     }

 }

person Andrej Kozlovský    schedule 08.10.2014    source источник
comment
пожалуйста, переименуйте свои кнопки/и т. д., чтобы дать им более осмысленные имена - это моя полная ненависть к домашним животным!   -  person    schedule 08.10.2014
comment
Непонятно, в чем именно вам нужна помощь. Заставить ваши фигуры двигаться вниз по текстовому полю? Кроме того, ваши переменные выглядят немного неправильно. У вас есть pole4x4 и pole8x8. Я думаю, что pole4x4 должен быть частью вашей линии, а pole8x8 должен быть рядом в вашем колодце. Но это неясно. (4x4 определяет квадрат, содержащий 16 точек... 4 поперек и 4 вниз, а не полюс. Точно так же 8x8 будет квадратом с 64 точками. Если я правильно понял, вы имеете в виду, что они будут 1x4 и 1x8. Это правильно? ?)   -  person DeadZone    schedule 08.10.2014
comment
Прошу прощения за неразумные имена переменных. pole4x4 относится к четырем числам, состоящим из 1, а pole8x8 - к другим числам, таким как 0, который представляет собой строку в массиве размером 400. Вы можете попробовать это в C # и легко понять.   -  person Andrej Kozlovský    schedule 08.10.2014
comment
Помимо изменения символов, чтобы доска отображалась так, как вы хотите, есть еще одна проблема с вашим кодом. (По крайней мере!) У вас есть особая причина использовать RichTextBox??? Это довольно странный выбор, скажем, DataGridView. Пожалуйста, взгляните на правила, которые я установил в этом посте, иначе ваша раскраска никогда не будет работать правильно..   -  person TaW    schedule 08.10.2014


Ответы (1)


Ну, я думаю, что ваша реализация нуждается в некоторой доработке, но вот код, который будет начинаться с пары фигур и перемещать их дальше. Они... «рассыпаются» внизу, в отличие от тетриса, где формы сохраняют свою жесткость. Но я думаю, что это ответ на ваш вопрос. Остальное зависит от тебя.

Редактировать: я забыл упомянуть. Мой 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
    }
}
person DeadZone    schedule 08.10.2014