摘要:生命游戲規(guī)則生命游戲中,對于任意細(xì)胞每個(gè)細(xì)胞有兩種狀態(tài)存活或死亡。每個(gè)細(xì)胞與以自身為中心的周圍八格細(xì)胞產(chǎn)生互動(dòng)。繁衍函數(shù)死亡函數(shù)生存和死亡函數(shù),由函數(shù)調(diào)用。
生命游戲中,對于任意細(xì)胞:
?? 每個(gè)細(xì)胞有兩種狀態(tài):存活或死亡。每個(gè)細(xì)胞與以自身為中心的周圍八格細(xì)胞產(chǎn)生互動(dòng)。
1.當(dāng)前細(xì)胞為存活狀態(tài)時(shí),當(dāng)周圍的活細(xì)胞低于2個(gè)時(shí), 該細(xì)胞因孤獨(dú)而死亡;
?? 2.當(dāng)前細(xì)胞為存活狀態(tài)時(shí),當(dāng)周圍有2個(gè)或3個(gè)活細(xì)胞時(shí), 該細(xì)胞保持原樣;
?? 3.當(dāng)前細(xì)胞為存活狀態(tài)時(shí),當(dāng)周圍有3個(gè)以上活細(xì)胞時(shí),該細(xì)胞因資源匱乏而死亡;
4.當(dāng)前細(xì)胞為死亡狀態(tài)時(shí),當(dāng)周圍有3個(gè)活細(xì)胞時(shí),該細(xì)胞變成存活狀態(tài)(模擬繁殖)。
活細(xì)胞的周圍只能有2個(gè)或3個(gè)細(xì)胞,否則死亡。
死細(xì)胞的周圍如果有3個(gè)活細(xì)胞,復(fù)活。
否則不變。
黑格代表活細(xì)胞,白格代表死細(xì)胞
設(shè)置widget主頁面的長寬,確定像素范圍。
選取像素寬度,畫線
通過隨機(jī)數(shù)生成隨機(jī)細(xì)胞,使用矩形填充代表細(xì)胞,因?yàn)榫匦斡兴膫€(gè)點(diǎn),我們以左上角的點(diǎn)為樞紐點(diǎn)
確定像素位置關(guān)系后,填充
實(shí)現(xiàn)生命游戲算法函數(shù)
使用定時(shí)器,定時(shí)調(diào)用函數(shù),刷新widget,自動(dòng)調(diào)用painterEvent事件,完成下一次繪畫
#ifndef WIDGET_H#define WIDGET_H#include #include #include #include #include #include #include #include //取整函數(shù)#include //隨機(jī)數(shù)函數(shù)#include //調(diào)式用#include #include // 定時(shí)器#include #define SIZE 800 //6400個(gè)細(xì)胞面板,640000個(gè)像素點(diǎn),數(shù)組保存的是像素面板,不要改#define TIME 100 //定時(shí)器事件間隔,可以改#define Cells 3000 //總共有6400個(gè)方格,首先隨機(jī)生成活細(xì)胞,可以改QT_BEGIN_NAMESPACEnamespace Ui { class Widget; }QT_END_NAMESPACEclass Widget : public QWidget{ Q_OBJECTpublic: Widget(QWidget *parent = nullptr); ~Widget();private: int TimerId; //定時(shí)器ID QVector<QLineF> Lines; //保存線,用于畫方格 QVector<QPair<int,int>> CellsPoint; //保存每個(gè)細(xì)胞的坐標(biāo),用于遍歷時(shí)減少循環(huán),用于繪圖 QVector<QPair<int,int>> NextCellsPoint; //用于存放下一次細(xì)胞矩陣的坐標(biāo),用于繪圖 int LiveCells[SIZE][SIZE]; //用于保存活細(xì)胞的方格,1代表活,0代表死,用于算法 int NextLiveCells[SIZE][SIZE];//用于存放下一次細(xì)胞矩陣的容器 //int (* LiveCells)[SIZE] = new int[SIZE][SIZE]; //int (* NextLiveCells)[SIZE] = new int[SIZE][SIZE]; Ui::Widget *ui;protected: //TopLeft int TopLeft(int x,int y); //TopRight int TopRight(int x,int y); //BottomRight int BottomRight(int x,int y); //BottomLeft int BottomLeft(int x,int y); //BottomSide int BottomSide(int x,int y); //TopSide int TopSide(int x,int y); //RightSide int RightSide(int x,int y); //LeftSide int LeftSide(int x,int y); //Mid int Mid(int x,int y); //面板更新和坐標(biāo)容器更新 void UpData(); //生命游戲算法-生成下一次活細(xì)胞圖 void NextCells(); //繁衍函數(shù) void Multiply(); //死亡函數(shù) bool Death(QPair<int,int> Point); //遍歷四周細(xì)胞函數(shù) int Around(QPair<int,int> Point); //保存畫線的像素點(diǎn) void LinesPoint(); //隨機(jī)生成細(xì)胞函數(shù) void RandomCells(); //重載繪畫事件 //qt里所有的重載函數(shù)都是受保護(hù)的函數(shù) void paintEvent(QPaintEvent *event); //重載定時(shí)器事件 void timerEvent(QTimerEvent *event);private slots: void on_pushButton_Random_clicked(); void on_pushButton_Start_clicked(); void on_pushButton_Stop_clicked();};#endif // WIDGET_H
//TopLeft int TopLeft(int x,int y); //TopRight int TopRight(int x,int y); //BottomRight int BottomRight(int x,int y); //BottomLeft int BottomLeft(int x,int y); //BottomSide int BottomSide(int x,int y); //TopSide int TopSide(int x,int y); //RightSide int RightSide(int x,int y); //LeftSide int LeftSide(int x,int y); //Mid int Mid(int x,int y);
實(shí)現(xiàn)判斷(x,y)處的細(xì)胞周圍的細(xì)胞數(shù),這些函數(shù)由Around函數(shù)調(diào)用實(shí)現(xiàn)。
//繁衍函數(shù) void Multiply(); //死亡函數(shù) bool Death(QPair<int,int> Point);
生存和死亡函數(shù),由NextCells函數(shù)調(diào)用。
//面板更新和坐標(biāo)容器更新 void UpData();
更新函數(shù),完成必要容器和數(shù)組的更新重置
//保存畫線的像素點(diǎn) void LinesPoint();
保存線的點(diǎn)集合
#include "widget.h"#include "ui_widget.h"Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget){ ui->setupUi(this);}Widget::~Widget(){ delete ui;}int Widget::TopLeft(int x,int y){ int around = 0; if(LiveCells[x+10][y] == 1) { around++; } if(LiveCells[x][y+10] == 1) { around++; } if(LiveCells[x+10][y+10] == 1) { around++; //TopLeft } return around;}int Widget::TopSide(int x,int y){ int around = 0; if(LiveCells[x-10][y] == 1) { around++; } if(LiveCells[x+10][y] == 1) { around++; } if(LiveCells[x-10][y+10] == 1) { around++; } if(LiveCells[x][y+10] == 1) { around++; } if(LiveCells[x+10][y+10] == 1) { around++; } return around;}int Widget::TopRight(int x,int y){ int around = 0; if(LiveCells[x-10][y] == 1) { around++; } if(LiveCells[x-10][y+10] == 1) { around++; } if(LiveCells[x][y+10] == 1) { around++; } return around;}int Widget::RightSide(int x,int y){ int around = 0; if(LiveCells[x][y-10] == 1) { around++; } if(LiveCells[x-10][y-10] == 1) { around++; } if(LiveCells[x-10][y] == 1) { around++; } if(LiveCells[x-10][y+10] == 1) { around++; } if(LiveCells[x][y+10] == 1) { around++; } return around;}int Widget::LeftSide(int x,int y){ int around = 0; if(LiveCells[x][y-10] == 1) { around++; } if(LiveCells[x+10][y-10] == 1) { around++; } if(LiveCells[x+10][y] == 1) { around++; } if(LiveCells[x+10][y+10] == 1) { around++; } if(LiveCells[x][y+10] == 1) { around++; } return around;}int Widget::Mid(int x,int y){ int around = 0; if(LiveCells[x-10][y-10] == 1) { around++; //TopLeft } if(LiveCells[x][y-10] == 1) { around++; //TopMid } if(LiveCells[x+10][y-10] == 1) { around++; //TopRight } if(LiveCells[x-10][y] == 1) { around++; //Left } if(LiveCells[x+10][y] == 1) { around++; //Left } if(LiveCells[x-10][y+10] == 1) { around++; //BottomLeft } if(LiveCells[x][y+10] == 1) { around++; //BottomMid } if(LiveCells[x+10][y+10] == 1) { around++; //BottomRight } return around;}int Widget::BottomLeft(int x,int y){ int around = 0; if(LiveCells[x][y-10] == 1) { around++; } if(LiveCells[x+10][y-10] == 1) { around++; } if(LiveCells[x+10][y] == 1) { around++; } return around;}int Widget::BottomSide(int x,int y){ int around = 0; if(LiveCells[x-10][y] == 1) { around++; } if(LiveCells[x-10][y-10] == 1) { around++; } if(LiveCells[x][y-10] == 1) { around++; } if(LiveCells[x+10][y-10] == 1) { around++; } if(LiveCells[x+10][y] == 1) { around++; } return around;}int Widget::BottomRight(int x,int y){ int around = 0; if(LiveCells[x][y-10] == 1) { around++; } if(LiveCells[x-10][y-10] == 1) { around++; } if(LiveCells[x-10][y] == 1) { around++; } return around;}//面板更新和坐標(biāo)容器更新void Widget::UpData(){ CellsPoint.clear(); CellsPoint = NextCellsPoint; // 將下一次細(xì)胞坐標(biāo)賦值給CellsPoint NextCellsPoint.clear(); //清空 for(int i =0;i<SIZE;i++) { for(int j =0;j<SIZE;j++) { LiveCells[i][j] = NextLiveCells[i][j]; } } memset(NextLiveCells, 0, SIZE*SIZE*4); //清空}//生命游戲算法-生成下一次活細(xì)胞坐標(biāo)容器void Widget::NextCells(){ //模擬繁殖,死亡,不變 Multiply(); //面板賦值和坐標(biāo)賦值 UpData(); return;}//模擬繁殖,死亡,不變void Widget::Multiply(){ for(int i=0; i<SIZE; i+=10) { for(int j=0; j<SIZE; j+=10) { if(LiveCells[i][j] == 0) { QPair<int,int> Point(i,j); int around = Around(Point); if(around == 3) { //復(fù)活該細(xì)胞 NextCellsPoint.push_back(Point); //復(fù)活坐標(biāo)容器 NextL
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/122335.html
摘要:工欲善其事必先利其器游戲環(huán)境對比發(fā)表算法在游戲上超過人類之后,游戲研究迅速成為了研究熱點(diǎn)。當(dāng)然這不是網(wǎng)絡(luò)游戲服務(wù)器架構(gòu)概述一架構(gòu)模型現(xiàn)代電子游戲,基本上都會(huì)使用一定的網(wǎng)絡(luò)功能。 每個(gè)程序員都需要知道一些游戲網(wǎng)絡(luò)知識 本文主要針對游戲的網(wǎng)絡(luò)設(shè)計(jì),在文章中目前主流的網(wǎng)絡(luò)游戲?qū)崿F(xiàn)方案都有講解。從Peer-to-Peer 幀同步,客戶端/服務(wù)器(c/s架構(gòu)),客戶端預(yù)測(Client-Side...
摘要:與的特點(diǎn)比較這兩個(gè)目前都是小眾語言做了些時(shí)間的研究寫了點(diǎn)東西有了點(diǎn)心得相似點(diǎn)有衛(wèi)生宏區(qū)別與的不衛(wèi)生宏在類或定義體之外定義函數(shù)代碼沒有分成頭與實(shí)現(xiàn)體例如的頭與實(shí)現(xiàn)的與定義的接口定義與實(shí)現(xiàn)定義是分開的而與是不分開的運(yùn)用函數(shù)式編程高階函數(shù)目前是新 nim與rust的特點(diǎn)比較 這兩個(gè)目前都是小眾語言,做了些時(shí)間的研究,寫了點(diǎn)東西有了點(diǎn)心得 相似點(diǎn): 有衛(wèi)生宏.區(qū)別與C++的(不衛(wèi)生)宏 在類...
閱讀 1847·2021-11-22 15:25
閱讀 3912·2021-11-17 09:33
閱讀 2507·2021-10-12 10:12
閱讀 1801·2021-10-09 09:44
閱讀 3235·2021-10-08 10:04
閱讀 1312·2021-09-29 09:35
閱讀 1947·2019-08-30 12:57
閱讀 1303·2019-08-29 16:22