Advertisement
Guest User

Conway slot-signal2

a guest
Mar 23rd, 2013
21
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 13.47 KB | None | 0 0
  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
  51. //saját racsIndex változóját SejtSzal szignálja alapján. /cellSigma/
  52.  
  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. // 0.0.2    A SejtSzal osztály a QT slot-signal kommunikációját használja SejtAblak elérésére, így
  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
  291. //saját racsIndex változóját SejtSzal szignálja alapján. /cellSigma/
  292.  
  293.  
  294. #include "sejtszal.h"
  295.  
  296. SejtSzal::SejtSzal(bool ***racsok, int szelesseg, int magassag, int varakozas, SejtAblak *sejtAblak)
  297. {
  298.     this->racsok = racsok;
  299.     this->szelesseg = szelesseg;
  300.     this->magassag = magassag;
  301.     this->varakozas = varakozas;
  302.     this->sejtAblak = sejtAblak;
  303.     QTObject:connect(this, SIGNAL(vissza_signal(int)), sejtAblak, SLOT(vissza_slot(int)));
  304.     racsIndex = 0;
  305. }
  306.  
  307. /**
  308.    * Az kérdezett állapotban lévõ nyolcszomszédok száma.
  309.    *
  310.    * @param   rács    a sejttér rács
  311.    * @param   sor     a rács vizsgált sora
  312.    * @param   oszlop  a rács vizsgált oszlopa
  313.    * @param   állapor a nyolcszomszédok vizsgált állapota
  314.    * @return int a kérdezett állapotbeli nyolcszomszédok száma.
  315.    */
  316. int SejtSzal::szomszedokSzama(bool **racs,
  317.                               int sor, int oszlop, bool allapot) {
  318.     int allapotuSzomszed = 0;
  319.     // A nyolcszomszédok végigzongorázása:
  320.     for(int i=-1; i<2; ++i)
  321.         for(int j=-1; j<2; ++j)
  322.             // A vizsgált sejtet magát kihagyva:
  323.             if(!((i==0) && (j==0))) {
  324.         // A sejttérbõl szélének szomszédai
  325.         // a szembe oldalakon ("periódikus határfeltétel")
  326.         int o = oszlop + j;
  327.         if(o < 0)
  328.             o = szelesseg-1;
  329.         else if(o >= szelesseg)
  330.             o = 0;
  331.  
  332.         int s = sor + i;
  333.         if(s < 0)
  334.             s = magassag-1;
  335.         else if(s >= magassag)
  336.             s = 0;
  337.  
  338.         if(racs[s][o] == allapot)
  339.             ++allapotuSzomszed;
  340.     }
  341.  
  342.     return allapotuSzomszed;
  343. }
  344.  
  345. /**
  346.  * A sejttér idõbeli fejlõdése a John H. Conway féle
  347.  * életjáték sejtautomata szabályai alapján történik.
  348.  * A szabályok részletes ismertetését lásd például a
  349.  * [MATEK JÁTÉK] hivatkozásban (Csákány Béla: Diszkrét
  350.  * matematikai játékok. Polygon, Szeged 1998. 171. oldal.)
  351.  */
  352. void SejtSzal::idoFejlodes() {
  353.  
  354.     bool **racsElotte = racsok[racsIndex];
  355.     bool **racsUtana = racsok[(racsIndex+1)%2];
  356.  
  357.     for(int i=0; i<magassag; ++i) { // sorok
  358.         for(int j=0; j<szelesseg; ++j) { // oszlopok
  359.  
  360.             int elok = szomszedokSzama(racsElotte, i, j, SejtAblak::ELO);
  361.  
  362.             if(racsElotte[i][j] == SejtAblak::ELO) {
  363.                 /* Élõ élõ marad, ha kettõ vagy három élõ
  364.              szomszedja van, különben halott lesz. */
  365.                 if(elok==2 || elok==3)
  366.                     racsUtana[i][j] = SejtAblak::ELO;
  367.                 else
  368.                     racsUtana[i][j] = SejtAblak::HALOTT;
  369.             }  else {
  370.                 /* Halott halott marad, ha három élõ
  371.              szomszedja van, különben élõ lesz. */
  372.                 if(elok==3)
  373.                     racsUtana[i][j] = SejtAblak::ELO;
  374.                 else
  375.                     racsUtana[i][j] = SejtAblak::HALOTT;
  376.             }
  377.         }
  378.     }
  379.     racsIndex = (racsIndex+1)%2;
  380. }
  381.  
  382.  
  383. /** A sejttér idõbeli fejlõdése. */
  384. void SejtSzal::run()
  385. {
  386.     while(true) {
  387.         QThread::msleep(varakozas);
  388.         idoFejlodes();
  389.         emit vissza_signal(racsIndex);
  390.     }
  391.  
  392. }
  393.  
  394. SejtSzal::~SejtSzal()
  395. {
  396. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement