面向技术华容道操作步骤何.docx
《面向技术华容道操作步骤何.docx》由会员分享,可在线阅读,更多相关《面向技术华容道操作步骤何.docx(34页珍藏版)》请在冰豆网上搜索。
![面向技术华容道操作步骤何.docx](https://file1.bdocx.com/fileroot1/2023-1/21/164c4c27-7ae3-446c-8344-bcc795149a62/164c4c27-7ae3-446c-8344-bcc795149a621.gif)
面向技术华容道操作步骤何
华容道游戏程序操作步骤
头文件放置:
(1)确定VC6.0安装是默认路径还是自定义路径
A、默认路径:
将openGL文件夹内所有‘.h’类型文件复制到
C:
\ProgramFile\MicrosoftVisualC++6.0\VC98\Include\GL文件夹下。
将openGL文件夹内所有‘.lib’类型文件复制到
C:
\ProgramFile\MicrosoftVisualC++6.0\VC98\Lib文件夹下。
B、自定义路径:
先找到安装VisualC++6.0的路径。
找到VC98文件夹
将openGL文件夹内所有‘.h’类型文件复制到…\VC98\Include\GL文件夹下。
将openGL文件夹内所有‘.lib’类型文件复制到…\VC98\Lib文件夹下。
(2)将openGL文件夹内所有‘.dll’类型文件复制到C:
\WINDOWS\System32文件夹中。
1,打开VC++6.0,新建MFC单文档应用程序,项目名称:
HUARD,并将picture文件夹拷贝到此项目文件夹下。
(先建工程,再将picture文件夹拷贝到所建立文件夹HUARD中)
图1新建MFC单文档应用程序工程,工程名称:
HUARD
图2选择“单文档”程序类型,点击“完成”
2打开“资源视图”,在Menu下双击“IDR_MAINFRAME”,新建如下菜单:
图3新建菜单
菜单子项
ID
比翼横空
ID_BYHK
三军联防
ID_SJLF
重重包围
ID_CCBW
调兵遣将
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”,并在cell.cpp中添加函数
boolcell:
:
CopyCell(cell&tcell)//复制单元中棋子名称和位置。
传引用调用CELL类型变量
{
chessname=tcell.Getchessname();
cellstate=tcell.Getcellstate();
tcell.clear();
returntrue;
}
boolcell:
:
clear()//将位置和名字置为0
{
chessname=CN_EMPTY;
cellstate=CS_EMPTY;
returntrue;
}
voidcell:
:
Setpos(GLfloatx,GLfloaty)//赋值位置坐标
{
pos_x=x;
pos_y=y;
}
voidcell:
:
Setchessname(GLintname)//赋值棋子名字
{
chessname=name;
}
voidcell:
:
Setcellstate(GLintstate)//赋值棋子部分
{
cellstate=state;
}
intcell:
:
Getchessname()//获得棋子名字
{
returnchessname;
}
intcell:
:
Getcellstate()//获得位置
{
returncellstate;
}
boolcell:
:
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]);
break;
}
break;
caseCN_ZHAOYUN:
switch(cellstate)
{
caseCS_LEFT:
caseCS_RIGHT:
glBindTexture(GL_TEXTURE_2D,texture[8]);
break;
caseCS_BOTTOM:
caseCS_TOP:
glBindTexture(GL_TEXTURE_2D,texture[9]);
break;
}
break;
caseCN_MACHAO:
switch(cellstate)
{
caseCS_LEFT:
caseCS_RIGHT:
glBindTexture(GL_TEXTURE_2D,texture[4]);
break;
caseCS_BOTTOM:
caseCS_TOP:
glBindTexture(GL_TEXTURE_2D,texture[5]);
break;
}
break;
caseCN_GUANYU:
switch(cellstate)
{
caseCS_LEFT:
caseCS_RIGHT:
glBindTexture(GL_TEXTURE_2D,texture[1]);
break;
caseCS_BOTTOM:
caseCS_TOP:
glBindTexture(GL_TEXTURE_2D,texture[1]);
break;
}
break;
caseCN_HUANGZHONG:
switch(cellstate)
{
caseCS_LEFT:
caseCS_RIGHT:
glBindTexture(GL_TEXTURE_2D,texture[2]);
break;
caseCS_BOTTOM:
caseCS_TOP:
glBindTexture(GL_TEXTURE_2D,texture[3]);
break;
}
break;
caseCN_BIN:
caseCN_YONG:
caseCN_ZU:
caseCN_DIN:
glBindTexture(GL_TEXTURE_2D,texture[10]);
break;
caseCN_EMPTY:
glBindTexture(GL_TEXTURE_2D,texture[12]);
break;
}
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);
break;
caseCS_TOPRIGHT:
glTexCoord2f(0.5f,0.5f);glVertex3f(0.0,0.0,0.0);
glTexCoord2f(1.0f,0.5f);glVertex3f(1.0,0.0,0.0);
glTexCoord2f(1.0f,1.0f);glVertex3f(1.0,1.0,0.0);
glTexCoord2f(0.5f,1.0f);glVertex3f(0.0,1.0,0.0);
break;
caseCS_BOTTOMLEFT:
glTexCoord2f(0.0f,0.0f);glVertex3f(0.0,0.0,0.0);
glTexCoord2f(0.5f,0.0f);glVertex3f(1.0,0.0,0.0);
glTexCoord2f(0.5f,0.5f);glVertex3f(1.0,1.0,0.0);
glTexCoord2f(0.0f,0.5f);glVertex3f(0.0,1.0,0.0);
break;
caseCS_BOTTOMRIGHT:
glTexCoord2f(0.5f,0.0f);glVertex3f(0.0,0.0,0.0);
glTexCoord2f(1.0f,0.0f);glVertex3f(1.0,0.0,0.0);
glTexCoord2f(1.0f,0.5f);glVertex3f(1.0,1.0,0.0);
glTexCoord2f(0.5f,0.5f);glVertex3f(0.0,1.0,0.0);
break;
caseCS_LEFT:
glTexCoord2f(0.0f,0.0f);glVertex3f(0.0,0.0,0.0);
glTexCoord2f(0.5f,0.0f);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);
break;
caseCS_RIGHT:
glTexCoord2f(0.5f,0.0f);glVertex3f(0.0,0.0,0.0);
glTexCoord2f(1.0f,0.0f);glVertex3f(1.0,0.0,0.0);
glTexCoord2f(1.0f,1.0f);glVertex3f(1.0,1.0,0.0);
glTexCoord2f(0.5f,1.0f);glVertex3f(0.0,1.0,0.0);
break;
caseCS_TOP:
glTexCoord2f(0.0f,0.5f);glVertex3f(0.0,0.0,0.0);
glTexCoord2f(1.0f,0.5f);glVertex3f(1.0,0.0,0.0);
glTexCoord2f(1.0f,1.0f);glVertex3f(1.0,1.0,0.0);
glTexCoord2f(0.0f,1.0f);glVertex3f(0.0,1.0,0.0);
break;
caseCS_BOTTOM:
glTexCoord2f(0.0f,0.0f);glVertex3f(0.0,0.0,0.0);
glTexCoord2f(1.0f,0.0f);glVertex3f(1.0,0.0,0.0);
glTexCoord2f(1.0f,0.5f);glVertex3f(1.0,1.0,0.0);
glTexCoord2f(0.0f,0.5f);glVertex3f(0.0,1.0,0.0);
break;
caseCS_BIN:
caseCS_EMPTY:
glTexCoord2f(0.0f,0.0f);glVertex3f(0.0,0.0,0.0);
glTexCoord2f(1.0f,0.0f);glVertex3f(1.0,0.0,0.0);
glTexCoord2f(1.0f,1.0f);glVertex3f(1.0,1.0,0.0);
glTexCoord2f(0.0f,1.0f);glVertex3f(0.0,1.0,0.0);
break;
}
glEnd();
glPopMatrix();//把当前的矩阵数据出栈(就是把保存的再回复)
returntrue;
}
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},
{7,8,7,8},
{3,4,6,6},
{1,2,5,5}
};
//重重包围
staticintnameConfig3[5][4]=
{
{7,0,0,8},
{4,2,2,6},
{4,5,5,6},
{3,1,1,9},
{3,1,1,10}
};
staticintstateConfig3[5][4]=
{
{9,0,0,9},
{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},
{5,5,2,2},
{1,1,7,8},
{1,1,9,10}
};
staticintstateConfig4[5][4]=
{
{0,7,8,0},
{7,8,7,8},
{7,8,7,8},
{3,4,9,9},
{1,2,9,9}
};
//水泄不通
staticintnameConfig5[5][4]=
{
{7,0,0,8},
{3,3,4,4},
{5,5,2,2},
{9,1,1,6},
{10,1,1,6}
};
staticintstateConfig5[5][4]=
{
{9,0,0,9},
{7,8,7,8},
{7,8,7,8},
{9,3,4,6},
{9,1,2,5}
};
7、至此,编译程序无错。
在文件HUARDView.h中的CHUARDView类中添加如下成员变量和成员函数,添加与步骤4类似。
成员变量:
Public:
CDC*m_hDC;
HGLRCm_hRC;
CRectm_oldRect;
GLfloatW,H;
GLuinttexture[13];
cellcells[5][4];
GLbooleanmoveable;
inti_index;
intj_index;
intii_index;
intjj_index;
CHESSNAMEmchessname;
成员函数:
Public:
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]);
break;
caseMD_RIGHT:
cells[i][j+1].CopyCell(cells[i][j]);
break;
caseMD_BOTTOM:
cells[i-1][j].CopyCell(cells[i][j]);
break;
caseMD_TOP:
cells[i+1][j].CopyCell(cells[i][j]);
break;
}
cells[i][j].clear();
returntrue;
}
boolCHUARDView:
:
IsEmpty(inti,intj)//判断是否为空
{
if(i<0||j<0||i>4||j>4)
returnfalse;
if(cells[i][j].Getchessname()==CN_EMPTY){
returntrue;
}
else
returnfalse;
}
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(