网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
09月15日漏签0天
c++吧 关注:633,177贴子:2,114,879
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 1 2 下一页 尾页
  • 20回复贴,共2页
  • ,跳到 页  
<<返回c++吧
>0< 加载中...

c++生命游戏源码

  • 只看楼主
  • 收藏

  • 回复
  • fzyz999
  • |
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
我最近刚开始学习图形绘制,于是试着写了这样一个简单的程序。我采用的是SDL+OpenGL,由于水平有限,我只会用OpenGL绘制2D图像。源码较为凌乱,风格也偏向C语言,大家见谅。我还是个菜鸟,所以希望大家能够给我一些继续学习的建议,先谢谢大家了。
#include <iostream>
//windows头文件,在别的平台上编译需要替换成相应的头文件。
#include <Windows.h>
/////
#include <sdl/SDL.h>
#include <gl/gl.h>
#include <gl/glu.h>
#include<time.h>
#include <tchar.h>
bool m1[770][1026],m2[770][1026];
void SDL_Process();
void OnPaint();
static void quit_tutorial( int code )
{
     SDL_Quit( );
     exit( code );
}
//生成细胞初始状态
void MapRand()
{
     int i,j;
     srand(time(0));
     for(i=1;i<=768;i++)
     {
         for(j=1;j<=1024;j++)
         {
             m1[i][j]=bool(rand()%2);
             m2[i][j]=m1[i][j];
         }
         srand(time(0)*i);
     }
     for(i=1;i<=1024;i++)
     {
         m1[0][i]=m2[0][i]=m1[768][i];
         m1[769][i]=m2[769][i]=m1[1][i];
     }
     for(i=1;i<=768;i++)
     {
         m1[i][0]=m2[i][0]=m1[i][1024];
         m1[i][1025]=m2[i][1025]=m1[i][1];
     }
}
//计算下一次细胞的状态
void NextMap()
{
     int i,j,s;
     for(i=1;i<=768;i++)
         for(j=1;j<=1024;j++)
         {
             s=0;
             if(m2[i+1][j])
                 s++;
             if(m2[i-1][j])
                 s++;
             if(m2[i][j+1])
                 s++;
             if(m2[i][j-1])
                 s++;



  • fzyz999
  • |
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
             if(m2[i+1][j+1])
                 s++;
             if(m2[i+1][j-1])
                 s++;
             if(m2[i-1][j+1])
                 s++;
             if(m2[i-1][j-1])
                 s++;
             if(s==3)
                 m1[i][j]=1;
             else if(s!=2)
                 m1[i][j]=0;
         }
         for(i=1;i<=768;i++)
             for(j=1;j<=1024;j++)
                 m2[i][j]=m1[i][j];
         for(i=1;i<=1024;i++)
         {
             m1[0][i]=m2[0][i]=m1[768][i];
             m1[769][i]=m2[769][i]=m1[1][i];
         }
         for(i=1;i<=768;i++)
         {
             m1[i][0]=m2[i][0]=m1[i][1024];
             m1[i][1025]=m2[i][1025]=m1[i][1];
         }
         m1[0][0]=m2[0][0]=m1[768][1024];
         m1[769][0]=m2[769][0]=m1[1][1024];
         m1[769][1025]=m2[769][1025]=m1[1][1];
         m1[0][1025]=m2[0][1025]=m1[768][1];
}
//初始化OpenGL
static void setup_opengl( int width, int height )
{
     float ratio = (float) width / (float) height;
     glShadeModel( GL_SMOOTH );
     glCullFace( GL_BACK );
     glFrontFace( GL_CCW );
     glEnable( GL_CULL_FACE );
     glClearColor( 0, 0, 0, 0 );



2025-09-15 18:53:47
广告
不感兴趣
开通SVIP免广告
  • fzyz999
  • |
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
     glViewport( 0, 0, width, height );
     glMatrixMode( GL_PROJECTION );
     glLoadIdentity( );
}
//程序入口
int main(int argc, char *argv[])
{
     //随机生成细胞的状态
     MapRand();
     std::cout<<"Map is ready.\n";
     //SDL初始化
     const SDL_VideoInfo* info = NULL;
     int width = 0;
     int height = 0;
     int bpp = 0;
     int flags = 0;
     if( SDL_Init( SDL_INIT_VIDEO ) < 0 ) {
         fprintf( stderr, "Video initialization failed: %s\n",
             SDL_GetError( ) );
         quit_tutorial( 1 );
     }
     info = SDL_GetVideoInfo( );
     if( !info ) {
         fprintf( stderr, "Video query failed: %s\n",
             SDL_GetError( ) );
         quit_tutorial( 1 );
     }
     width = 1024;
     height = 768;
     bpp = info->vfmt->BitsPerPixel;
     SDL_GL_SetAttribute( SDL_GL_RED_SIZE, 24 );
     SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, 24 );
     SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, 24 );
     SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, 16 );
     SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );
     flags = SDL_OPENGL | SDL_FULLSCREEN;
     if( SDL_SetVideoMode( width, height, bpp, flags ) == 0 ) {
         fprintf( stderr, "Video mode set failed: %s\n",
             SDL_GetError( ) );
         quit_tutorial( 1 );
     }
     //初始化OpenGL
     setup_opengl( width, height );
     //进入消息循环
     SDL_Process();
     //退出程序
     quit_tutorial( 0 );
     return 0;
}
void SDL_Process()
{
     bool gameOver = false;
     while( !gameOver )
     {
         SDL_Event gameEvent;
         SDL_PollEvent(&gameEvent);
         if ( &gameEvent != 0 )



  • fzyz999
  • |
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
         {
             switch(gameEvent.type)
             {
             case SDL_QUIT:
                 gameOver = true;
                 break;
             case SDL_KEYDOWN:
                 switch( gameEvent.key.keysym.sym)
                 {
                 case SDLK_ESCAPE:
                     //当按下esc时退出
                     gameOver = true;
                     break;
                 case SDLK_SPACE:
                     //当按下空格时绘制下一帧
                     NextMap();
                     break;
                 }
                 break;
             }
         }
         //刷新画面
         OnPaint();
     }
     return;
}
static GLboolean should_rotate = GL_TRUE;
void OnPaint()
{
     glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
     glMatrixMode( GL_MODELVIEW );
     glLoadIdentity( );
     glPushMatrix();
     //定义细胞颜色
     glColor3f( 1.0f, 0.0f, 0.0f );
     //定义代表细胞的点的大小(单位是像素)
     glPointSize( 1.0f);
     //绘制开始
     //我采用的是分别绘制四个象限,所以有四组循环



  • fzyz999
  • |
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
     int i,j;
     for(i=1;i<384;i++)
         for(j=1;j<512;j++)
         {
             if(m1[i][j])
             {
                 glBegin(GL_POINTS);
                 glVertex2f(float(-1*(512-j))*0.001953125f, float(384-i)*0.002604167f );
                 glEnd();
             }
         }
     for(i=1;i<384;i++)
         for(j=512;j<=1024;j++)
         {
             if(m1[i][j])
             {
                 glBegin(GL_POINTS);
                     glVertex2f(float(j-512)*0.001953125f, float(384-i)*0.002604167f );
                 glEnd();
             }
         }
     for(i=384;i<=768;i++)
         for(j=1;j<512;j++)
         {
             if(m1[i][j])
             {
                 glBegin(GL_POINTS);
                     glVertex2f(float(-1*(512-j))*0.001953125f, float(-1*(i-384))*0.002604167f );
                 glEnd();
             }
         }
     for(i=384;i<=768;i++)
         for(j=512;j<=1024;j++)
         {
             if(m1[i][j])
             {
                 glBegin(GL_POINTS);
                     glVertex2f(float(j-512)*0.001953125f, float(-1*(i-384))*0.002604167f );
                 glEnd();
             }
         }
     glPopMatrix();
     SDL_GL_SwapBuffers();
     //绘制结束
     return ;
}
编译时需要添加“sdl.lib”"sdlmain.lib"以及"opengl32.lib""glu32.lib"(OpenGL编译所需的库可能在不同的编译器上不完全一样)
vc下sdl编译的教程:http://www.cppblog.com/lf426/archive/2008/01/31/42289.html(这是我从百度上搜索到的)
MinGW下sdl编译教程:http://www.cppblog.com/lf426/archive/2008/02/01/42316.html(也是我在百度上搜索到的)
程序效果:屏幕上每一个红色的点代表一个细胞,按空格键可以继续演化,按esc键可以退出程序
生命游戏相关资料:http://baike.baidu.com/view/162057.htm?fr=ala0_1_1


  • 222.37.34.*
快试试吧,
可以对自己使用挽尊卡咯~
◆
◆
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
代码写的确实有点凌乱。。。。。。。。。。


  • 211.142.40.*
快试试吧,
可以对自己使用挽尊卡咯~
◆
◆
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
好复杂,有必要这样吗?


  • rSkip
  • |
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
直接把运算部分放在shader里多好 把结果保存到显存里 需要的时候再调出来 速度快 改动也方便


2025-09-15 18:47:47
广告
不感兴趣
开通SVIP免广告
  • 222.37.38.*
快试试吧,
可以对自己使用挽尊卡咯~
◆
◆
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
我终于编译过去你的程序了。效果还不错。就是程序结构不太清晰,下次写整齐点。


  • 113.76.88.*
快试试吧,
可以对自己使用挽尊卡咯~
◆
◆
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
珠海
C++高级客户端开发工程师
月薪:10K  
QQ:43974014


  • 218.5.5.*
快试试吧,
可以对自己使用挽尊卡咯~
◆
◆
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
编译不能 Dev-cpp
.....
   [Linker error] undefined reference to `glClear@4'
......


  • 青春无悔→某徐
  • ,
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
编译过程未提示错误,但组建时提示unresolved external symbol,请高手指点这是什么缘故……?


  • zotin
  • ||
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
回复:13楼
有没有添加“sdl.lib”"sdlmain.lib"以及"opengl32.lib""glu32.lib"?


  • 青春无悔→某徐
  • ,
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
回复:14楼
后面俩忘了添加了……多谢指点


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 1 2 下一页 尾页
  • 20回复贴,共2页
  • ,跳到 页  
<<返回c++吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示