Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.06.2016, 12:15   #1
sashakozlovskiy
Новичок
Джуниор
 
Регистрация: 08.06.2016
Сообщений: 1
По умолчанию Клеточный автомат c# с использованием datagridview

Всех приветствую. Помогите пожалуйста реализовать клеточный автомат,используя datagridview. У клетки 3 состояния: 1. живая клетка. 2. умирающая клетка. 3. мёртвая клетка. Если клетка мертва и у неё 3 живых соседа,рождается новая клетка. Если же клетка жива и у неё количества соседей меньше 2 и больше 3,то она начинает умирать,и уже при каждом ходе её здоровье уменьшается до нуля,т.е она не может выздороветь. Если её здоровье 0,она становится мёртвой. Умирающие клетки не участвуют в подсчёте живых соседей. Ниже будет мой код,который,почему-то,не корректно работает,т.е когда я ничего не ввожу в поле ввода, т.е автомат работает 1 раз, то всё нормально, но когда я ввожу 2 хода или более,учитывая, что начиная со второго столбца второй строки по вертикали стоят 3 единицы, вместо второй единицы в ячейке ничего нет, хоть такого не должно быть, так как пока клетка умирает, в (i-1,j-1) ячейке должен быть 0,учитывая,что клетка умирает за 7 ходов,где i и j координаты клетки в матрице. Заранее благодарю всех за помощь.
Код:
using System;
using System.Threading;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication3{

    public partial class Form1 : Form
    {
        public kletka[,] avtomat;
        public kletka[,] priviewvalue;
        public byte turn;

        public Form1()
        {
            InitializeComponent();
        }

        private int summkletki(int i, int j)
        {
            return avtomat[i - 1, j - 1].live + avtomat[i - 1, j].live + avtomat[i - 1, j + 1].live + avtomat[i, j - 1].live + avtomat[i, j + 1].live + avtomat[i + 1, j - 1].live + avtomat[i + 1, j].live + avtomat[i + 1, j + 1].live;

        }
        private void buildavtomat()
        {
            for (int i = 1; i < priviewvalue.GetLength(0) - 1; i++)
            {
                for (int j = 1; j < priviewvalue.GetLength(0) -1; j++)
                {
                    if (avtomat[i, j].live == 1 && summkletki(i, j) != 2 && summkletki(i, j) != 3)
{
                            priviewvalue[i, j].live = 0;
                            priviewvalue[i, j].helse--;
                            data1.Rows[i - 1].Cells[j - 1].Value = 0;
                                  }
                   if (avtomat[i, j].live == 0 && avtomat[i, j].helse > 0) priviewvalue[i, j].helse--;
if (avtomat[i, j].helse == 0)
                        data1.Rows[i - 1].Cells[j - 1].Value = null;
                    if (summkletki(i, j) == 3 && avtomat[i, j].helse == 0)
                    {
                        priviewvalue[i, j].live = 1;
                        priviewvalue[i, j].helse = 7;
                        data1.Rows[i - 1].Cells[j - 1].Value = 1;
                    }
                }
            }
            avtomat = priviewvalue;
        }
                   private void Form1_Load(object sender, EventArgs e)
        {
            data1.RowCount = 30;
            data1.ColumnCount = 30;
            
            
        }        private void button1_Click(object sender, EventArgs e)
        {
            avtomat = new kletka[data1.RowCount + 2, data1.ColumnCount + 2];
            priviewvalue = new kletka[data1.RowCount + 2, data1.ColumnCount + 2];
            for (int i = 0; i < avtomat.GetLength(0); i++)
            {
                for (int j = 0; j < avtomat.GetLength(1); j++)
                {
                    avtomat[i, j] = new kletka(0);
                    priviewvalue[i, j] = new kletka(0);
                }
            }
            for (int i = 0; i < data1.RowCount; i++)
            {
                for (int j = 0; j < data1.ColumnCount; j++)
                {
                    if (data1.Rows[i].Cells[j].Value != null && data1.Rows[i].Cells[j].Value.ToString() == "1")
                    {
                        avtomat[i + 1, j + 1].live = 1;
                        avtomat[i + 1, j + 1].helse = 7;
                    }
                    
                }
            }
            if (turn > 1)
            {
                textBox1.Hide();
                button1.Hide();
                data1.ReadOnly = true;

                for (byte a = 1; a <= turn; a++)
                {
                                        buildavtomat();
                                        Thread.Sleep(1000);
                    
                }
                    textBox1.Show();
                    button1.Show();
                    data1.ReadOnly = false;
                }
                        else buildavtomat();
                    }
        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            data1.Dispose();
        }
    
        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            if (byte.TryParse(textBox1.Text, out turn) && textBox1.Text != "0") turn = byte.Parse(textBox1.Text);
            else if (textBox1.Text.Length != 0)
            {
                turn = 1;
                textBox1.Text = "1";
                MessageBox.Show("Сюда можно вводить только натуральные числа типа байт до 255", "Информация");
            }
        }
    }
    public class kletka
    {
        public byte live;
        public byte helse;
        public kletka(byte live)
        {
            this.live = live;    
        }
    }
}z
_____
Код программы нужно выделять (форматировать) тегами [CODE] (читать FAQ)
Модератор

Последний раз редактировалось Serge_Bliznykov; 08.06.2016 в 13:21.
sashakozlovskiy вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Клеточный автомат Винера-Розенблюта slavarus Помощь студентам 2 17.09.2013 06:56
автомат crechet51 Помощь студентам 0 07.10.2012 01:50
Клеточный автомат (Игра Жизнь) в Delphi nitroes Фриланс 4 12.03.2012 13:11
Клеточный автомат Munya Фриланс 4 08.05.2010 13:34
Клеточный автомат Noor Помощь студентам 4 29.11.2007 09:19