| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1318 人关注过本帖
标题:三子棋 代码求助!!!
只看楼主 加入收藏
_GAOYANG_
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2014-12-19
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:4 
三子棋 代码求助!!!
要求更改函数first 和函数second(即先下还是后下)让赢的几率更大!! 让更改后的代码实现电脑自动下棋..(就是说我编写的first函数和你编写second函数放在一起看先手能赢还是后手能赢)   
#include<iostream>
#include<cstdlib>
using namespace std ;
//////////////////////////////////////////////////////
void first(const char chess[3][3],int &x,int &y)//定义先手函数;
{
    for (int i = 0;i<3;++i)
    {
        for (int j=0;j<3;++j)
         {
             if (chess[i][j]==' ')
            {
                x=i;y=j;
            }
        }
    }
}
///////////////////////////////////////////////////
void second(const char chess[3][3],int &x,int &y)//定义后手函数;
{
    for (int i = 0;i<3;++i)
        {
          for (int j=0;j<3;++j)
           {
                if (chess[i][j]==' ')
            {
                x = i;    y=j;
            }
           }
        }
}
//////////////////////////////////////////////////////////////
void printchessboard(const char chess[3][3])  /*打印棋盘*/
{
    int i,j;
    cout<<" -------"<<endl;
    for (i = 0;i<3;++i)
    {
        cout<<"| ";
        for (j = 0;j<3;++j)
            cout<<chess[i][j]<<' ';
        cout<<"| ";
        cout<<endl;
    }
    cout<<" ------"<<endl;
}
int judge(char chess[3][3],int x,int y,char ch)//胜返回1,负返回2,平返回0,无法判断胜负-1;
{
    if (x>2 || x<0 || y>2 || y<0 || chess[x][y]!=' ')
        return 2;   //无效落子;
    chess[x][y] = ch;
    int i,j;
    for (i=0;i<3;++i) //判断i行是否全一致
        if (chess[i][0]==chess[i][1] && chess[i][1]==chess[i][2] && chess[i][0]!=' ')
            return 1;
    for (i=0;i<3;++i) //判断i列是否全一致
        if (chess[0][i]==chess[1][i] && chess[1][i]==chess[2][i] && chess[0][i]!=' ')
            return 1;
    //判断3*3棋盘对角线是否全一致
    if (chess[0][0]==chess[1][1] && chess[1][1]==chess[2][2] && chess[1][1]!=' ')
        return 1;
    //判断3*3棋盘对角线是否全一致
    if (chess[2][0]==chess[1][1] && chess[1][1]==chess[0][2] && chess[1][1]!=' ')
        return 1;
    int flag = 0;
    for (i = 0;i<3;++i)
        for (j=0;j<3;++j)
            if (chess[i][j]==' ') return -1;
            return 0;
}
///////////////////////////////////////////
void initalchessboard(char chess[3][3])
{
    int i,j;
    for (i=0;i<3;++i)
        for(j=0;j<3;++j)
            chess[i][j] = ' ';
}
///////////////////////////////////////////
int main()
{
    char chessboard[3][3],piece;//生成3*3的2维数组,和字符型变量piece;
    initalchessboard(chessboard);//调用initalchessboard函数,传入实参chessboard;
    int turn = 0,X,Y,result;//生成整形变量X,Y,result,turn,并且将turn初始化为0;
    while (1)
    {
        system("cls");//清除屏幕;
        if (turn++%2==0)//判断是先手下棋还是后手下棋;
        {
            first(chessboard,X,Y);//调用先手函数、并且传入实参chessboard,X,Y;
            piece = 'A';//将字符A赋值给piece;
        }
        else
        {
            second(chessboard,X,Y);//调用后手函数,出入实参chessboard,X,Y;
            piece = 'B';//将字符B赋值给piece;
        }
        result = judge(chessboard,X,Y,piece);//将判断的结果赋值给result;
        cout<<"当前比赛为第"<<turn<<"手棋"<<endl;//输出当前比赛的第几手棋;
        printchessboard(chessboard);//调用printchessboard函数并且传入实参;再次打印棋盘
        
        if (result==0)//双方打平;
        {            
            cout<<"双方打平"<<endl;
        }
        else if (result==2)//输掉比赛;
        {

            if (piece=='A')
                cout<<"先手方犯规,输掉比赛"<<endl;
            else
                cout<<"后手方犯规,输掉比赛"<<endl;
            
            break;
        }
        else if (result==1)//比赛胜利;
        {
            if (piece=='A')
                cout<<"先手方胜!!!!比赛结束!!!!"<<endl;
            else
                cout<<"后手方胜!!!!比赛结束!!!!"<<endl;
            break;
        }
        else
        {
            cout<<"未分出胜负,比赛继续"<<endl;
        }
        system("pause");//走完前一步棋停顿一下再走第二步棋;
    }
    system("pause");
}
搜索更多相关主题的帖子: include second 
2014-12-19 23:58
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
收藏
得分:0 
这需要人工智能来算吗?应该先手容易赢吧?只要先手走了最中间原位置即chessboard[1][1]
2014-12-21 12:18
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
收藏
得分:0 
如果要写人工智能的话。可以用这样一个思路:将九宫格所有位置按其所涉及的横竖斜总行数统计出来,结果是,四角统计为3,四边统计为2,中心统计为4.
每一步检测所有可落子位置,涉及行数为该位置的估价值,但若某一位置所涉及的某一行另外两个位置均为对方所占的时候,该位置估价值再加5,遍历完所有位置后,实际落子选在估值最高的地方。不过这种游戏只要不是太怂的人来玩,结局一定是平局。
2014-12-21 22:14
_GAOYANG_
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2014-12-19
收藏
得分:0 
回复 3楼 yangfrancis
非常感谢啦   
你可以帮我写一下代码嘛    我刚学C++
你说的我大致理解   但是代码实现还是困难   谢谢啦
2014-12-21 22:27
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
收藏
得分:20 
//走A的为人工智能一方
#include<math.h>
......
int hor,ver;int value[3][3];
for(hor=0:hor<3:hor++)
{
   for(ver=0:ver<3:ver++)
   {
       if(abs(ver-hor)==1){value[hor][ver]=2;}//四边初始值为2
       else
       {
            if(ver*hor==1){value[hor][ver]=4;}//中心初始值为4
            else{value[hor][ver]=3;}//余下情况一定为四角,初始值为3
       }
   }
}
//以上为初始值设定
int i;//设置一个接下来要用于遍历运算的变量
int a_sum;int b_sum;//这两个变量统计某一列出现的“A”或“B”个数
for(hor=0;hor<3;hor++)
{
    for(ver=0;ver<3;ver++)
    {
        if(chessboard[hor][ver]==' ')//可以考虑落子
        {
             a_sum=0;b_sum=0;
             for(i=0;i<3;i++)
             {
                   if(chessboard[hor][i]=='B'){b_sum++;}
                   else
                   {  if(chessboard[hor][i]=='A'){a_sum++;}  }
             }
             if(b_sum>1){value[hor][ver]+=5;}//如果该处所在的纵列'B'已有两个,则该位置的重要程度加5
             if(a_sum>1){value[hor][ver]+=10;}//如果该处所在的纵列'A'即己方棋子已有两个,则该位置更要优先考虑,重要程度加10
             a_sum=0;b_sum=0;//纵列考虑完之后统计值重置,接下来再考虑横行
             for(i=0;i<3;i++)
             {
                   if(chessboard[i][ver]=='B'){b_sum++;}
                   else
                   {  if(chessboard[i][ver]=='A'){a_sum++;}  }
             }
             if(b_sum>1){value[hor][ver]+=5;}//如果该处所在的横行'B'已有两个,则该位置的重要程度加5
             if(a_sum>1){value[hor][ver]+=10;}//如果该处所在的横行'A'即己方棋子已有两个,则该位置更要优先考虑,重要程度加10
             if(hor==ver)//满足此条件考虑斜行“\”
             {
                  a_sum=0;b_sum=0
                  for(i=0;i<3;i++)
                  {
                        if(chessboard[i][i]=='B'){b_sum++;}
                        else
                        {  if(chessboard[i][i]=='A'){a_sum++;}  }
                  }
                  if(b_sum>1){value[hor][ver]+=5;}//如果该处所在的斜行'B'已有两个,则该位置的重要程度加5
                  if(a_sum>1){value[hor][ver]+=10;}//如果该处所在的斜行'A'即己方棋子已有两个,则该位置更要优先考虑,重要程度加10
             }
             if(2-hor==ver)//满足此条件考虑斜行“/”
             {
                  a_sum=0;b_sum=0
                  for(i=0;i<3;i++)
                  {
                        if(chessboard[i][2-i]=='B'){b_sum++;}
                        else
                        {  if(chessboard[i][2-i]=='A'){a_sum++;}  }
                  }
                  if(b_sum>1){value[hor][ver]+=5;}//如果该处所在的斜行'B'已有两个,则该位置的重要程度加5
                  if(a_sum>1){value[hor][ver]+=10;}//如果该处所在的斜行'A'即己方棋子已有两个,则该位置更要优先考虑,重要程度加10
             }
        }
    }
}
//当'B'方先手抢占两个对角而'A'占了中心时,'A'落子不能在剩余两角的任一角,否则立败。这种情况以上人工智能无法辨别。'A'若后手,它的第二步需要专门判断一下是否出现这种残局,若出现,剩余两角的重要性各减10.这种判断在编程上很容易处理,此处略去代码。
int choose_x,choose_y;
int GetVal=0;
for(hor=0;hor<3;hor++)
{
    for(ver=0;ver<3;ver++)
    {
         if(GetVal<value[hor][ver]){GetVal=value[hor][ver];choose_x=hor;choose_y=ver;}//筛选出最大估价值。
    }
}
//以上循环结束后,chessboard[choose_x][choose_y]的位置即为最终选定的落子位置
2014-12-22 14:31
快速回复:三子棋 代码求助!!!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.068906 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved