面向技术华容道操作步骤何Word格式.docx
《面向技术华容道操作步骤何Word格式.docx》由会员分享,可在线阅读,更多相关《面向技术华容道操作步骤何Word格式.docx(34页珍藏版)》请在冰豆网上搜索。
调兵遣将
ID_DBQJ
水泄不通
ID_SXBT
3点击”HUARDclasses”,鼠标右击,选择“newclass”.
图3_1新建Cell类
选择Genericclass,单击ok.(genericCWnd是派生cwind类)
图3_2新建cell类
4.在cell.h文件中的classcell中添加如下成员变量和成员函数:
右击类classcell,加成员变量和成员函数。
(cell类型是一个单元格类型。
通过界面不难看出棋子是由一个或多个正方形构成的。
而cell类型则是构建这个正方形的单元格)
Public:
voidSetpos(GLfloatx,GLfloaty);
voidSetchessname(GLintname);
voidSetcellstate(GLintstate);
intGetchessname();
intGetcellstate();
boolDrawChess(GLuint*texture);
boolCopyCell(cell&
tcell);
boolclear();
private:
GLfloatpos_x;
GLfloatpos_y;
GLintcellstate;
GLintchessname;
GLuinttexid;
//(在这里很多类似GLint数据类型的定义。
其实就是我们所熟悉的int类型数据。
GL是一个平台转换功能。
可根据平台的不同,而使后面的int类型能自动适应所在平台。
)
添加方法如下:
图4_1新建成员函数
图4_2添加成员函数voidSetpos(GLfloatx,GLfloaty);
图4_3添加成员变量
图4_4添加成员变量GLfloatpos_x;
5.在步骤4中添加的函数中添加对应代码,并在cell.h文件首添加头文件:
“#include<
GL/glut.h>
”,并在cell.cpp中添加函数
boolcell:
:
CopyCell(cell&
tcell)//复制单元中棋子名称和位置。
传引用调用CELL类型变量
{
chessname=tcell.Getchessname();
cellstate=tcell.Getcellstate();
tcell.clear();
returntrue;
}
clear()//将位置和名字置为0
chessname=CN_EMPTY;
cellstate=CS_EMPTY;
voidcell:
Setpos(GLfloatx,GLfloaty)//赋值位置坐标
pos_x=x;
pos_y=y;
Setchessname(GLintname)//赋值棋子名字
chessname=name;
Setcellstate(GLintstate)//赋值棋子部分
cellstate=state;
intcell:
Getchessname()//获得棋子名字
returnchessname;
Getcellstate()//获得位置
returncellstate;
DrawChess(GLuint*texture)//画棋子,并为每个棋子的纹理标号。
glPushMatrix();
//把当前的矩阵数据压栈(就是保存起来)
glTranslatef(pos_x,pos_y,0.0);
//沿着矩阵中X和Y的位置移动
switch(chessname)
{
caseCN_CAOCAO:
glBindTexture(GL_TEXTURE_2D,texture[0]);
//建立一个绑定到目标纹理的有名称的纹理
break;
caseCN_ZHANGFEI:
switch(cellstate)
{
caseCS_LEFT:
caseCS_RIGHT:
glBindTexture(GL_TEXTURE_2D,texture[6]);
break;
caseCS_BOTTOM:
caseCS_TOP:
glBindTexture(GL_TEXTURE_2D,texture[7]);
}
caseCN_ZHAOYUN:
glBindTexture(GL_TEXTURE_2D,texture[8]);
glBindTexture(GL_TEXTURE_2D,texture[9]);
caseCN_MACHAO:
glBindTexture(GL_TEXTURE_2D,texture[4]);
glBindTexture(GL_TEXTURE_2D,texture[5]);
caseCN_GUANYU:
glBindTexture(GL_TEXTURE_2D,texture[1]);
caseCN_HUANGZHONG:
glBindTexture(GL_TEXTURE_2D,texture[2]);
glBindTexture(GL_TEXTURE_2D,texture[3]);
caseCN_BIN:
caseCN_YONG:
caseCN_ZU:
caseCN_DIN:
glBindTexture(GL_TEXTURE_2D,texture[10]);
caseCN_EMPTY:
glBindTexture(GL_TEXTURE_2D,texture[12]);
}
glBegin(GL_QUADS);
switch(cellstate)
caseCS_TOPLEFT:
glTexCoord2f(0.0f,0.5f);
glVertex3f(0.0,0.0,0.0);
//glTexCoord*()设置纹理坐标,glVertex*()设置顶点坐标
glTexCoord2f(0.5f,0.5f);
glVertex3f(1.0,0.0,0.0);
glTexCoord2f(0.5f,1.0f);
glVertex3f(1.0,1.0,0.0);
glTexCoord2f(0.0f,1.0f);
glVertex3f(0.0,1.0,0.0);
caseCS_TOPRIGHT:
glTexCoord2f(1.0f,0.5f);
glTexCoord2f(1.0f,1.0f);
caseCS_BOTTOMLEFT:
glTexCoord2f(0.0f,0.0f);
glTexCoord2f(0.5f,0.0f);
caseCS_BOTTOMRIGHT:
glTexCoord2f(1.0f,0.0f);
caseCS_LEFT:
caseCS_RIGHT:
caseCS_TOP:
caseCS_BOTTOM:
caseCS_BIN:
caseCS_EMPTY:
glEnd();
glPopMatrix();
//把当前的矩阵数据出栈(就是把保存的再回复)
6、在文件cell.h首添加如下代码:
在类前面添加。
enumCHESSNAME
CN_EMPTY=0,//0
CN_CAOCAO,//1
CN_ZHANGFEI,//2
CN_ZHAOYUN,//3
CN_MACHAO,//4
CN_GUANYU,//5
CN_HUANGZHONG,//6
CN_BIN,//7
CN_YONG,//8
CN_ZU,//9
CN_DIN,//10
};
enumCELLSTATE
CS_EMPTY=0,//0
CS_TOPLEFT,//曹操左上角部分//1
CS_TOPRIGHT,//2
CS_BOTTOMLEFT,//3
CS_BOTTOMRIGHT,//4
CS_TOP,//将士竖着摆放时,将士上半部分//5
CS_BOTTOM,//6
CS_LEFT,//将士横着摆放时,将士左半部分//7
CS_RIGHT,//8
CS_BIN,//小将,就占一个格子//9
//比翼横空
staticintnameConfig1[5][4]=
{7,0,8,6},
{9,0,10,6},
{3,3,4,4},
{2,2,1,1},
{5,5,1,1}
staticintstateConfig1[5][4]=
{9,0,9,6},
{9,0,9,5},
{7,8,7,8},
{7,8,3,4},
{7,8,1,2}
//三军联防
staticintnameConfig2[5][4]=
{7,0,0,8},
{9,3,3,10},
{5,5,2,2},
{1,1,4,6},
{1,1,4,6}
staticintstateConfig2[5][4]=
{9,0,0,9},
{9,7,8,9},
{3,4,6,6},
{1,2,5,5}
//重重包围
staticintnameConfig3[5][4]=
{4,2,2,6},
{4,5,5,6},
{3,1,1,9},
{3,1,1,10}
staticintstateConfig3[5][4]=
{6,7,8,6},
{5,7,8,5},
{6,3,4,9},
{5,1,2,9}
//调兵遣将
staticintnameConfig4[5][4]=
{0,6,6,0},
{3,3,4,4},
{1,1,7,8},
{1,1,9,10}
staticintstateConfig4[5][4]=
{0,7,8,0},
{3,4,9,9},
{1,2,9,9}
//水泄不通
staticintnameConfig5[5][4]=
{9,1,1,6},
{10,1,1,6}
staticintstateConfig5[5][4]=
{9,3,4,6},
{9,1,2,5}
7、至此,编译程序无错。
在文件HUARDView.h中的CHUARDView类中添加如下成员变量和成员函数,添加与步骤4类似。
成员变量:
CDC*m_hDC;
HGLRCm_hRC;
CRectm_oldRect;
GLfloatW,H;
GLuinttexture[13];
cellcells[5][4];
GLbooleanmoveable;
inti_index;
intj_index;
intii_index;
intjj_index;
CHESSNAMEmchessname;
成员函数:
boolmovecell(MOVEDIRETIONmdirection,inti,intj);
boolIsEmpty(inti,intj);
voidResetChessState(intindex);
voidDrawBoard(unsignedintmode);
voidreadchessdata(intnameConfig[5][4],intstateConfig[5][4]);
boolLoadtexfile(char*filename,inttexid);
voidinit();
voidDisplay();
8选中类CHUADView,添加消息响应函数OnCreate,OnSize,OnEraseBKgnd,OnDestroy,添加方法如下:
图5添加系统消息响应函数
9在步骤7和8中添加的系统消息响应函数中添加相应代码如下:
boolCHUARDView:
movecell(MOVEDIRETIONmdirection,inti,intj)//移动单元格
switch(mdirection)
caseMD_LEFT:
cells[i][j-1].CopyCell(cells[i][j]);
caseMD_RIGHT:
cells[i][j+1].CopyCell(cells[i][j]);
caseMD_BOTTOM:
cells[i-1][j].CopyCell(cells[i][j]);
caseMD_TOP:
cells[i+1][j].CopyCell(cells[i][j]);
cells[i][j].clear();
IsEmpty(inti,intj)//判断是否为空
if(i<
0||j<
0||i>
4||j>
4)
returnfalse;
if(cells[i][j].Getchessname()==CN_EMPTY){
returntrue;
else
voidCHUARDView:
ResetChessState(intindex)//设置棋子移动后状态和位置
inti=(index-1)/4;
intj=index-4*i-1;
intt=0;
if(cells[i][j].Getcellstate()==0&
&
moveable==false)
return;
//求棋子左下角的索引
if(cells[i][j].Getchessname()!
=CN_EMPTY)
if(cells[i][j].Getchessname()==CN_CAOCAO)
i=(cells[i][j].Getcellstate()==CS_BOTTOMLEFT||cells[i][j].Getcellstate()==CS_BOTTOMRIGHT)?
i:
i-1;
j=(cells[i][j].Getcellstate()==CS_TOPLEFT||cells[i][j].Getcellstate()==CS_BOTTOMLEFT)?
j:
j-1;
elseif(cells[i][j].Getchessname()==CN_BIN)
i=i;
j=j;
else
i=(cells[i][j].Getcellstate()==CS_TOP)?
i-1:
i;
j=(cells[i][j].Getcellstate()==CS_RIGHT)?
j-1:
j;
i_index=i;
j_index=j;
mchessname=(CHESSNAME)cells[i][j].Getchessname();
moveable=true;
//确定棋子移动方向
else
{
switch(mchessname)
caseCN_CAOCAO:
if(IsEmpty(