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