DataGridView, цикл по всем строкам и умножение, если существует - PullRequest
0 голосов
/ 09 марта 2012

Привет всем, мне нужна помощь,

Я создаю игру типа "Игра в жизнь".В любом случае, я хочу проверить, используя вид сетки, если сосед текущей ячейки имеет то же значение, что и моя текущая ячейка.Если это так, я хочу проверить наличие пустого пространства (вокруг текущей ячейки) и добавить значение соседа, но с добавлением и дополнительного символа.

Вот мой код:

public void check()
{
  Textual txt = new Textual();
  for (int x = 0; x < dataGridView1.Rows.Count; x++)
  {
    for (int y = 0; y < dataGridView1.Rows[x].Cells.Count; y++)
    {
        if (dataGridView1.Rows[x].Cells[y].Value == "VS" ||
            dataGridView1.Rows[x].Cells[y].Value == "SL" ||
            dataGridView1.Rows[x].Cells[y].Value == "KG" ||
            dataGridView1.Rows[x].Cells[y].Value == "KN")
        {
          if (y - 1 >= 0 &&
              y + 1 < dataGridView1.ColumnCount &&
              x - 1 >= 0 && x + 1 < dataGridView1.RowCount &&
              y + 1 < dataGridView1.ColumnCount &&
              x + 1 < dataGridView1.RowCount)
          {
            string value = dataGridView1.Rows[x].Cells[y].Value.ToString();
            int j;
            int k;
            switch (value)
            {
              case "VS":
              if (dataGridView1.Rows[x].Cells[y + 1].Value == "")
              {
                dataGridView1.Rows[x].Cells[y + 1].Value = "VS++";
                j = x;
                k = y + 1;
                int[,] temp= new int[j, k];
                or.oznaka = "VS";
                popis.TryAdd(temp, or);
                dataGridView1.Rows[x].Cells[y + 1].Style.BackColor = System.Drawing.Color.Red;
              }
              else if (dataGridView1.Rows[x - 1].Cells[y].Value == "")
              {
                dataGridView1.Rows[x - 1].Cells[y].Value = "VS++";
                j = x - 1;
                k = y;
                int[,] temp= new int[j, k];
                or.oznaka = "VS";
                popis.TryAdd(temp, or);
                dataGridView1.Rows[x - 1].Cells[y].Style.BackColor = System.Drawing.Color.Yellow;
              }
              else if (dataGridView1.Rows[x + 1].Cells[y].Value == "")
              {
                dataGridView1.Rows[x + 1].Cells[y].Value = "VS++";
                j = x + 1;
                k = y;
                int[,] temp= new int[j, k];
                or.oznaka = "VS";
                popis.TryAdd(temp, or);
                dataGridView1.Rows[x + 1].Cells[y].Style.BackColor = System.Drawing.Color.Gold;
              }
              else if (dataGridView1.Rows[x + 1].Cells[y + 1].Value == "")
              {
                dataGridView1.Rows[x + 1].Cells[y + 1].Value = "VS+";
                j = x - 1;
                k = y + 1;
                int[,] temp= new int[j, k];
                or.oznaka = "VS";
                popis.TryAdd(temp, or);
                dataGridView1.Rows[x + 1].Cells[y + 1].Style.BackColor = System.Drawing.Color.Green;
              }
              else if (dataGridView1.Rows[x - 1].Cells[y - 1].Value == "")
              {
                dataGridView1.Rows[x - 1].Cells[y - 1].Value = "VS+";
                j = x - 1;
                k = y - 1;
                int[,] temp= new int[j, k];
                or.oznaka = "VS";
                popis.TryAdd(temp,or);
                dataGridView1.Rows[x - 1].Cells[y - 1].Style.BackColor = System.Drawing.Color.Purple;
              }
              else if (dataGridView1.Rows[x - 1].Cells[y + 1].Value == "")
              {
                dataGridView1.Rows[x - 1].Cells[y + 1].Value = "VS+";
                j = x - 1;
                k = y + 1;
                int[,] temp= new int[j, k];
                or.oznaka = "VS";
                popis.TryAdd(temp, or);
                dataGridView1.Rows[x - 1].Cells[y + 1].Style.BackColor = System.Drawing.Color.HotPink;
              }
              else if (dataGridView1.Rows[x].Cells[y - 1].Value == "")
              {
                dataGridView1.Rows[x].Cells[y - 1].Value = "VS+";
                j = x;
                k = y - 1;
                int[,] temp= new int[j, k];
                or.oznaka = "VS";
                popis.TryAdd(temp, or);
                dataGridView1.Rows[x].Cells[y - 1].Style.BackColor = System.Drawing.Color.Lavender;
              }
              else if (dataGridView1.Rows[x + 1].Cells[y - 1].Value == "")
              {
                dataGridView1.Rows[x + 1].Cells[y - 1].Value = "VS+";
                j = x + 1;
                k = y - 1;
                int[,] temp= new int[j, k];
                or.oznaka = "VS";
                popis.TryAdd(temp, or);
                dataGridView1.Rows[x + 1].Cells[y - 1].Style.BackColor = System.Drawing.Color.LightBlue;
              }
              break;
            }
          }
        }
      }
    }
  }

1 Ответ

3 голосов
/ 09 марта 2012

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

Чтобы найтизначение, соответствующее ячейке (помните, х и у - вы изменили их обычное значение):

cell = FindCell(new Point(x, y), dataGridView1.Rows[y].Cells[x]);

И найти пустую ячейку:

cell = FindCell(new Point(x, y), string.Empty);

РЕДАКТИРОВАТЬ: лучший пример использования

foreach (DataGridViewRow row in dataGridView1.Rows)
{
    foreach (DataGridViewCell cell in row.Cells)
    {
        if (cell.Value != null && cell.Value.ToString() != string.Empty)
        {
            DataGridViewCell neighbour = FindCell(new Point(cell.ColumnIndex, row.Index), cell.Value.ToString());
            //  Found
            if (neighbour != null)
            {
                DataGridViewCell emptyCell = FindCell(new Point(cell.ColumnIndex, row.Index), string.Empty);
                if (emptyCell != null)
                {
                    emptyCell.Value = "WHATEVERYOUREQUIREITTOBE";
                }
            }
        }
    }
}

РЕДАКТИРОВАТЬ 2: Я предполагал, что из вашего кода ваши ячейки будут иметь ненулевое значение.Как это не так, замените каждый cell.Value.ToString () на (cell.Value ?? string.Empty) .ToString (), как я делал в примере.

Проверьте на нулевое значение после, чтобы убедиться, чтоВы нашли камеру.Вот функция:

/// <summary>
/// List of locations around given location. Add to previous value to get next location.
/// </summary>
Point[] neighbours = new Point[]
{
    new Point (-1, -1),
    new Point (1, 0),
    new Point (1, 0),
    new Point (-2, 1),
    new Point (2, 0),
    new Point (-2, 1),
    new Point (1, 0),
    new Point (1, 0),
};

/// <summary>
/// Finds a cell containing given string value.
/// </summary>
/// <param name="location">Point of search</param>
/// <param name="value">Value to find</param>
/// <returns>Cell containing given value</returns>
DataGridViewCell FindCell(Point location, string value)
{
    for (int i = 0; i < neighbours.Length; ++i)
    {
        //  Move location to new point
        location.Offset(neighbours[i]);
        //  Check boundaries
        if (location.Y >= 0 && location.Y < dataGridView1.RowCount
            && location.X >= 0 && location.X < dataGridView1.Columns.Count)
        {
            //  Get cell 
            DataGridViewCell cell = dataGridView1.Rows[location.Y].Cells[location.X];
            //  If value matches
            if ((cell.Value ?? string.Empty).ToString() == value)
            {
                return cell;
            }
        }
    }
    //  No match
    return null;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...