国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

C++Qt開發(fā)-單線程實(shí)現(xiàn)生命游戲

szysky / 2506人閱讀

摘要:生命游戲規(guī)則生命游戲中,對于任意細(xì)胞每個(gè)細(xì)胞有兩種狀態(tài)存活或死亡。每個(gè)細(xì)胞與以自身為中心的周圍八格細(xì)胞產(chǎn)生互動(dòng)。繁衍函數(shù)死亡函數(shù)生存和死亡函數(shù),由函數(shù)調(diào)用。

生命游戲規(guī)則:

生命游戲中,對于任意細(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ì)胞

QT代碼實(shí)現(xiàn):

0.實(shí)現(xiàn)思路

設(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事件,完成下一次繪畫

1.因?yàn)橐媹D,使用widget類

2.widget.h

#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

函數(shù)功能分析

    //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)集合

widget.cpp

#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

相關(guān)文章

  • 游戲開發(fā)

    摘要:工欲善其事必先利其器游戲環(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...

    Enlightenment 評論0 收藏0
  • [原創(chuàng)]nim與rust的特點(diǎn)比較

    摘要:與的特點(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)生)宏 在類...

    DevTalking 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<