难啊!!!希望高手帮帮忙、、、

作者在 2011-10-29 18:18:50 发布以下内容
#include <iostream.h>
#include <stdlib.h>

/*

 三子连珠游戏

该程序是三子连珠游戏,棋盘为3X33个棋子连起来即为赢。输入参数时,若输入的数字超出边界或在已有棋子的地方再输入,则提示出错,要求重新输入。

改进要求:

1、将程序改写成类

2、将棋盘扩充为4X4

3、统计输赢结果并打印输出

4、选做:使游戏更生动。

*/


void PrintBoard();        //打印棋盘
void PrintInof();        //输出游戏提示信息
void PrintStats(int,int,int);    //输出统计的胜负信息
void IfError(int&,int&);    //判断输入时候有错
void ChoiceOfChar(char&);  //询问用户是否再玩一盘
void ProapLTurnO(int&,int&);    //选择“O”的玩家下棋(先走)
void ProapLTurnX(int&,int&);    //选择“X”的玩家下棋(后走)
char board[4][4];    //棋盘
void Guize();//打印菜单总体情况,说明游戏规则和方法,无返回值
void Dayinqp();//打印棋盘,无返回值
void xiaqi(char*,int&,int &,char);//下棋,无返回值
int Huosheng(int,int,char);//是否再玩,无返回值
void Choice(char &);//重设棋盘,无返回值
void Chongzhi();
class CGobang
{
    char board[4][4];
public:
    void Guize();
    void Dayinqp();
    void Xiaqi(char*,int &,int &,char);
    int Huosheng(int,int,char);
    void Choice(char &);
    void Chongzhi();
}
void CGobang::Xiaqi(char*player1,int & x,int & y,char c)
{
    cout<<""<<player1<<"下棋了,请输入"<<endl;
    cout<<"你的棋子所在行:";
    cin>>x;
    cout<<"  "<<"  "<<"  "<<"棋子所在列:";
    cin>>y;
    while (x>4||y>4||x<1||' '!=board[x-1][y-1])//输入数字超过边界或在已有的棋子地方再输入
    {
        cout<<"对不起,你输入的有误,请重新输入!"<<endl;
        cout<<"你的棋子所在行:";
        cin>>x;
        cout<<" "<<" "<<" "<<" 棋子所在列:";
        cin>>y;
    }
    board[x-1][y-1]=c;//在x行,y列处下O成x
}
void main()//主函数
{
    CGobang s;    //定义一个类对象s
    s.Guize();    //通过已定义的类的对象s调用Guize函数,提示玩家如何进行游戏
    char player1[20],player2[20];    //定义两个玩家的姓名变量,分别用两量付初值,以待计算赢的结果
    char choice='Y';
    int FirstWin=0,SecondWin=0,Draws=0,x,y,N;
    cin.ignore (20,'\n');    //输入输流,前面如果有输入把输入行所有字符取空,以便后面的输入从新的一行开始
    cout<<"请输入第一个玩家姓名:";
    cin.getline(player1,20);    //连续读取数据,实现对玩家一命名
    cout<<"请输入第二个玩家姓名:";
    cin.getline(player2,20);    //连续读取数据,实现对玩家二命名
    while(choice=='Y'||choice=='y')    //条件成立,开始下棋
    {
        s.Chongzhi();    //通过对象s调用Chongzhi函数
        int N=0;    //对变量付初值,表示已经下在棋盘上的棋子总数
        while(N<=16)    //在棋盘未满的条件下下棋
        {
            s.Dayinqp();    //打印棋盘
            s.Xiaqi(player1,x,y,'0');    //调用下棋运行的函数
            N++;//记录已下棋子数
            if(s.Huosheng(x-1,y-1,'0'))//返回值不为0则条件成立
            {
                cout<<player1<<"赢了。"<<endl;
                FirstWin++;
                break;
            }
            s.Dayinqp();
            s.Xiaqi(player2,x,y,'X');
            N++;
            if(s.Huosheng(x-1,y-1,'X'))
            {
                cout<<player2<<"赢了。"<<endl;
                SecondWin++;
                break;
            }
            if(N==16)
            {
                cout<<"和棋!";
                Draws++;
                break;
            }
        }
        s.Choice(choice);//让玩家选择是否再玩一次
    }
//输出游戏输赢次数
    cout<<player1<<"赢了"<<FirstWin<<""<<endl;
    cout<<player2<<"赢了"<<SecondWin<<""<<endl;
    cout<<""<<Draws<<""<<endl;
    cout<<"谢谢使用"<<endl;
    cout<<"任意键继续"<<endl;    
}

void CGobang::Chongzhi()//重置棋盘函数
{
    for(int Row=0;Row<4;Row++)
        for(int Column=0;Column<4;Column++)
            board[Row][Column]=' ';
}

/*{
    int FirstWin=0,SecondWin=0,Drass=0,x,y,N;
    cout<<player1<<"赢了"<<FirstWin<<"次"<<endl;
    cout<<player2<<"赢了"<<SecondWin<<"次"<<endl;
    cout<<"谢谢使用。" <<endl;
    cout<<"任意键继续"<<endl;
}
*/
void PrintBoard()
{
cout << endl;
cout << "  1   2   3  4" << endl;
cout << "1 " << board[0][0] << " | " << board[0][1]<<" | "<< board[0][2]<< " | "<< board[0][3]<<endl;
cout << " ---|---|---" << endl;
cout << "2 " << board[1][0]<< " | " << board[1][1]<< " | " << board[1][2]<<" | "<< board[1][3]<< endl;
cout << " ---|---|---" << endl;
cout << "3 " << board[2][0]<< " | " << board[2][1]<< " | " << board[2][2]<<" | "<< board[2][3]<< endl;
cout << " ---|---|---" << endl;
cout << "4 " << board[3][0]<< " | " << board[3][1]<< " | " << board[3][2]<<" | "<< board[3][3]<< endl;
cout << endl;
cout << endl;
}
int CGobang::Huosheng(int x,int y,char c)
{
    int count,a;
    //从左斜上方判断是否构成胜利条件
    for(a=0,count=0;(x-a>=0)&&(y-a>=0)&&(board[x-a][y-a]==c);a++)
        if(++count==3)
            return 1;
    //从右斜下方判断是否构成胜利条件
    for(a=1;(x+a<4)&&(y+a<4)&&(board[x+a][y+a]==c);a++)
        if(++count==3)
            return 1;
    //从上向下方判断是否构成胜利条件
    for(a=0,count=0;(x-a>=0)&&(board[x-a][y]==c);a++)
        if(++count==3)
            return 1;
    //从下向上方判断是否构成胜利条件
    for(a=1;(x+a<4)&&(board[x+a][y]==c);a++)
        if(++count==3)
            return 1;
    //从左至右方判断是否构成胜利条件
    for(a=0,count=0;(y-a>=0)&&(board[x][y-a]==c);a++)
        if(++count==3)
            return 1;
    //从右至左方判断是否构成胜利条件
    for(a=1;(x+a<4)&&(board[x][y+a]==c);a++)
        if(++count==3)
            return 1;
    //从右斜上方判断是否构成胜利条件
    for(a=0,count=0;(x-a>=0)&&(y+a<4)&&(board[x-a][y+a]==c);a++)
        if(++count==3)
            return 1;
    //从左斜下方判断是否构成胜利条件
    for(a=1;(x+a<4)&&(y-a>=0)&&(board[x+a][y-a]==c);a++)
        if(++count==3)
            return 1;
        return 0;
}

    
三连珠游戏 | 阅读 786 次
文章评论,共0条
游客请输入验证码
文章归档
最新评论