Advertisement
Guest User

Conway slot-signal

a guest
Mar 23rd, 2013
261
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 15.13 KB | None | 0 0
  1. sejtablak.h
  2.  
  3. #ifndef SEJTABLAK_H
  4. #define SEJTABLAK_H
  5.  
  6. #include <QtGui/QMainWindow>
  7. #include <QPainter>
  8. #include "sejtszal.h"
  9.  
  10. class SejtSzal;
  11.  
  12. class SejtAblak : public QMainWindow
  13. {
  14.     Q_OBJECT
  15.  
  16. public:
  17.     SejtAblak(int szelesseg = 100, int magassag = 75, QWidget *parent = 0);
  18.     ~SejtAblak();
  19.     // Egy sejt lehet élõ
  20.     static const bool ELO = true;
  21.     // vagy halott
  22.     static const bool HALOTT = false;
  23.  
  24. signals:
  25.     void newRacsIndexValue(int racsIndex);
  26. public slots:
  27.     void vissza_slot(int racsIndex);
  28.     void setRacsIndex(int value);
  29. protected:
  30.     // Két rácsot használunk majd, az egyik a sejttér állapotát
  31.     // a t_n, a másik a t_n+1 idõpillanatban jellemzi.
  32.     bool ***racsok;
  33.     // Valamelyik rácsra mutat, technikai jellegû, hogy ne kelljen a
  34.     // [2][][]-ból az elsõ dimenziót használni, mert vagy az egyikre
  35.     // állítjuk, vagy a másikra.
  36.     bool **racs;
  37.     // Megmutatja melyik rács az aktuális: [rácsIndex][][]
  38.     int racsIndex;
  39.     // Pixelben egy cella adatai.
  40.     int cellaSzelesseg;
  41.     int cellaMagassag;
  42.     // A sejttér nagysága, azaz hányszor hány cella van?
  43.     int szelesseg;
  44.     int magassag;
  45.     void paintEvent(QPaintEvent*);
  46.     void siklo(bool **racs, int x, int y);
  47.     void sikloKilovo(bool **racs, int x, int y);
  48.  
  49. private:
  50.     SejtSzal* eletjatek;
  51.  
  52. };
  53.  
  54. #endif // SEJTABLAK_H
  55.  
  56. sejtszal.h
  57.  
  58. #ifndef SEJTSZAL_H
  59. #define SEJTSZAL_H
  60.  
  61. #include <QThread>
  62. #include "sejtablak.h"
  63.  
  64. class SejtAblak;
  65.  
  66. class SejtSzal : public QThread
  67. {
  68.     Q_OBJECT
  69.  
  70. public:
  71.     SejtSzal(bool ***racsok, int szelesseg, int magassag,
  72.              int varakozas, SejtAblak *sejtAblak);
  73.     ~SejtSzal();
  74.     void run();
  75.  
  76. signals:
  77.     void vissza_signal(int);
  78.  
  79. protected:
  80.     bool ***racsok;
  81.     int szelesseg, magassag;
  82.     // Megmutatja melyik rács az aktuális: [rácsIndex][][]
  83.     int racsIndex;
  84.     // A sejttér két egymást követõ t_n és t_n+1 diszkrét idõpillanata
  85.     // közötti valós idõ.
  86.     int varakozas;
  87.     void idoFejlodes();
  88.     int szomszedokSzama(bool **racs,
  89.                         int sor, int oszlop, bool allapot);
  90.     SejtAblak* sejtAblak;
  91.  
  92. };
  93.  
  94. #endif // SEJTSZAL_H
  95.  
  96. sejtablak.cpp:
  97.  
  98. // sejtablak.cpp
  99. //
  100. // Életjáték rajzoló
  101. // Programozó Páternoszter
  102. //
  103. // Copyright (C) 2011, Bátfai Norbert, nbatfai@inf.unideb.hu, nbatfai@gmail.com
  104. //
  105. // This program is free software: you can redistribute it and/or modify
  106. // it under the terms of the GNU General Public License as published by
  107. // the Free Software Foundation, either version 3 of the License, or
  108. // (at your option) any later version.
  109. //
  110. // This program is distributed in the hope that it will be useful,
  111. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  112. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  113. // GNU General Public License for more details.
  114. //
  115. // You should have received a copy of the GNU General Public License
  116. // along with this program.  If not, see <http://www.gnu.org/licenses/>.
  117. //
  118. // Ez a program szabad szoftver; terjeszthetõ illetve módosítható a
  119. // Free Software Foundation által kiadott GNU General Public License
  120. // dokumentumában leírtak; akár a licenc 3-as, akár (tetszõleges) késõbbi
  121. // változata szerint.
  122. //
  123. // Ez a program abban a reményben kerül közreadásra, hogy hasznos lesz,
  124. // de minden egyéb GARANCIA NÉLKÜL, az ELADHATÓSÁGRA vagy VALAMELY CÉLRA
  125. // VALÓ ALKALMAZHATÓSÁGRA való származtatott garanciát is beleértve.
  126. // További részleteket a GNU General Public License tartalmaz.
  127. //
  128. // A felhasználónak a programmal együtt meg kell kapnia a GNU General
  129. // Public License egy példányát; ha mégsem kapta meg, akkor
  130. // tekintse meg a <http://www.gnu.org/licenses/> oldalon.
  131. //
  132. //
  133. // Version history:
  134. //
  135. // 0.0.1    A két osztály tervezésének fõ szempontja az volt, hogy
  136. // ne vagy alig különbözzön az elsõ C++-os példától, a Mandelostól:
  137. // http://progpater.blog.hu/2011/02/26/tan_csodallak_amde_nem_ertelek_de_kepzetem_hegyvolgyedet_bejarja
  138. // ezért az olyan kényesebb dolgokkal, hogy kezeljük a racsIndex-et a
  139. // két osztályra bontott C++ megoldásban, amikor írjuk át a Javásból, nem foglalkoztunk
  140. // a kiinduló Javás: http://www.tankonyvtar.hu/informatika/javat-tanitok-1-2-080904-1
  141. // (a bazár eszme: „Release Early, Release Often" írjuk ki a posztra)
  142. //
  143.  
  144. #include "sejtablak.h"
  145.  
  146. SejtAblak::SejtAblak(int szelesseg, int magassag, QWidget *parent)
  147.     : QMainWindow(parent)
  148. {
  149.     setWindowTitle("A John Horton Conway-féle életjáték");
  150.  
  151.     this->magassag = magassag;
  152.     this->szelesseg = szelesseg;
  153.  
  154.     cellaSzelesseg = 6;
  155.     cellaMagassag = 6;
  156.  
  157.     setFixedSize(QSize(szelesseg*cellaSzelesseg, magassag*cellaMagassag));
  158.  
  159.     racsok = new bool**[2];
  160.     racsok[0] = new bool*[magassag];
  161.     for(int i=0; i<magassag; ++i)
  162.         racsok[0][i] = new bool [szelesseg];
  163.     racsok[1] = new bool*[magassag];
  164.     for(int i=0; i<magassag; ++i)
  165.         racsok[1][i] = new bool [szelesseg];
  166.     QObject:connect(this, SIGNAL(newRacsIndexValue(int)), this, SLOT(setRacsIndex(int)));
  167.  
  168.     racsIndex = 0;
  169.     racs = racsok[racsIndex];
  170.     // A kiinduló racs minden cellája HALOTT
  171.     for(int i=0; i<magassag; ++i)
  172.         for(int j=0; j<szelesseg; ++j)
  173.             racs[i][j] = HALOTT;
  174.     // A kiinduló racsra "ELOlényeket" helyezünk
  175.     //siklo(racs, 2, 2);
  176.     sikloKilovo(racs, 5, 60);
  177.  
  178.  
  179.     eletjatek = new SejtSzal(racsok, szelesseg, magassag, 120, this);
  180.     eletjatek->start();
  181.  
  182. }
  183.  
  184. void SejtAblak::paintEvent(QPaintEvent*) {
  185.     QPainter qpainter(this);
  186.  
  187.     // Az aktuális
  188.     bool **racs = racsok[racsIndex];
  189.     // racsot rajzoljuk ki:
  190.     for(int i=0; i<magassag; ++i) { // végig lépked a sorokon
  191.         for(int j=0; j<szelesseg; ++j) { // s az oszlopok
  192.             // Sejt cella kirajzolása
  193.             if(racs[i][j] == ELO)
  194.                 qpainter.fillRect(j*cellaSzelesseg, i*cellaMagassag,
  195.                                   cellaSzelesseg, cellaMagassag, Qt::black);
  196.             else
  197.                 qpainter.fillRect(j*cellaSzelesseg, i*cellaMagassag,
  198.                                   cellaSzelesseg, cellaMagassag, Qt::white);
  199.             qpainter.setPen(QPen(Qt::gray, 1));
  200.  
  201.             qpainter.drawRect(j*cellaSzelesseg, i*cellaMagassag,
  202.                               cellaSzelesseg, cellaMagassag);
  203.         }
  204.     }
  205.  
  206.     qpainter.end();
  207. }
  208.  
  209.  
  210. SejtAblak::~SejtAblak()
  211. {
  212.     delete eletjatek;
  213.  
  214.     for(int i=0; i<magassag; ++i) {
  215.         delete[] racsok[0][i];
  216.         delete[] racsok[1][i];
  217.     }
  218.  
  219.     delete[] racsok[0];
  220.     delete[] racsok[1];
  221.     delete[] racsok;
  222.  
  223.  
  224. }
  225.  
  226. void SejtAblak::vissza_slot(int racsIndex)
  227. {
  228.     emit newRacsIndexValue(racsIndex); //this->racsIndex = racsIndex;
  229.     update();
  230. }
  231.  
  232. void SejtAblak::setRacsIndex(int value)
  233. {
  234.    racsIndex=value;
  235. }
  236.  
  237. /**
  238.  * A sejttérbe "ELOlényeket" helyezünk, ez a "sikló".
  239.  * Adott irányban halad, másolja magát a sejttérben.
  240.  * Az ELOlény ismertetését lásd például a
  241.  * [MATEK JÁTÉK] hivatkozásban (Csákány Béla: Diszkrét
  242.  * matematikai játékok. Polygon, Szeged 1998. 172. oldal.)
  243.  *
  244.  * @param   racs    a sejttér ahová ezt az állatkát helyezzük
  245.  * @param   x       a befoglaló tégla bal felsõ sarkának oszlopa
  246.  * @param   y       a befoglaló tégla bal felsõ sarkának sora
  247.  */
  248. void SejtAblak::siklo(bool **racs, int x, int y) {
  249.  
  250.     racs[y+ 0][x+ 2] = ELO;
  251.     racs[y+ 1][x+ 1] = ELO;
  252.     racs[y+ 2][x+ 1] = ELO;
  253.     racs[y+ 2][x+ 2] = ELO;
  254.     racs[y+ 2][x+ 3] = ELO;
  255.  
  256. }
  257. /**
  258.  * A sejttérbe "ELOlényeket" helyezünk, ez a "sikló ágyú".
  259.  * Adott irányban siklókat lõ ki.
  260.  * Az ELOlény ismertetését lásd például a
  261.  * [MATEK JÁTÉK] hivatkozásban /Csákány Béla: Diszkrét
  262.  * matematikai játékok. Polygon, Szeged 1998. 173. oldal./,
  263.  * de itt az ábra hibás, egy oszloppal told még balra a
  264.  * bal oldali 4 sejtes négyzetet. A helyes ágyú rajzát
  265.  * lásd pl. az [ÉLET CIKK] hivatkozásban /Robert T.
  266.  * Wainwright: Life is Universal./ (Megemlíthetjük, hogy
  267.  * mindkettõ tartalmaz két felesleges sejtet is.)
  268.  *
  269.  * @param   racs    a sejttér ahová ezt az állatkát helyezzük
  270.  * @param   x       a befoglaló tégla bal felsõ sarkának oszlopa
  271.  * @param   y       a befoglaló tégla bal felsõ sarkának sora
  272.  */
  273. void SejtAblak::sikloKilovo(bool **racs, int x, int y) {
  274.  
  275.     racs[y+ 6][x+ 0] = ELO;
  276.     racs[y+ 6][x+ 1] = ELO;
  277.     racs[y+ 7][x+ 0] = ELO;
  278.     racs[y+ 7][x+ 1] = ELO;
  279.  
  280.     racs[y+ 3][x+ 13] = ELO;
  281.  
  282.     racs[y+ 4][x+ 12] = ELO;
  283.     racs[y+ 4][x+ 14] = ELO;
  284.  
  285.     racs[y+ 5][x+ 11] = ELO;
  286.     racs[y+ 5][x+ 15] = ELO;
  287.     racs[y+ 5][x+ 16] = ELO;
  288.     racs[y+ 5][x+ 25] = ELO;
  289.  
  290.     racs[y+ 6][x+ 11] = ELO;
  291.     racs[y+ 6][x+ 15] = ELO;
  292.     racs[y+ 6][x+ 16] = ELO;
  293.     racs[y+ 6][x+ 22] = ELO;
  294.     racs[y+ 6][x+ 23] = ELO;
  295.     racs[y+ 6][x+ 24] = ELO;
  296.     racs[y+ 6][x+ 25] = ELO;
  297.  
  298.     racs[y+ 7][x+ 11] = ELO;
  299.     racs[y+ 7][x+ 15] = ELO;
  300.     racs[y+ 7][x+ 16] = ELO;
  301.     racs[y+ 7][x+ 21] = ELO;
  302.     racs[y+ 7][x+ 22] = ELO;
  303.     racs[y+ 7][x+ 23] = ELO;
  304.     racs[y+ 7][x+ 24] = ELO;
  305.  
  306.     racs[y+ 8][x+ 12] = ELO;
  307.     racs[y+ 8][x+ 14] = ELO;
  308.     racs[y+ 8][x+ 21] = ELO;
  309.     racs[y+ 8][x+ 24] = ELO;
  310.     racs[y+ 8][x+ 34] = ELO;
  311.     racs[y+ 8][x+ 35] = ELO;
  312.  
  313.     racs[y+ 9][x+ 13] = ELO;
  314.     racs[y+ 9][x+ 21] = ELO;
  315.     racs[y+ 9][x+ 22] = ELO;
  316.     racs[y+ 9][x+ 23] = ELO;
  317.     racs[y+ 9][x+ 24] = ELO;
  318.     racs[y+ 9][x+ 34] = ELO;
  319.     racs[y+ 9][x+ 35] = ELO;
  320.  
  321.     racs[y+ 10][x+ 22] = ELO;
  322.     racs[y+ 10][x+ 23] = ELO;
  323.     racs[y+ 10][x+ 24] = ELO;
  324.     racs[y+ 10][x+ 25] = ELO;
  325.  
  326.     racs[y+ 11][x+ 25] = ELO;
  327.  
  328. }
  329.  
  330. sejtszal.cpp
  331.  
  332. // sejtszal.cpp
  333. //
  334. // Életjáték rajzoló
  335. // Programozó Páternoszter
  336. //
  337. // Copyright (C) 2011, Bátfai Norbert, nbatfai@inf.unideb.hu, nbatfai@gmail.com
  338. //
  339. // This program is free software: you can redistribute it and/or modify
  340. // it under the terms of the GNU General Public License as published by
  341. // the Free Software Foundation, either version 3 of the License, or
  342. // (at your option) any later version.
  343. //
  344. // This program is distributed in the hope that it will be useful,
  345. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  346. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  347. // GNU General Public License for more details.
  348. //
  349. // You should have received a copy of the GNU General Public License
  350. // along with this program.  If not, see <http://www.gnu.org/licenses/>.
  351. //
  352. // Ez a program szabad szoftver; terjeszthetõ illetve módosítható a
  353. // Free Software Foundation által kiadott GNU General Public License
  354. // dokumentumában leírtak; akár a licenc 3-as, akár (tetszõleges) késõbbi
  355. // változata szerint.
  356. //
  357. // Ez a program abban a reményben kerül közreadásra, hogy hasznos lesz,
  358. // de minden egyéb GARANCIA NÉLKÜL, az ELADHATÓSÁGRA vagy VALAMELY CÉLRA
  359. // VALÓ ALKALMAZHATÓSÁGRA való származtatott garanciát is beleértve.
  360. // További részleteket a GNU General Public License tartalmaz.
  361. //
  362. // A felhasználónak a programmal együtt meg kell kapnia a GNU General
  363. // Public License egy példányát; ha mégsem kapta meg, akkor
  364. // tekintse meg a <http://www.gnu.org/licenses/> oldalon.
  365. //
  366. //
  367. // Version history:
  368. //
  369. // 0.0.1    A két osztály tervezésének fõ szempontja az volt, hogy
  370. // ne vagy alig különbözzön az elsõ C++-os példától, a Mandelostól:
  371. // http://progpater.blog.hu/2011/02/26/tan_csodallak_amde_nem_ertelek_de_kepzetem_hegyvolgyedet_bejarja
  372. // ezért az olyan kényesebb dolgokkal, hogy kezeljük a racsIndex-et a
  373. // két osztályra bontott C++ megoldásban, amikor írjuk át a Javásból, nem foglalkoztunk
  374. // a kiinduló Javás: http://www.tankonyvtar.hu/informatika/javat-tanitok-1-2-080904-1
  375. // (a bazár eszme: „Release Early, Release Often" írjuk ki a posztra)
  376. //
  377.  
  378. #include "sejtszal.h"
  379.  
  380. SejtSzal::SejtSzal(bool ***racsok, int szelesseg, int magassag, int varakozas, SejtAblak *sejtAblak)
  381. {
  382.     this->racsok = racsok;
  383.     this->szelesseg = szelesseg;
  384.     this->magassag = magassag;
  385.     this->varakozas = varakozas;
  386.     this->sejtAblak = sejtAblak;
  387.     QTObject:connect(this, SIGNAL(vissza_signal(int)), sejtAblak, SLOT(vissza_slot(int)));
  388.     racsIndex = 0;
  389. }
  390.  
  391. /**
  392.    * Az kérdezett állapotban lévõ nyolcszomszédok száma.
  393.    *
  394.    * @param   rács    a sejttér rács
  395.    * @param   sor     a rács vizsgált sora
  396.    * @param   oszlop  a rács vizsgált oszlopa
  397.    * @param   állapor a nyolcszomszédok vizsgált állapota
  398.    * @return int a kérdezett állapotbeli nyolcszomszédok száma.
  399.    */
  400. int SejtSzal::szomszedokSzama(bool **racs,
  401.                               int sor, int oszlop, bool allapot) {
  402.     int allapotuSzomszed = 0;
  403.     // A nyolcszomszédok végigzongorázása:
  404.     for(int i=-1; i<2; ++i)
  405.         for(int j=-1; j<2; ++j)
  406.             // A vizsgált sejtet magát kihagyva:
  407.             if(!((i==0) && (j==0))) {
  408.         // A sejttérbõl szélének szomszédai
  409.         // a szembe oldalakon ("periódikus határfeltétel")
  410.         int o = oszlop + j;
  411.         if(o < 0)
  412.             o = szelesseg-1;
  413.         else if(o >= szelesseg)
  414.             o = 0;
  415.  
  416.         int s = sor + i;
  417.         if(s < 0)
  418.             s = magassag-1;
  419.         else if(s >= magassag)
  420.             s = 0;
  421.  
  422.         if(racs[s][o] == allapot)
  423.             ++allapotuSzomszed;
  424.     }
  425.  
  426.     return allapotuSzomszed;
  427. }
  428.  
  429. /**
  430.  * A sejttér idõbeli fejlõdése a John H. Conway féle
  431.  * életjáték sejtautomata szabályai alapján történik.
  432.  * A szabályok részletes ismertetését lásd például a
  433.  * [MATEK JÁTÉK] hivatkozásban (Csákány Béla: Diszkrét
  434.  * matematikai játékok. Polygon, Szeged 1998. 171. oldal.)
  435.  */
  436. void SejtSzal::idoFejlodes() {
  437.  
  438.     bool **racsElotte = racsok[racsIndex];
  439.     bool **racsUtana = racsok[(racsIndex+1)%2];
  440.  
  441.     for(int i=0; i<magassag; ++i) { // sorok
  442.         for(int j=0; j<szelesseg; ++j) { // oszlopok
  443.  
  444.             int elok = szomszedokSzama(racsElotte, i, j, SejtAblak::ELO);
  445.  
  446.             if(racsElotte[i][j] == SejtAblak::ELO) {
  447.                 /* Élõ élõ marad, ha kettõ vagy három élõ
  448.              szomszedja van, különben halott lesz. */
  449.                 if(elok==2 || elok==3)
  450.                     racsUtana[i][j] = SejtAblak::ELO;
  451.                 else
  452.                     racsUtana[i][j] = SejtAblak::HALOTT;
  453.             }  else {
  454.                 /* Halott halott marad, ha három élõ
  455.              szomszedja van, különben élõ lesz. */
  456.                 if(elok==3)
  457.                     racsUtana[i][j] = SejtAblak::ELO;
  458.                 else
  459.                     racsUtana[i][j] = SejtAblak::HALOTT;
  460.             }
  461.         }
  462.     }
  463.     racsIndex = (racsIndex+1)%2;
  464. }
  465.  
  466.  
  467. /** A sejttér idõbeli fejlõdése. */
  468. void SejtSzal::run()
  469. {
  470.     while(true) {
  471.         QThread::msleep(varakozas);
  472.         idoFejlodes();
  473.         emit vissza_signal(racsIndex);
  474.     }
  475.  
  476. }
  477.  
  478. SejtSzal::~SejtSzal()
  479. {
  480. }
  481.  
  482. main.cpp:
  483.  
  484. #include <QtGui/QApplication>
  485. #include "sejtablak.h"
  486.  
  487. int main(int argc, char *argv[])
  488. {
  489.     QApplication a(argc, argv);
  490.     SejtAblak w(100, 75);
  491.     w.show();
  492.  
  493.     return a.exec();
  494. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement