opengl中的棋盘

时间:2013-02-11 22:13:08

标签: c++ opengl chess

我正在尝试在OpenGL中创建5x5棋盘。我已经能够设计一个5x6和8x8,但代码不适用于5x5。 有人可以查看代码并指出我的错误在哪里,因为宽度不会改变为5?

以下是我似乎遇到问题的部分代码:

void drawScene()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glTranslatef(-2.5*1.5, 0.0, 2.5*1.5);

    for(double j=0.0;j>(-5*1.5);j-=1.5)
    {
        k++;
        for(i=0.0;i<(2.5*3.0);i+=3.0)
        {
            if(k%2!=0)
            {
                glPushMatrix();
                glTranslatef(i,0.0,j);
                glCallList(_displayListId_blackArea);
                glPopMatrix();

            }
            else
            {
                glPushMatrix();
                glTranslatef(i+1.5,0.0,j);
                glCallList(_displayListId_blackArea);
                glPopMatrix();

            }
        }
    }
    for(double j=0.0;j>(-5*1.5);j-=1.5)
    {
        k++;
        for(i=0.0;i<(2.5*3.0);i+=3.0)
        {
            if(k%2!=0)
            {
                glPushMatrix();
                glTranslatef(i,0.0,j);
                glCallList(_displayListId_whiteArea);
                glPopMatrix();

            }
            else
            {
                glPushMatrix();
                glTranslatef(i+1.5,0.0,j);
                glCallList(_displayListId_whiteArea);
                glPopMatrix();
            }
        }
    }
}

4 个答案:

答案 0 :(得分:3)

如果您的列数为奇数,则黑色与白色的“奇数与偶数”将与您的偶数相比有所不同。我认为最简单的方法是为所有Squares做一个循环,并保持在每个循环结束时设置为bool white_or_black的{​​{1}}变量。

还有大量重复的代码可以通过一个循环而不是两个循环来简化。

[我不是100%确定你的代码出了什么问题,所以我不确定这是否能解决这个问题 - 但我相信这是一个值得改进的地方]。

答案 1 :(得分:1)

首先了解您的问题。你必须绘制奇数vs甚至黑色vs白板,这意味着在第一行,如果你绘制奇数白板,那么你必须绘制甚至黑板,在下一行甚至白板和奇怪的黑板。对于完成5 * 5棋盘图案的白色和黑色棋盘行如下:

3*2
2*3
3*2
2*3
3*2

但是你提供的代码是相同数量的白板和黑板,所以你必须改变逻辑。这是代码的一部分,我使用我的逻辑绘制5 * 5棋盘,它的工作完美。

for(float j=0.0;j>(-5*1.5);j-=1.5)
{
k++;
//for(i=0.0;i<(4*3.0);i+=3.0)
//{
if(k%2==0)
{
for(i=0.0;i<(3*3.0);i+=3.0){
 glPushMatrix();
 glTranslatef(i,0.0,j);
 glCallList(_displayListId_blackArea);
 glPopMatrix();
 }

}
else
{
  for(i=0.0;i<(2*3.0);i+=3.0){
glPushMatrix();
glTranslatef(i+1.5,0.0,j);
glCallList(_displayListId_blackArea);
glPopMatrix();
}

}
 //}
}
k=0;
for(float j=0.0;j>(-5*1.5);j-=1.5)
{
k++;
  //for(i=0.0;i<(4*3.0);i+=3.0)
 //{
 if(k%2!=0)
 {
     for(i=0.0;i<(3*3.0);i+=3.0){
glPushMatrix();
glTranslatef(i,0.0,j);
glCallList(_displayListId_whiteArea);
glPopMatrix();
  }

}
  else
 {
    for(i=0.0;i<(2*3.0);i+=3.0){
  glPushMatrix();
  glTranslatef(i+1.5,0.0,j);
  glCallList(_displayListId_whiteArea);
  glPopMatrix();
  }

}
}
k=0;
glutSwapBuffers();
}

答案 2 :(得分:0)

我怀疑“宽度不会变为5”,你的宽度是4或6.这是正确的吗?在这种情况下,由于双精度算术,很可能是一个错误。

你知道,你在循环中假设无限精确,但可以想象5*1.5与添加1.5五次不同。

你应该做的是从1到5(或0到4)的整数循环,然后将该值乘以你的平方大小以产生坐标。除非你知道自己在做什么以及会发生什么,否则循环双打通常不是一个好主意。

你应该做的另一件事是使用常量而不是文字。而不是使用数字5来编写代码,为什么不定义:

const int BoardWidth = 5;
const int BoardHeight = 5;

然后更改会更容易。

答案 3 :(得分:0)

忘记代码,它有潜力,你应该使用int作为计数器来创建电路板。例如:

const unsigned BOARD_SIZE = 5;

for(unsigned i = 0; i < BOARD_SIZE; ++i){
 for(unsigned j = 0; j < BOARD_SIZE; ++j){
    drawBoardCell(i,j, (i*BOARD_SIZE + j) % 2 == 0);
  }
}

void drawBoardCell(const int row, const int col, const bool isBlack){
  glPushMatrix();
  glTranslatef(col+1.5,0.0,row);
  const int callId = isBlack ? _displayListId_blackArea : _displayListId_whiteArea;
  glCallList(callId);
  glPopMatrix();
}

这可能不会起作用,但它应该给你一个起点。