资源简介

[纯C语言 + Win32 API]一步一步写个围棋程序之十二:实现对弈

资源截图

代码片段和文件信息

#include “GoBoard.h“


BOARDDATA g_BoardData[MAX_BOARDSIZE][MAX_BOARDSIZE];     //棋盘状态数据
STONEDATA g_StoneData[MAX_STONENUMBER];                  //棋子信息数据
int g_iStoneNumber g_iShowStoneNumber;                  //棋子总手数、总显示数
unsigned char g_iBoardSize = 9;                         //棋盘线数
char g_cNextColor = BLACK;                               //下一手棋的颜色

static int g_haveCount[MAX_BOARDSIZE][MAX_BOARDSIZE];    //算气的方向标志
static int g_noLiberty[MAX_BOARDSIZE][MAX_BOARDSIZE];    //没气的标志

#define ClearHaveCount() ClearNoLibertyHaveCount((int **)g_haveCount)
#define ClearNoLiberty() ClearNoLibertyHaveCount((int **)g_noLiberty)
static void ClearNoLibertyHaveCount(int **p);
static int Count(int int int);          //数气
static int CheckLastStone(void);
static void AddOneStone(int int int int);
static void DeleteLastStone();


//取得棋盘交叉点位置棋子颜色
//参数:x、y 交叉点坐标
extern int GetBoardCrossColor(int x int y)
{
    return g_BoardData[x][y].c;
}

//取得总手数
extern int GetTotalStoneNumber()
{
    return g_iStoneNumber;
}

//取得棋盘线数
extern unsigned char GetBoardSize()
{
    return g_iBoardSize;
}

//取得下一手棋的颜色
extern char GetNextColor()
{
    return g_cNextColor;
}

//设置下一手棋的颜色
extern char SetNextColor(char c)
{
    if(c == BLACK || c == WHITE)
        g_cNextColor = c;

    return g_cNextColor;
}

//清空棋盘状态数据
extern void ClearBoardData()
{
    int i j;
    BOARDDATA **p;

    p = (BOARDDATA **)g_BoardData;

    g_iStoneNumber = g_iShowStoneNumber = 0;
    g_cNextColor = BLACK;

    //棋盘内数据全部归0
    for(i=1; i<=g_iBoardSize; i++)
        for(j=1; j<=g_iBoardSize; j++)
            ((BOARDDATA*)p+i*MAX_BOARDSIZE+j)->c = ((BOARDDATA*)p+i*MAX_BOARDSIZE+j)->n = EMPTY;

    //棋盘外围颜色赋 -1
    j = g_iBoardSize + 2;
    for(i=0; i        ((BOARDDATA*)p+i)->c = ((BOARDDATA*)p+j*MAX_BOARDSIZE+i)->c = ((BOARDDATA*)p+i*MAX_BOARDSIZE)->c = ((BOARDDATA*)p+i*MAX_BOARDSIZE+j)->c = GRAY;
}

//获得气
//参数:x y 棋盘的逻辑坐标,c 棋子颜色
//返回值:x y点所在C颜色棋块的气数
extern int GetLiberty(int x int y int c)
{
    ClearHaveCount();
    return Count(x y c);
}

//落下一手棋
//x y 棋盘逻辑坐标
//有效则返回吃子数,禁手(包括打劫)返回-1 ,当前点有子返回-2
extern int PlayStone(int x int y char c)
{
    int i;

    //点击非空位
    if(g_BoardData[x][y].c > 0)
        return -2;

    //先增加一子
    AddOneStone(x y c g_iStoneNumber);

    //检查有效性(有效时已经更新数据 )
    i = CheckLastStone();
    if(i >= 0)
        return i;
    //无效再删掉
    else
    {
        DeleteLastStone();
        return -1;
    }
}

//回退一步
//返回值:成功返回1,否则返回0
extern BOOL WithdrawOneStep(void)
{
    if(g_iStoneNumber>0)
    {
        //把最后一子吃掉的棋还原
        int i;
        for(i=1; i            if(g_StoneData[i].bk == g_iStoneNumber)
            {
                g_StoneData[i].bk = 0;
                g_BoardData[g_StoneData[i].x][g_StoneData[i].y].n = g_StoneData[i].n;
                g_BoardData[g_StoneData[i].x][g_StoneData[i].y].c = g_StoneData[

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       8763  2012-09-02 07:39  TryHandTalk\GoBoard.c

     文件       1492  2012-09-02 01:09  TryHandTalk\GoBoard.h

     文件      17514  2012-09-02 01:07  TryHandTalk\main.c

     文件     691254  2012-08-30 08:46  TryHandTalk\res\board.bmp

     文件     201354  2012-07-11 18:39  TryHandTalk\res\Stone.bmp

     文件      28866  2012-08-30 08:48  TryHandTalk\res\ToolbarDisable.BMP

     文件      28866  2012-08-30 08:49  TryHandTalk\res\ToolbarHover.BMP

     文件      28866  2012-08-30 08:49  TryHandTalk\res\ToolbarNormal.BMP

     文件       1221  2012-09-01 13:05  TryHandTalk\Resource.h

     文件       1595  2012-09-02 00:07  TryHandTalk\TryHandTalk.cbp

     文件        865  2012-09-02 01:23  TryHandTalk\TryHandTalk.depend

     文件       1063  2012-09-02 07:41  TryHandTalk\TryHandTalk.layout

     文件       1256  2012-09-01 13:01  TryHandTalk\TryHandTalk.rc

     目录          0  2012-09-01 21:51  TryHandTalk\res

     目录          0  2012-09-02 07:41  TryHandTalk

----------- ---------  ---------- -----  ----

              1012975                    15


评论

共有 条评论