部分效果图:
- 总体设计
这里我将叙述一个大概的设计过程。
玩家一使用的棋子是’*’ 玩家二以及电脑使用的棋子是’#’。这两个字符只是方便做相关操作。
实际显示时,我将玩家一显示为白棋子,玩家二显示为黑棋子。而不是直接把’*’和’#’显示给用户。
棋盘用的是二维数组。
一盘游戏几乎所有操作都是在这个二维数组上面实现。主要功能有:游戏背景音乐,实时棋盘的更新,棋子的移动,判断胜负,胜负播报音乐,电脑实现智能化落子。
本程序分为两大部分,一部分是人机对战,另一部分是人人对战。人人对战就不说了。人机对战让电脑实现了一定的智能化,主要算法是Ai()函数。
以下是各个功能函数的简要概述。
int isWin();//判定胜负
void Ai6();//电脑随机放子
void Ai5();//阻止玩家冲三
void Ai4();//电脑实现冲四
void Ai3();//阻止玩家冲四
void Ai2();//让电脑实现冲五
void Ai1();//阻止玩家冲五
void load();//初始界面
void printS();//打印棋盘
void newgame();//游戏主体
void gamer();//双人对战
void movedown(int *x,int *y,int ret);//向上
void moveup(int *x,int *y,int ret);//向下
void moveright(int *x,int *y,int ret);//向右
void moveleft(int *x,int *y,int ret);//向左
void move();//人机模式移动
void move1();//双人对战 玩家一
void move2(); //双人对战 玩家二
void end(int flag);//结束界面
2. 算法设计
主要算法函数:电脑智能下棋。
使用了函数嵌套,
优先级:
Ai1() ->Ai2() ->Ai3() ->Ai4() ->Ai5() ->Ai6()
阻止玩家冲五->让电脑实现冲五->阻止玩家冲四->电脑实现冲四->阻止玩家冲三->随机放子
函数说明:
阻止玩家冲五:通过遍历棋盘(用两个for循环),得到玩家的棋子位置,判断它的棋子里面是否有连四的情况出现,如果有就进行防守。其它防守函数同理。电脑实现冲五则是通过遍历棋盘上自己的棋子,如果有连四的情况,那么就补上最后一个棋子完成胜局。其它进攻函数同理。
怎样实现优先级?通过函数嵌套,把Ai1()(阻止玩家冲五)作为第一个返回函数,如果能找到相应的位置(成功防守)那么就返回该位置,否则继续进行下一个判断也就是Ai2()(让自己实现冲五),以此类推。
void Ai6();//电脑随机放子
void Ai5();//阻止玩家冲三
void Ai4();//电脑实现冲四
void Ai3();//阻止玩家冲四
void Ai2();//让电脑实现冲五
void Ai1();//阻止玩家冲五
void Ai1()//阻止玩家冲五
以下是Ai1()的示例:
void Ai1()
{
int i,j;
/*遍历棋盘,找出玩家的棋子是否有连四的情况,四种连四情况都得查找,即
横/纵/左上斜/右下斜*/
for(i=1;i<20;i++)
for(j=1;j<20;j++)
{
if(game[i][j]=='*'&&game[i][j+1]=='*'&&game[i][j+2]=='*'&&game[i][j+3]=='*')//横向
{
if(game[i][j-1]=='.'){
game[i][j-1]='#';return; //如果找到该位置那么把棋子放好之后直接return
}
if(game[i][j+4]=='.'){
game[i][j+4]='#';return;
}
}
if(game[i][j]==game[i+1][j]&&game[i+1][j]==game[i+2][j]&&game[i+2][j]==game[i+3][j]&&game[i+3][j]=='*')//纵向
{
if(game[i-1][j]=='.'){
game[i-1][j]='#';return;
}
if(game[i+4][j]=='.'){
game[i+4][j]='#';return;
}
}
if(game[i][j]==game[i+1][j+1]&&game[i+1][j+1]==game[i+2][j+2]&&game[i+2][j+2]==game[i+3][j+3]&&game[i+3][j+3]=='*') //斜向1
{
if(game[i