Форум программистов, компьютерный форум, киберфорум
Наши страницы
XNA/MonoGame
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
Lucky701
0 / 0 / 0
Регистрация: 05.06.2011
Сообщений: 55
1

Игра Жизнь

15.11.2011, 13:55. Просмотров 1295. Ответов 4

Помогите реализовать игру "Жизнь" на C# в псевдотрехмерном варианте или может у кого то есть реализованная.. Большое Всем спасибо за помощь!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.11.2011, 13:55
Ответы с готовыми решениями:

Игра
кажись я попал куда надо... мне нужно вскрыть файлы из игры на Jaguar...

Игра бульдозер
Здравствуйте! Подскажите пожалуйста, что за игра "бульдозер"? может есть у...

Игра на языке С
Здравствуйте, в ВУЗе скоро начнем учить Си, интересует возможно ли на Си...

Игра танграм
День добрый всем форумчанам! Решился написать легендарную игру Танграм (на...

Игра Уголки
Набросал на досуге игру "уголки" на C# с простеньким AI. 8-) Ещё немного не до...

4
Sequd
80 / 79 / 8
Регистрация: 03.11.2009
Сообщений: 723
15.11.2011, 17:09 2
У вас проблема с алгоритмом или же с реализацией его? Что именно не получается?
2
Lucky701
0 / 0 / 0
Регистрация: 05.06.2011
Сообщений: 55
16.11.2011, 13:11  [ТС] 3
у меня реализовано для двухмерного варианта:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
 
namespace Life
{
    
    public partial class Form1 : Form
    {
        private bool stopFlag = false; //переключатель конца игрового процесса
        private bool[,] massBool = new bool[50, 50]; //массив значений мертвый-живой для ячеек игрового поля
        private bool[,] massBoolTemp = new bool[50, 50]; // Массив временных значений
        private Button[,] massButton = new Button[50, 50]; // Массив кнопок-ячеек игрового поля
        private int generation = 0; //Счетчик поколений
        
        const int buttonLength = 10;
        Size buttonSize = new Size(buttonLength , buttonLength );
        const int margin = 30;
        const int maxValue = 50;
        const int breakPointGeneration = 100;
 
        public Form1()
        {   
            InitializeComponent();
           //создаем игровое поле
 
            for (int i = 0; i < maxValue ; i++)
            {
                for (int j = 0; j < maxValue ; j++)
                {                  
                    massButton[i, j] = new Button();
                    massButton[i, j].Size = buttonSize;
                    massButton[i, j].Location = new Point(i * buttonLength  + i * 2 + margin , j * buttonLength  + j * 2 + margin );
                    massButton[i, j].Click += new System.EventHandler(this.MassButtonClick);
                    massButton[i, j].Tag = new Coords(i, j); // .Tag для привязки кнопок-ячеек к массиву значений мертвый-живой  
                    massButton[i, j].FlatStyle = FlatStyle.Flat;
                    this.Controls.Add(massButton[i, j]);
 
                }
            }
            
            NewLife();
        }
       
        //Нажатием на кнопки-ячейки задаем первоначальное расположение особей
        private void MassButtonClick(object sender, EventArgs e)
        {
            Button btn = (Button)sender;
            Coords co=(Coords)btn.Tag ;
            btn.BackColor=Color.White;
            massBool[co.I, co.J] = true;
        }
       
         //Нажатие кнопки GO запускаем игровой процесс в отдельном потоке
        private void GoButtonClick(object sender, EventArgs e)
        {
            Thread LifeThread = new Thread(GoLife);
            LifeThread.Start();
        }
        //нажатием кнопки Clear устанавливаем переключатель конца игрового процесса
        private void ClearButtonClick(object sender, EventArgs e)
        {
            stopFlag = true;
        }
 
        //Начало новой игры
        private void NewLife()
        {
            for (int i = 0; i < maxValue ; i++)
            {
                for (int j = 0; j < maxValue; j++)
                {
                    massBool[i, j] = false;
                    massBoolTemp[i, j] = false;
                    massButton[i, j].BackColor = Color.Black;
                }
            }
            generation = 0;
            label1.Text = string.Empty;
            this.Refresh();
        }
 
        //метод выполняется в отдельном потоке, вызываем метод генерации нового поколения 
        //и проверяем состояние переключателя конца процесса
        private void GoLife()
        {
        for (int i = 0; i < breakPointGeneration ; i++)
            {
                NextGeneration();
                generation++;
                label1.Text = generation.ToString();
                this.Refresh();
                if (stopFlag) { break; }
             }
        if (stopFlag) { stopFlag = false;  NewLife(); }
        }
 
        //Генерирует новое поколение
        public void NextGeneration()
        {
            this.SuspendLayout();
            
            for (int i = 0; i < maxValue ; i++)
            {
                for (int j = 0; j < maxValue; j++)
                {
                    if ((SosediCount(i, j) == 3) && (!massBool[i, j])) { massBoolTemp[i, j] = true; }
                    if (((SosediCount(i, j) == 3) || (SosediCount(i, j) == 2)) && (massBool[i, j])) { massBoolTemp[i, j] = true; }
                    if ((SosediCount(i, j) < 2) && (massBool[i, j])) { massBoolTemp[i, j] = false ;  }
                    if ((SosediCount(i, j) > 3) && (massBool[i, j])) { massBoolTemp[i, j] = false; }
                }
            }
            for (int i = 0; i < maxValue ; i++)
            {
                for (int j = 0; j < maxValue; j++)
                {
                    massBool[i, j] = massBoolTemp[i, j];
                    if (massBool[i, j]) { massButton[i, j].BackColor = Color.White; } else {massButton[i, j].BackColor = Color.Black ; }
                }
            }
            this.ResumeLayout();
        
        }
 
        //функция расчета количества соседей у особи
        private int SosediCount(int a, int b)
        {
           int sosedi = 0;
           int limit = maxValue - 1;
 
            if (a > 0 && massBool[a - 1, b]) {sosedi++;}
            if (a > 0 && b < limit && massBool[a - 1, b + 1]) { sosedi++; }
            if (b < maxValue-1 && massBool[a, b + 1]) { sosedi++; };
            if (a < limit && b < limit && massBool[a + 1, b + 1]) { sosedi++; }
            if (a < limit && massBool[a + 1, b]) { sosedi++; }
            if (a < limit && b > 0 && massBool[a + 1, b - 1]) { sosedi++; }
            if (b > 0 && massBool[a, b - 1]) { sosedi++; }
            if (a > 0 && b > 0 && massBool[a - 1, b - 1]) { sosedi++; }
            return sosedi;
        }
    }
 
    //класс объектов, хранящих индексы массива для Button.Tag
    public class Coords
    {
        private int i;
        private int j;
        public int I
        {
            get {return i;}
            set { i = I; }
        }
        public int J
        {
            get {return j;}
            set { j = J; }
        }
        public Coords(int a, int b)
        {
            i = a; j = b;
        }
 
    }
 
}
А нужно чтобы считались клетки как будто размножаются в трехмерном пространстве, а отображались в двумерном.. вот это у меня никак не получается(((((((((
0
Sequd
80 / 79 / 8
Регистрация: 03.11.2009
Сообщений: 723
16.11.2011, 19:08 4
опять не совсем понял, вам необходимо считать в 3 измерениях? x,y,z?
и в чем проблема?) добавьте к вашему классу Coords новую переменную z и считайте вместе с ней
1
za5
442 / 346 / 32
Регистрация: 16.10.2010
Сообщений: 842
Записей в блоге: 7
17.11.2011, 13:31 5
2.5d вещь весьма смутная, только лишняя трата времени, когда есть 3d.
план такой:
1) посмотри в этом разделе темки, как рисовать текстуры в хне.
2) как в приложении получишь то, что у тебя сейчас в 2d, рисуй в rendertarget всю сцену.
3) напиши камеру (можно взять отсюда: Камера)
4) полученную текстуру вместе с матрицами можно передавать в базовый эффект, либо свой шейдер.
5) получи луч под курсором мышки через vieport.unproject
6) проверяй пересечения через ray.intersects
7) hfleqcz htpekmnfne
всё.
2
17.11.2011, 13:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.11.2011, 13:31

Игра на курсовую
Добрый день, уважаемые форумчане. У меня такая просьба: нам в универе в...

Игра вконтакте
Здраствуйте ! У кого есть опыт запуска своей игры вконтакте ? Подскажите ,...

Игра SpaceArcade
Опыта в программировании маловато, по-этому решил его приобрести. Так как самый...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru