View difference between Paste ID: RDL6mzbC and khmhpL80
SHOW: | | - or go back to the newest paste.
1
sejtablak.cpp:
2
3
// sejtablak.cpp
4
//
5
// Életjáték rajzoló
6
// Programozó Páternoszter
7
//
8
// Copyright (C) 2011, Bátfai Norbert, nbatfai@inf.unideb.hu, nbatfai@gmail.com
9
//                     cellSigma, bari.sandor@gmail.com
10
//
11
// This program is free software: you can redistribute it and/or modify
12
// it under the terms of the GNU General Public License as published by
13
// the Free Software Foundation, either version 3 of the License, or
14
// (at your option) any later version.
15
//
16
// This program is distributed in the hope that it will be useful,
17
// but WITHOUT ANY WARRANTY; without even the implied warranty of
18
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19
// GNU General Public License for more details.
20
//
21
// You should have received a copy of the GNU General Public License
22
// along with this program.  If not, see <http://www.gnu.org/licenses/>.
23
//
24
// Ez a program szabad szoftver; terjeszthetõ illetve módosítható a
25
// Free Software Foundation által kiadott GNU General Public License
26
// dokumentumában leírtak; akár a licenc 3-as, akár (tetszõleges) késõbbi
27
// változata szerint.
28
//
29
// Ez a program abban a reményben kerül közreadásra, hogy hasznos lesz,
30
// de minden egyéb GARANCIA NÉLKÜL, az ELADHATÓSÁGRA vagy VALAMELY CÉLRA
31
// VALÓ ALKALMAZHATÓSÁGRA való származtatott garanciát is beleértve.
32
// További részleteket a GNU General Public License tartalmaz.
33
//
34
// A felhasználónak a programmal együtt meg kell kapnia a GNU General
35
// Public License egy példányát; ha mégsem kapta meg, akkor
36
// tekintse meg a <http://www.gnu.org/licenses/> oldalon.
37
//
38
//
39
// Version history:
40
//
41
// 0.0.1    A két osztály tervezésének fõ szempontja az volt, hogy
42
// ne vagy alig különbözzön az elsõ C++-os példától, a Mandelostól:
43
// http://progpater.blog.hu/2011/02/26/tan_csodallak_amde_nem_ertelek_de_kepzetem_hegyvolgyedet_bejarja
44
// ezért az olyan kényesebb dolgokkal, hogy kezeljük a racsIndex-et a
45
// két osztályra bontott C++ megoldásban, amikor írjuk át a Javásból, nem foglalkoztunk
46
// a kiinduló Javás: http://www.tankonyvtar.hu/informatika/javat-tanitok-1-2-080904-1
47
// (a bazár eszme: „Release Early, Release Often" írjuk ki a posztra)
48
//
49
// 0.0.2    A SejtSzal osztály a QT slot-signal kommunikációját használja SejtAblak elérésére, így
50-
//továbbítja neki racsIndex új értékét,SejtAblak az eddigi this pointer helyett szintén slot-signal kommunikácóval állítja
50+
//továbbítja neki racsIndex új értékét,SejtAblak az eddigi this pointer helyett szintén 
51-
//saját racsIndex változóját SejtSzal szignálja alapján. /cellSigma/
51+
//slot-signal kommunikácóval állítja saját racsIndex változóját 
52
//SejtSzal szignálja alapján. /cellSigma/
53
54
55
56
#include "sejtablak.h"
57
58
SejtAblak::SejtAblak(int szelesseg, int magassag, QWidget *parent)
59
    : QMainWindow(parent)
60
{
61
    setWindowTitle("A John Horton Conway-féle életjáték");
62
63
    this->magassag = magassag;
64
    this->szelesseg = szelesseg;
65
66
    cellaSzelesseg = 6;
67
    cellaMagassag = 6;
68
69
    setFixedSize(QSize(szelesseg*cellaSzelesseg, magassag*cellaMagassag));
70
71
    racsok = new bool**[2];
72
    racsok[0] = new bool*[magassag];
73
    for(int i=0; i<magassag; ++i)
74
        racsok[0][i] = new bool [szelesseg];
75
    racsok[1] = new bool*[magassag];
76
    for(int i=0; i<magassag; ++i)
77
        racsok[1][i] = new bool [szelesseg];
78
    QObject:connect(this, SIGNAL(newRacsIndexValue(int)), this, SLOT(setRacsIndex(int)));
79
80
    racsIndex = 0;
81
    racs = racsok[racsIndex];
82
    // A kiinduló racs minden cellája HALOTT
83
    for(int i=0; i<magassag; ++i)
84
        for(int j=0; j<szelesseg; ++j)
85
            racs[i][j] = HALOTT;
86
    // A kiinduló racsra "ELOlényeket" helyezünk
87
    //siklo(racs, 2, 2);
88
    sikloKilovo(racs, 5, 60);
89
90
91
    eletjatek = new SejtSzal(racsok, szelesseg, magassag, 120, this);
92
    eletjatek->start();
93
94
}
95
96
void SejtAblak::paintEvent(QPaintEvent*) {
97
    QPainter qpainter(this);
98
99
    // Az aktuális
100
    bool **racs = racsok[racsIndex];
101
    // racsot rajzoljuk ki:
102
    for(int i=0; i<magassag; ++i) { // végig lépked a sorokon
103
        for(int j=0; j<szelesseg; ++j) { // s az oszlopok
104
            // Sejt cella kirajzolása
105
            if(racs[i][j] == ELO)
106
                qpainter.fillRect(j*cellaSzelesseg, i*cellaMagassag,
107
                                  cellaSzelesseg, cellaMagassag, Qt::black);
108
            else
109
                qpainter.fillRect(j*cellaSzelesseg, i*cellaMagassag,
110
                                  cellaSzelesseg, cellaMagassag, Qt::white);
111
            qpainter.setPen(QPen(Qt::gray, 1));
112
113
            qpainter.drawRect(j*cellaSzelesseg, i*cellaMagassag,
114
                              cellaSzelesseg, cellaMagassag);
115
        }
116
    }
117
118
    qpainter.end();
119
}
120
121
122
SejtAblak::~SejtAblak()
123
{
124
    delete eletjatek;
125
126
    for(int i=0; i<magassag; ++i) {
127
        delete[] racsok[0][i];
128
        delete[] racsok[1][i];
129
    }
130
131
    delete[] racsok[0];
132
    delete[] racsok[1];
133
    delete[] racsok;
134
135
136
}
137
138
void SejtAblak::vissza_slot(int racsIndex)
139
{
140
    emit newRacsIndexValue(racsIndex); //this->racsIndex = racsIndex;
141
    update();
142
}
143
144
void SejtAblak::setRacsIndex(int value)
145
{
146
   racsIndex=value;
147
}
148
149
/**
150
 * A sejttérbe "ELOlényeket" helyezünk, ez a "sikló".
151
 * Adott irányban halad, másolja magát a sejttérben.
152
 * Az ELOlény ismertetését lásd például a
153
 * [MATEK JÁTÉK] hivatkozásban (Csákány Béla: Diszkrét
154
 * matematikai játékok. Polygon, Szeged 1998. 172. oldal.)
155
 *
156
 * @param   racs    a sejttér ahová ezt az állatkát helyezzük
157
 * @param   x       a befoglaló tégla bal felsõ sarkának oszlopa
158
 * @param   y       a befoglaló tégla bal felsõ sarkának sora
159
 */
160
void SejtAblak::siklo(bool **racs, int x, int y) {
161
162
    racs[y+ 0][x+ 2] = ELO;
163
    racs[y+ 1][x+ 1] = ELO;
164
    racs[y+ 2][x+ 1] = ELO;
165
    racs[y+ 2][x+ 2] = ELO;
166
    racs[y+ 2][x+ 3] = ELO;
167
168
}
169
/**
170
 * A sejttérbe "ELOlényeket" helyezünk, ez a "sikló ágyú".
171
 * Adott irányban siklókat lõ ki.
172
 * Az ELOlény ismertetését lásd például a
173
 * [MATEK JÁTÉK] hivatkozásban /Csákány Béla: Diszkrét
174
 * matematikai játékok. Polygon, Szeged 1998. 173. oldal./,
175
 * de itt az ábra hibás, egy oszloppal told még balra a
176
 * bal oldali 4 sejtes négyzetet. A helyes ágyú rajzát
177
 * lásd pl. az [ÉLET CIKK] hivatkozásban /Robert T.
178
 * Wainwright: Life is Universal./ (Megemlíthetjük, hogy
179
 * mindkettõ tartalmaz két felesleges sejtet is.)
180
 *
181
 * @param   racs    a sejttér ahová ezt az állatkát helyezzük
182
 * @param   x       a befoglaló tégla bal felsõ sarkának oszlopa
183
 * @param   y       a befoglaló tégla bal felsõ sarkának sora
184
 */
185
void SejtAblak::sikloKilovo(bool **racs, int x, int y) {
186
187
    racs[y+ 6][x+ 0] = ELO;
188
    racs[y+ 6][x+ 1] = ELO;
189
    racs[y+ 7][x+ 0] = ELO;
190
    racs[y+ 7][x+ 1] = ELO;
191
192
    racs[y+ 3][x+ 13] = ELO;
193
194
    racs[y+ 4][x+ 12] = ELO;
195
    racs[y+ 4][x+ 14] = ELO;
196
197
    racs[y+ 5][x+ 11] = ELO;
198
    racs[y+ 5][x+ 15] = ELO;
199
    racs[y+ 5][x+ 16] = ELO;
200
    racs[y+ 5][x+ 25] = ELO;
201
202
    racs[y+ 6][x+ 11] = ELO;
203
    racs[y+ 6][x+ 15] = ELO;
204
    racs[y+ 6][x+ 16] = ELO;
205
    racs[y+ 6][x+ 22] = ELO;
206
    racs[y+ 6][x+ 23] = ELO;
207
    racs[y+ 6][x+ 24] = ELO;
208
    racs[y+ 6][x+ 25] = ELO;
209
210
    racs[y+ 7][x+ 11] = ELO;
211
    racs[y+ 7][x+ 15] = ELO;
212
    racs[y+ 7][x+ 16] = ELO;
213
    racs[y+ 7][x+ 21] = ELO;
214
    racs[y+ 7][x+ 22] = ELO;
215
    racs[y+ 7][x+ 23] = ELO;
216
    racs[y+ 7][x+ 24] = ELO;
217
218
    racs[y+ 8][x+ 12] = ELO;
219
    racs[y+ 8][x+ 14] = ELO;
220
    racs[y+ 8][x+ 21] = ELO;
221
    racs[y+ 8][x+ 24] = ELO;
222
    racs[y+ 8][x+ 34] = ELO;
223
    racs[y+ 8][x+ 35] = ELO;
224
225
    racs[y+ 9][x+ 13] = ELO;
226
    racs[y+ 9][x+ 21] = ELO;
227
    racs[y+ 9][x+ 22] = ELO;
228
    racs[y+ 9][x+ 23] = ELO;
229
    racs[y+ 9][x+ 24] = ELO;
230
    racs[y+ 9][x+ 34] = ELO;
231
    racs[y+ 9][x+ 35] = ELO;
232
233
    racs[y+ 10][x+ 22] = ELO;
234
    racs[y+ 10][x+ 23] = ELO;
235
    racs[y+ 10][x+ 24] = ELO;
236
    racs[y+ 10][x+ 25] = ELO;
237
238
    racs[y+ 11][x+ 25] = ELO;
239
240
}
241
242
sejtszal.cpp:
243
244
// sejtszal.cpp
245
//
246
// Életjáték rajzoló
247
// Programozó Páternoszter
248
//
249
// Copyright (C) 2011, Bátfai Norbert, nbatfai@inf.unideb.hu, nbatfai@gmail.com
250
//                     cellSigma, bari.sandor@gmail.com
251
//
252
// This program is free software: you can redistribute it and/or modify
253
// it under the terms of the GNU General Public License as published by
254
// the Free Software Foundation, either version 3 of the License, or
255
// (at your option) any later version.
256
//
257
// This program is distributed in the hope that it will be useful,
258
// but WITHOUT ANY WARRANTY; without even the implied warranty of
259
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
260
// GNU General Public License for more details.
261
//
262
// You should have received a copy of the GNU General Public License
263
// along with this program.  If not, see <http://www.gnu.org/licenses/>.
264
//
265
// Ez a program szabad szoftver; terjeszthetõ illetve módosítható a
266
// Free Software Foundation által kiadott GNU General Public License
267
// dokumentumában leírtak; akár a licenc 3-as, akár (tetszõleges) késõbbi
268
// változata szerint.
269
//
270
// Ez a program abban a reményben kerül közreadásra, hogy hasznos lesz,
271
// de minden egyéb GARANCIA NÉLKÜL, az ELADHATÓSÁGRA vagy VALAMELY CÉLRA
272
// VALÓ ALKALMAZHATÓSÁGRA való származtatott garanciát is beleértve.
273
// További részleteket a GNU General Public License tartalmaz.
274
//
275
// A felhasználónak a programmal együtt meg kell kapnia a GNU General
276
// Public License egy példányát; ha mégsem kapta meg, akkor
277
// tekintse meg a <http://www.gnu.org/licenses/> oldalon.
278
//
279
//
280
// Version history:
281
//
282
// 0.0.1    A két osztály tervezésének fõ szempontja az volt, hogy
283
// ne vagy alig különbözzön az elsõ C++-os példától, a Mandelostól:
284
// http://progpater.blog.hu/2011/02/26/tan_csodallak_amde_nem_ertelek_de_kepzetem_hegyvolgyedet_bejarja
285
// ezért az olyan kényesebb dolgokkal, hogy kezeljük a racsIndex-et a
286
// két osztályra bontott C++ megoldásban, amikor írjuk át a Javásból, nem foglalkoztunk
287
// a kiinduló Javás: http://www.tankonyvtar.hu/informatika/javat-tanitok-1-2-080904-1
288
// (a bazár eszme: „Release Early, Release Often" írjuk ki a posztra)
289
//
290-
//továbbítja neki racsIndex új értékét,SejtAblak az eddigi this pointer helyett szintén slot-signal kommunikácóval állítja
290+
291-
//saját racsIndex változóját SejtSzal szignálja alapján. /cellSigma/
291+
//továbbítja neki racsIndex új értékét,SejtAblak az eddigi this pointer helyett szintén 
292
//slot-signal kommunikácóval állítja saját racsIndex változóját 
293
//SejtSzal szignálja alapján. /cellSigma/
294
295
#include "sejtszal.h"
296
297
SejtSzal::SejtSzal(bool ***racsok, int szelesseg, int magassag, int varakozas, SejtAblak *sejtAblak)
298
{
299
    this->racsok = racsok;
300
    this->szelesseg = szelesseg;
301
    this->magassag = magassag;
302
    this->varakozas = varakozas;
303
    this->sejtAblak = sejtAblak;
304
    QTObject:connect(this, SIGNAL(vissza_signal(int)), sejtAblak, SLOT(vissza_slot(int)));
305
    racsIndex = 0;
306
}
307
308
/**
309
   * Az kérdezett állapotban lévõ nyolcszomszédok száma.
310
   *
311
   * @param   rács    a sejttér rács
312
   * @param   sor     a rács vizsgált sora
313
   * @param   oszlop  a rács vizsgált oszlopa
314
   * @param   állapor a nyolcszomszédok vizsgált állapota
315
   * @return int a kérdezett állapotbeli nyolcszomszédok száma.
316
   */
317
int SejtSzal::szomszedokSzama(bool **racs,
318
                              int sor, int oszlop, bool allapot) {
319
    int allapotuSzomszed = 0;
320
    // A nyolcszomszédok végigzongorázása:
321
    for(int i=-1; i<2; ++i)
322
        for(int j=-1; j<2; ++j)
323
            // A vizsgált sejtet magát kihagyva:
324
            if(!((i==0) && (j==0))) {
325
        // A sejttérbõl szélének szomszédai
326
        // a szembe oldalakon ("periódikus határfeltétel")
327
        int o = oszlop + j;
328
        if(o < 0)
329
            o = szelesseg-1;
330
        else if(o >= szelesseg)
331
            o = 0;
332
333
        int s = sor + i;
334
        if(s < 0)
335
            s = magassag-1;
336
        else if(s >= magassag)
337
            s = 0;
338
339
        if(racs[s][o] == allapot)
340
            ++allapotuSzomszed;
341
    }
342
343
    return allapotuSzomszed;
344
}
345
346
/**
347
 * A sejttér idõbeli fejlõdése a John H. Conway féle
348
 * életjáték sejtautomata szabályai alapján történik.
349
 * A szabályok részletes ismertetését lásd például a
350
 * [MATEK JÁTÉK] hivatkozásban (Csákány Béla: Diszkrét
351
 * matematikai játékok. Polygon, Szeged 1998. 171. oldal.)
352
 */
353
void SejtSzal::idoFejlodes() {
354
355
    bool **racsElotte = racsok[racsIndex];
356
    bool **racsUtana = racsok[(racsIndex+1)%2];
357
358
    for(int i=0; i<magassag; ++i) { // sorok
359
        for(int j=0; j<szelesseg; ++j) { // oszlopok
360
361
            int elok = szomszedokSzama(racsElotte, i, j, SejtAblak::ELO);
362
363
            if(racsElotte[i][j] == SejtAblak::ELO) {
364
                /* Élõ élõ marad, ha kettõ vagy három élõ
365
             szomszedja van, különben halott lesz. */
366
                if(elok==2 || elok==3)
367
                    racsUtana[i][j] = SejtAblak::ELO;
368
                else
369
                    racsUtana[i][j] = SejtAblak::HALOTT;
370
            }  else {
371
                /* Halott halott marad, ha három élõ
372
             szomszedja van, különben élõ lesz. */
373
                if(elok==3)
374
                    racsUtana[i][j] = SejtAblak::ELO;
375
                else
376
                    racsUtana[i][j] = SejtAblak::HALOTT;
377
            }
378
        }
379
    }
380
    racsIndex = (racsIndex+1)%2;
381
}
382
383
384
/** A sejttér idõbeli fejlõdése. */
385
void SejtSzal::run()
386
{
387
    while(true) {
388
        QThread::msleep(varakozas);
389
        idoFejlodes();
390
        emit vissza_signal(racsIndex);
391
    }
392
393
}
394
395
SejtSzal::~SejtSzal()
396
{
397
}