Advertisement
Guest User

Conway slot-signal2

a guest
Mar 23rd, 2013
256
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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
  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. // 0.0.2    A SejtSzal osztály a QT slot-signal kommunikációját használja SejtAblak elérésére, így
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement