| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1239 人关注过本帖
标题:请问谁能解释下此井字棋的程序吗??
只看楼主 加入收藏
wunaidexingzuo
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2008-5-26
收藏
 问题点数:0 回复次数:6 
请问谁能解释下此井字棋的程序吗??
#include "stdio.h"
#include "malloc.h"

#define SIZE 3

#ifndef FALSE
        #define FALSE 0
#endif
#ifndef TRUE
        #define TRUE 1
#endif

#define NONE 0
#define PLAYER_A 1
#define PLAYER_B 2
#define WARNNING 255
#define COMPETITOR 200
#define WINNER -1

char chessboard[SIZE][SIZE];

struct CHESS_MAN
{
    int row;
    int col;
};

/*PLAYER可能胜利的方法*/
int get_value(int player)
{
    int i,j,ret=0;
    int row,col,inc;
    int bNONE=FALSE;

    /*检查所有行*/
    for(i=0;i<SIZE;i++)
    {
        row=SIZE;
        bNONE=FALSE;
        for(j=0;j<SIZE;j++)
        {
            if(chessboard[i][j]==player) row--;       /*如果该位置有player的棋子占据*/
            if(chessboard[i][j]==NONE) bNONE=TRUE;    /*如果该位置还没有棋子占据,则返回bNONE为TRUE*/
        }
        if(row==1&&bNONE==TRUE) return WARNNING;      /*电脑:该行中有一个空位且有对手下的2个旗子,则可能会输掉该局,返回WARNNING值)*/
        else if(row==SIZE) ret++;                     /*电脑:该行中没有player的棋子,ret+1*/
    }

    /*检查所有列*/
    for(i=0;i<SIZE;i++)
    {
        col=SIZE;
        bNONE=FALSE;
        for(j=0;j<SIZE;j++)
        {
            if(chessboard[j][i]==player) col--;       /*如果该位置有player的棋子占据*/
            if(chessboard[j][i]==NONE) bNONE=TRUE;    /*如果该位置还没有棋子占据,则返回bNONE为TRUE*/
        }
        if(col==1&&bNONE==TRUE) return WARNNING;      /*电脑:该列中有一个空位且有对手下的2个旗子,则可能会输掉该局,返回WARNNING值*/
        else if(col==SIZE) ret++;                     /*电脑:该列中没有player的棋子,ret+1*/
    }

    /*检查左对角线*/
    inc=SIZE;
    bNONE=FALSE;
    for(i=0,j=0;i<SIZE;i++,j++)
    {
        if(chessboard[i][j]==player) inc--;           /*如果该位置有player的棋子占据*/
        if(chessboard[i][j]==NONE) bNONE=TRUE;        /*如果该位置还没有棋子占据,则返回bNONE为TRUE*/
    }
    if(inc==1&&bNONE==TRUE) return WARNNING;          /*电脑:左对角线中有一个空位且有对手下的2个旗子,可能会输掉该局,返回WARNNING值*/
    else if(inc==SIZE) ret++;                         /*电脑:左对角线中没有player的棋子,ret+1*/

    /*检查右对角线*/
    inc=SIZE;
    bNONE=FALSE;
    for(i=0,j=SIZE-1;i<SIZE;i++,j--)
    {
        if(chessboard[i][j]==player) inc--;           /*如果该位置有player的棋子占据*/
        if(chessboard[i][j]==NONE) bNONE=TRUE;        /*如果该位置还没有棋子占据,则返回bNONE为TRUE*/
    }
    if(inc==1&&bNONE==TRUE) return WARNNING;          /*电脑:右对角线中有一个空位且有对手下的2个旗子,可能会输掉该局,返回WARNNING值*/
    else if(inc==SIZE) ret++;                         /*电脑:右对角线中没有player的棋子,ret+1*/
    return ret;
};



/*显示棋盘图形边框*/
void disp_chess_board(void)
{
    int i,j;
    /*显示棋盘最顶层边框*/
    for(i=0;i<SIZE*4+1;i++)
        printf("-");
    printf("\n");

    /*显示3层棋盘格落子情况及其左、右和下边框*/
    for(i=0;i<SIZE;i++)
    {
        printf("|");
        for(j=0;j<SIZE;j++)
        {
            if(chessboard[i][j]==PLAYER_A) printf(" o |");         /*如果是PLAYER_A落子则用o表示棋子*/
            else if(chessboard[i][j]==PLAYER_B) printf(" x |");    /*如果是PLAYER_B落子则用x表示棋子*/
            else printf("   |");
        }
        printf("\n");

        /*输出该层下边框*/
        for(j=0;j<SIZE*4+1;j++)
            printf("-");
        printf("\n");
    }
    return;
};



/*棋盘初始状况*/
void init_chess_board(void)
{
    int i,j;
    for(i=0;i<SIZE;i++)
        for(j=0;j<SIZE;j++)
            chessboard[i][j]=NONE;
    return;
};



/*玩家落子*/
int enter_chess_man(int row, int col, int player)
{
    if(row>=SIZE||col>=SIZE) return FALSE;          /*输入位置超出棋盘坐标,不能落子*/
    if(chessboard[row][col]!=NONE) return FALSE;    /*输入当该位置已有棋子占据,不能落子*/
    chessboard[row][col]=player;                    /*玩家落子*/
    return TRUE;
};



/*判断胜利状况*/
int chk_winner(int player)
{
    int i,j;
    int col,row,inc;

    /*占满一行*/
    for(i=0;i<SIZE;i++)
    {
        row=TRUE;
        for(j=0;j<SIZE;j++)
        {
            if(chessboard[i][j]!=player) row=FALSE;
        }
        if(row==TRUE) return TRUE;
    }

    /*占满一列*/
    for(i=0;i<SIZE;i++)
    {
        col=FALSE;
        for(j=0;j<SIZE;j++)
        {
            if(chessboard[j][i]!=player) col=FALSE;
        }
        if(col==TRUE) return TRUE;
    }

    /*占满左对角线*/
    inc=TRUE;
    j=0;
    for(i=0;i<SIZE;i++)
    {
        if(chessboard[i][i+j]!=player) inc=FALSE;
    }
    if(inc==TRUE) return TRUE;

    /*占满右对角线*/
    inc=TRUE;
    j=SIZE-1;
    for(i=0;i<SIZE;i++)
    {
        if(chessboard[i][j-i]!=player) inc=FALSE;
    }
    if(inc==TRUE) return TRUE;

    /*还没有一方胜利*/
    return FALSE;
};

●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●

/*最佳的一步棋*/
int get_best_chess(struct CHESS_MAN *best_chess, int player, int other)
{
    int chess_value[9];
    struct CHESS_MAN chess[9];
    int i,j,cur=0;

    for(i=0;i<SIZE;i++)
    {
        for(j=0;j<SIZE;j++)
        {
            chess[cur].row=i;
            chess[cur++].col=j;
        }
    }

    for(i=0;i<9;i++)
    {
        if(enter_chess_man(chess[i].row,chess[i].col,player)==TRUE)
        {
            chess_value[i]=get_value(other);                      /**/
            if(chk_winner(player)==TRUE) chess_value[i]=WINNER;   /*玩家未胜利,则chess_value[i]为WINNER*/
            chessboard[chess[i].row][chess[i].col]=NONE;          /*玩家落子位置错误,棋盘为0*/
        }
        else chess_value[i]=COMPETITOR;                           /* 玩家落子位置正确,*/
    }
    /*选择值为最低的chess_value*/
    cur=0;
    for(i=0;i<9;i++)
    {
        if(chess_value[cur]>chess_value[i]) cur=i;
    }
    /**/
    best_chess->row=chess[cur].row;
    best_chess->col=chess[cur].col;

    return chess_value[cur];
};

●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●

/*检查是否还有未落子的棋格*/
int chk_full(void)
{
    int i,j;
    for(i=0;i<SIZE;i++)
        for(j=0;j<SIZE;j++)
        {
            if(chessboard[i][j]==NONE) return FALSE;
        }
    return TRUE;
};

int main(void)
{
    int i;
    struct CHESS_MAN best_chess;
    int player=PLAYER_A;          /*玩家先手*/
    int competitor=PLAYER_B;      /*电脑后手*/
    int bEND=FALSE; /*初始bEND的值*/
    int row,col; /*玩家输入所下棋子的位置*/
    init_chess_board();   /*初始棋盘数据*/
    disp_chess_board();   /*绘制棋盘边框*/
      
    while(bEND==FALSE)  /*若bEND为FALSE,则判定棋局结束*/
    {
        if(player==PLAYER_A)
        {
            /*轮到玩家下棋时,显示玩家坐标输入提示*/
            do
            {
                printf("] 请输入您落子的位置 : \n");
                printf("] 行坐标为: ");
                scanf("%d",&row);
                printf("] 列坐标为: ");
                scanf("%d",&col);
                if(enter_chess_man(row-1,col-1,player)==TRUE)     /*玩家落子正确,棋盘坐标显示,并结束该循环*/
                {
                    printf("] 您落子的位置是 [%d][%d]\n",row,col);
                    break;
                }
                else printf("] 您输入的棋盘坐标错误,请重新输入\n");  /*玩家落子坐标错误提示*/
            }while(TRUE);
        }
        else
        {
            /*电脑选择最佳位置下棋并显示落子的棋盘坐标提示*/
            get_best_chess(&best_chess,player,competitor);
            enter_chess_man(best_chess.row,best_chess.col,player);
            printf("] 电脑落子的位置是[%d][%d]\n",best_chess.row+1,best_chess.col+1);
        }

        /*显示当前棋盘落子状况*/
        disp_chess_board();

        /*判断胜负后,显示该棋局的胜利者提示*/
        bEND=TRUE;
        if(chk_winner(player)) printf("] 胜利者是Player %d.\n",player);
        else if(chk_winner(competitor)) printf("] 胜利者是Player %d.\n",competitor);
        else if(chk_full()) printf("] 平局.\n");
        else bEND=FALSE;

        competitor=player;
        if(player==PLAYER_A) player=PLAYER_B;
        else player=PLAYER_A;
    };

    printf("\n\n本棋局结束.\n\n");    /*该局已结束*/
    return 0;
};


这是网上看到的一个井字棋程序,请问谁能帮解释下"●●●●●●"线间的函数是什么意思吗???
用VC编译出来后当依次走步行列分别为 1 1     2 3    2 2    电脑所走的棋子坐行列标居然是  1  1   请问是怎么回事???

急~~
搜索更多相关主题的帖子: 此井 define int PLAYER 程序 
2008-05-26 22:35
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
这个是博弈的知识吧。。。

学习需要安静。。海盗要重新来过。。
2008-05-26 22:37
wunaidexingzuo
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2008-5-26
收藏
得分:0 
我想知道 那线里面  每步是什么意思?
而且用VC编译出来后当依次走步行列分别为 1 1     2 3    2 2    电脑所走的棋子坐行列标居然是  1  1   请问是怎么回事???
2008-05-26 22:41
lucky_boy
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2008-4-3
收藏
得分:0 
可以将以下井子棋的规则吗?
怎样算赢?
2008-05-26 23:30
wunaidexingzuo
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2008-5-26
收藏
得分:0 
井字棋  9方格   谁下的棋子能占满一行或一列或者对角线,就是3个棋子连成一线就是胜利
9格下完所有格子还未有人胜利就算平局
2008-05-26 23:37
wunaidexingzuo
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2008-5-26
收藏
得分:0 
而这个程序编译后   比如我走第一行第一格  电脑会走第一行第二格   
我走 第二行第三格  电脑会走第一行第三格     那么我走第二行第一格时  会显示电脑走  第一行第一格   这明显与我走的第一步冲突了嘛!!


而且想问下
/*最佳的一步棋*/
int get_best_chess(struct CHESS_MAN *best_chess, int player, int other)
{
        int chess_value[9];
        struct CHESS_MAN chess[9];
        int i,j,cur=0;

    for(i=0;i<SIZE;i++)
    {
        for(j=0;j<SIZE;j++)
        {
            chess[cur].row=i;
            chess[cur++].col=j;
        }
    }

    for(i=0;i<9;i++)
    {
        if(enter_chess_man(chess[i].row,chess[i].col,player)==TRUE)
        {
            chess_value[i]=get_value(other);                      /**/
            if(chk_winner(player)==TRUE) chess_value[i]=WINNER;   /*玩家未胜利,则chess_value[i]为WINNER*/
            chessboard[chess[i].row][chess[i].col]=NONE;          /*玩家落子位置错误,棋盘为0*/
        }
        else chess_value[i]=COMPETITOR;                           /* 玩家落子位置正确,*/
    }
    /*选择值为最低的chess_value*/
    cur=0;
    for(i=0;i<9;i++)
    {
        if(chess_value[cur]>chess_value[i]) cur=i;
    }
    /**/
    best_chess->row=chess[cur].row;
    best_chess->col=chess[cur].col;

    return chess_value[cur];
};

这段是什么意思  我觉得我那翻译可能是错的    如果之前的函数解释有错  请帮忙指出来好吗
2008-05-26 23:40
wunaidexingzuo
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2008-5-26
收藏
得分:0 

我知道是什么意思了  但是程序感觉不对

而这个程序编译后   比如我走第一行第一格  电脑会走第一行第二格   
我走 第二行第三格  电脑会走第一行第三格     那么我走第二行第一格时  会显示电脑走  第一行第一格   这明显与我走的第一步冲突了嘛!!
2008-05-27 12:58
快速回复:请问谁能解释下此井字棋的程序吗??
数据加载中...
 
   



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

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