签到

05月06日
尚未签到

共有回帖数 1

    荷塘月色

    等级:


    写的时候是可以让计算机计算很多部的,采用3叉树的结构存储计算机计算的棋盘信息,但实际上计算9、10步电脑就有点不行了。可能因为没有剪枝吧!还有,计算多了以后,电脑下的棋反而不精确了,可能因为权值不精确,搜索广度不够吧!大家提点意见吧!
    先放resource.h
    #define IDR_MENU1                        101
    #define IDR_MENU                         101
    #define IDM_START                        40001
    #define IDM_RESTART                      40002
    #define IDM_ABOUT                        40003
    #define IDM_1STEP                        40004
    #define IDM_2STEP                        40005
    #define IDM_3STEP                        40006
    #define IDM_4STEP                        40007
    #define IDM_5STEP                        40008

    // Next default values for new objects
    //
    #ifdef APSTUDIO_INVOKED
    #ifndef APSTUDIO_READONLY_SYMBOLS
    #define _APS_NEXT_RESOURCE_VALUE         102
    #define _APS_NEXT_COMMAND_VALUE          40009
    #define _APS_NEXT_CONTROL_VALUE          1000
    #define _APS_NEXT_SYMED_VALUE            101
    #endif
    #endif

    资源文件
    //Microsoft Developer Studio generated resource script.
    //
    #include "resource.h"

    #define APSTUDIO_READONLY_SYMBOLS
    /////////////////////////////////////////////////////////////////////////////
    //
    // Generated from the TEXTINCLUDE 2 resource.
    //
    #include "afxres.h"

    /////////////////////////////////////////////////////////////////////////////
    #undef APSTUDIO_READONLY_SYMBOLS

    /////////////////////////////////////////////////////////////////////////////
    // Chinese (中国) resources

    #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
    #ifdef _WIN32
    LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
    #pragma code_page(936)
    #endif //_WIN32

    #ifdef APSTUDIO_INVOKED
    /////////////////////////////////////////////////////////////////////////////
    //
    // TEXTINCLUDE
    //

    1 TEXTINCLUDE DISCARDABLE
    BEGIN
        "resource.h"
    END

    2 TEXTINCLUDE DISCARDABLE
    BEGIN
        "#include ""afxres.h""rn"
        ""
    END

    3 TEXTINCLUDE DISCARDABLE
    BEGIN
        "rn"
        ""
    END

    #endif     // APSTUDIO_INVOKED


    /////////////////////////////////////////////////////////////////////////////
    //
    // Menu
    //

    IDR_MENU MENU DISCARDABLE
    BEGIN
        POPUP "游戏"
        BEGIN
            POPUP "开始游戏"
            BEGIN
                MENUITEM "计算一步",                     IDM_1STEP
                MENUITEM "计算两步",                     IDM_2STEP
                MENUITEM "计算三步",                     IDM_3STEP
                MENUITEM "计算四步",                     IDM_4STEP
                MENUITEM "计算五步",                     IDM_5STEP
            END
            MENUITEM "再来一次",                     IDM_RESTART
        END
        POPUP "帮助"
        BEGIN
            MENUITEM "关于...",                      IDM_ABOUT
        END
    END

    #endif     // Chinese (中国) resources
    /////////////////////////////////////////////////////////////////////////////



    #ifndef APSTUDIO_INVOKED
    /////////////////////////////////////////////////////////////////////////////
    //
    // Generated from the TEXTINCLUDE 3 resource.
    //


    /////////////////////////////////////////////////////////////////////////////
    #endif     // not APSTUDIO_INVOKED

    #include windows.h
    #include "resource.h"


    LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM) ;


    int Turn=1;
    int IsStart=0;
    int Steps=0;
    int TempBoard[15][15]={0};


    int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)
    {
        static TCHAR szAppName[]=TEXT("五子棋");  
        HWND hwnd;  
        MSG msg;
        WNDCLASS wndclass ;  
        wndclass.style            =CS_HREDRAW|CS_VREDRAW;    
        wndclass.lpfnWndProc      =WndProc;      
        wndclass.cbClsExtra       =0;      
        wndclass.cbWndExtra       =0;        
        wndclass.hInstance        =hInstance;      
        wndclass.hIcon            =LoadIcon(NULL,IDI_APPLICATION);      
        wndclass.hCursor          =LoadCursor(NULL,IDC_ARROW);        
        wndclass.hbrBackground    =(HBRUSH)GetStockObject(GRAY_BRUSH);  
        wndclass.lpszMenuName     =NULL;        
        wndclass.lpszClassName    =szAppName;    
        if (!RegisterClass(&wndclass))        
        {
            MessageBox(NULL,TEXT("This program requires Windows NT!"),szAppName,MB_ICONERROR) ;        
            return 0 ;        
        }      
        hwnd=CreateWindow(szAppName,
            TEXT("五子棋人机对战"),  
            WS_OVERLAPPEDWINDOW,  
            CW_USEDEFAULT,
            CW_USEDEFAULT,
            480,
            530,
            NULL,                
            LoadMenu(hInstance,MAKEINTRESOURCE(IDR_MENU)),            
            hInstance,  
            NULL);
        ShowWindow(hwnd,SW_SHOWNORMAL);        
        UpdateWindow(hwnd);
        while (GetMessage(&msg,NULL,0,0))      
        {
            TranslateMessage(&msg);        
            DispatchMessage(&msg);        
        }        
        return msg.wParam;        
    }

    //判断是否胜利
    int win(int i,int j)
    {
        int s,t=0;


        for(s=1;s=4&&(i-s)=0;s++)
        {
            if(TempBoard[i-s][j]==TempBoard[j])
                t++;
            if(TempBoard[i-s][j]!=TempBoard[j])
                break;
        }
        for(s=1;s=4&&(i+s)=14;s++)
        {
            if(TempBoard[i+s][j]==TempBoard[j])
                t++;
            if(TempBoard[i+s][j]!=TempBoard[j])
                break;
        }
        if(t=4)
            return 1;


        t=0;
        for(s=1;s=4&&(j-s)=0;s++)
        {
            if(TempBoard[j-s]==TempBoard[j])
                t++;
            if(TempBoard[j-s]!=TempBoard[j])
                break;
        }
        for(s=1;s=4&&(j+s)=14;s++)
        {
            if(TempBoard[j+s]==TempBoard[j])
                t++;
            if(TempBoard[j+s]!=TempBoard[j])
                break;
        }
        if(t=4)
            return 1;


        t=0;
        for(s=1;s=4&&(i-s)=0&&(j-s)=0;s++)
        {
            if(TempBoard[i-s][j-s]==TempBoard[j])
                t++;
            if(TempBoard[i-s][j-s]!=TempBoard[j])
                break;
        }
        for(s=1;s=4&&(i+s)=14&&(j+s)=14;s++)
        {
            if(TempBoard[i+s][j+s]==TempBoard[j])
                t++;
            if(TempBoard[i+s][j+s]!=TempBoard[j])
                break;
        }
        if(t=4)
            return 1;


        t=0;
        for(s=1;s=4&&(i-s)=0&&(j+s)=14;s++)
        {
            if(TempBoard[i-s][j+s]==TempBoard[j])
                t++;
            if(TempBoard[i-s][j+s]!=TempBoard[j])
                break;
        }
        for(s=1;s=4&&(i+s)=14&&(j-s)=0;s++)
        {
            if(TempBoard[i+s][j-s]==TempBoard[j])
                t++;
            if(TempBoard[i+s][j-s]!=TempBoard[j])
                break;
        }
        if(t=4)
            return 1;


        return 0;
    }

    回复6楼
    2010-10-24 19:50
    举报 |个人企业举报垃圾信息举报

    //画棋子
    void Draw(HWND hwnd,int x,int y)
    {
        HDC hdc;
        hdc=GetDC(hwnd);
        if(Turn)
            SelectObject(hdc,GetStockObject(BLACK_BRUSH));
        else
        {
            SelectObject(hdc,GetStockObject(WHITE_BRUSH));
            SelectObject(hdc,GetStockObject(WHITE_PEN));
        }
        Ellipse(hdc,30*x+20,30*y+20,30*x+40,30*y+40);
        ReleaseDC(hwnd,hdc);
    }

    回复
    8楼
    2010-10-24 19:54
    举报 |个人企业举报垃圾信息举报

     

    阿宾和白洁
    超能力者9
    //画棋盘
    void DrawBoard(HDC hdc)
    {
        int i,j;
        HPEN hPen;
        HBRUSH hBrush;
        hPen=CreatePen(PS_SOLID,2,RGB(0,255,0));
        SelectObject(hdc,hPen);
        hBrush=CreateSolidBrush(RGB(255,255,0));
        SelectObject(hdc,hBrush);
        for(i=0;i14;i++)
        {
            for(j=0;j14;j++)
            {
                Rectangle(hdc,30+30*i,30+30*j,60+30*i,60+30*j);
            }
        }
        DeleteObject(hPen);
        DeleteObject(hBrush);
        hPen=CreatePen(PS_SOLID,2,RGB(255,0,0));
        SelectObject(hdc,hPen);
        hBrush=CreateSolidBrush(RGB(255,0,0));
        SelectObject(hdc,hBrush);
        Ellipse(hdc,235,235,245,245);
        Ellipse(hdc,115,115,125,125);
        Ellipse(hdc,355,115,365,125);
        Ellipse(hdc,115,355,125,365);
        Ellipse(hdc,355,355,365,365);
        DeleteObject(hPen);
        DeleteObject(hBrush);
    }



    //定义一个ai状态的结构
    struct AIStep
    {
        int flag;
        int EndFlag;
        int weight;
        struct AIStep *child1;
        struct AIStep *child2;
        struct AIStep *child3;
        int board[15][15];
    };
    //计算权值
    int CalWeight(int i,int j,struct AIStep *NowStep)
    {
        int Weight=0;
        int s,t;
        int a[2][8],b[2][8];
        if(NowStep-board[j]!=0)
            Weight=-1;
        else
        {
            for(s=0;s=7;s++)
            {
                a[0][s]=0;
                b[0][s]=0;
                a[1][s]=1;
                b[1][s]=1;
            }
            for(s=1;s=4&&(i-s)=0;s++)             //←
            {
                if(NowStep-board[i-s][j]==1)
                    a[0][0]++;
                if(NowStep-board[i-s][j]==0)
                {
                    a[1][0]=0;
                    break;
                }
                if(NowStep-board[i-s][j]==2)
                {
                    a[1][0]=1;
                    break;
                }
            }
            for(s=1;s=4&&(i+s)=14;s++)         //→
            {
                if(NowStep-board[i+s][j]==1)
                    a[0][1]++;
                if(NowStep-board[i+s][j]==0)
                {
                    a[1][1]=0;



                break;
                }
                if(NowStep-board[i+s][j]==2)
                {
                    a[1][1]=1;
                    break;
                }
            }


            for(s=1;s=4&&(j-s)=0;s++)             //↑
            {
                if(NowStep-board[j-s]==1)
                    a[0][2]++;
                if(NowStep-board[j-s]==0)
                {
                    a[1][2]=0;
                    break;
                }
                if(NowStep-board[j-s]==2)
                {
                    a[1][2]=1;
                    break;
                }
            }
            for(s=1;s=4&&(j+s)=14;s++)         //↓
            {
                if(NowStep-board[j+s]==1)
                    a[0][3]++;
                if(NowStep-board[j+s]==0)
                {
                    a[1][3]=0;
                    break;
                }



        if(NowStep-board[j+s]==2)
                {
                    a[1][3]=1;
                    break;
                }
            }


            for(s=1;s=4&&(i-s)=0&&(j-s)=0;s++)         //↖
            {
                if(NowStep-board[i-s][j-s]==1)
                    a[0][4]++;
                if(NowStep-board[i-s][j-s]==0)
                {
                    a[1][4]=0;
                    break;
                }
                if(NowStep-board[i-s][j-s]==2)
                {
                    a[1][4]=1;
                    break;
                }
            }
            for(s=1;s=4&&(i+s)=14&&(j+s)=14;s++)         //↘
            {
                if(NowStep-board[i+s][j+s]==1)
                    a[0][5]++;
                if(NowStep-board[i+s][j+s]==0)
                {
                    a[1][5]=0;
                    break;
                }
                if(NowStep-board[i+s][j+s]==2)
                {



                a[1][5]=1;
                    break;
                }
            }


            for(s=1;s=4&&(i-s)=0&&(j+s)=14;s++)         //↙
            {
                if(NowStep-board[i-s][j+s]==1)
                    a[0][6]++;
                if(NowStep-board[i-s][j+s]==0)
                {
                    a[1][6]=0;
                    break;
                }
                if(NowStep-board[i-s][j+s]==2)
                {
                    a[1][6]=1;
                    break;
                }
            }
            for(s=1;s=4&&(i+s)=14&&(j-s)=0;s++)         //↗
            {
                if(NowStep-board[i+s][j-s]==1)
                    a[0][7]++;
                if(NowStep-board[i+s][j-s]==0)
                {
                    a[1][7]=0;
                    break;
                }
                if(NowStep-board[i+s][j-s]==2)
                {
                    a[1][7]=1;
                    break;
                }
            }


       for(s=0;s=7;s+=2)                         //成五
            {
                if((a[0][s]+a[0][s+1])=4)
                    Weight+=10000;
            }
            for(s=0;s=7;s+=2)                         //活四
            {
                if((a[0][s]+a[0][s+1])==3&&a[1][s]==0&&a[1][s+1]==0)
                Weight+=10000;
            }
            for(s=0;s=7;s+=2)
            {
                if((a[0][s]+a[0][s+1])==3&&((a[1][s]==0&&a[1][s+1]==1)||(a[1][s]==1&&a[1][s+1]==0)))    
                {
                    for(t=0;t=7;t+=2)
                    {
                        if((a[0][t]+a[0][t+1])==2&&a[1][t]==0&&a[1][t+1]==0)         //死四活三
                            Weight+=10000;
                        if(t!=s&&(a[0][t]+a[0][t+1])==3&&((a[1][t]==0&&a[1][t+1]==1)||(a[1][t]==1&&a[1][t+1]==0))) //双死四
                            Weight+=5000;
                    }
                    Weight+=500;         //单死四
                }
            }
            for(s=0;s=7;s+=2)
            {


        if((a[0][s]+a[0][s+1]==2)&&a[1][s]==0&&a[1][s+1]==0)    
                {
                    for(t=0;t=7;t+=2)
                    {
                        if(s!=t&&(a[0][t]+a[0][t+1]==2)&&a[1][t]==0&&a[1][t+1]==0)         //双活三
                            Weight+=2500;
                        if(s!=t&&(a[0][t]+a[0][t+1])==2&&((a[1][t]==0&&a[1][t+1]==1)||(a[1][t]==1&&a[1][t+1]==0)))         //死三活三
                            Weight+=1000;
                    }
                    Weight+=200;         //单活三
                }
            }
            for(s=0;s=7;s+=2)
            {
                if((a[0][s]+a[0][s+1])==2&&((a[1][s]==0&&a[1][s+1]==1)||(a[1][s]==1&&a[1][s+1]==0)))
                {
                    for(t=0;t=7;t+=2)
                    {
                        if(s!=t&&(a[0][t]+a[0][t+1])==2&&((a[1][t]==0&&a[1][t+1]==1)||(a[1][t]==1&&a[1][t+1]==0)))     //双死三
                            Weight+=50;
                    }
                    Weight+=50;         //单死三


               }
            }
            for(s=0;s=7;s+=2)
            {
                if((a[0][s]+a[0][s+1]==1)&&a[1][s]==0&&a[1][s+1]==0)
                {
                    for(t=0;t=7;t+=2)
                    {
                        if(s!=t&&(a[0][t]+a[0][t+1]==1)&&a[1][t]==0&&a[1][t+1]==0)         //双活二
                            Weight+=5;
                        if(s!=t&&(a[0][t]+a[0][t+1])==1&&((a[1][t]==0&&a[1][t+1]==1)||(a[1][t]==1&&a[1][t+1]==0)))         //死二活二
                            Weight+=7;
                    }
                    Weight+=5;         //单活二
                }
            }
            for(s=0;s=7;s+=2)
            {
                if((a[0][s]+a[0][s+1])==1&&((a[1][s]==0&&a[1][s+1]==1)||(a[1][s]==1&&a[1][s+1]==0)))
                {
                    for(t=0;t=7;t+=2)
                    {
                        if(s!=t&&(a[0][t]+a[0][t+1])==1&&((a[1][t]==0&&a[1][t+1]==1)||(a[1][t]==1&&a[1][t+1]==0)))         //双死二
                            Weight+=2;
                    }
                    Weight+=3;         //单死二
                }
            }

     for(s=1;s=4&&(i-s)=0;s++)             //←
            {
                if(NowStep-board[i-s][j]==2)
                    b[0][0]++;
                if(NowStep-board[i-s][j]==0)
                {
                    b[1][0]=0;
                    break;
                }
                if(NowStep-board[i-s][j]==1)
                {
                    b[1][0]=1;
                    break;
                }
            }
            for(s=1;s=4&&(i+s)=14;s++)             //→
            {
                if(NowStep-board[i+s][j]==2)
                    b[0][1]++;
                if(NowStep-board[i+s][j]==0)
                {
                    b[1][1]=0;
                    break;
                }
                if(NowStep-board[i+s][j]==1)
                {
                    b[1][1]=1;
                    break;
                }
            }


            for(s=1;s=4&&(j-s)=0;s++)             //↑


            {             if(NowStep-board[j-s]==2)                 b[0][2]++;             if(NowStep-board[j-s]==0)             {                 b[1][2]=0;                 break;             }             if(NowStep-board[j-s]==1)             {                 b[1][2]=1;                 break;             }         }         for(s=1;s=4&&(j+s)=14;s++)         //↓         {             if(NowStep-board[j+s]==2)                 b[0][3]++;             if(NowStep-board[j+s]==0)             {                 b[1][3]=0;                 break;             }             if(NowStep-board[j+s]==1)             {                 b[1][3]=1;                 break;             }         }

            for(s=1;s=4&&(i-s)=0&&(j-s)=0;s++)         //↖         {             if(NowStep-board[i-s][j-s]==2)

                b[0][4]++;
                if(NowStep-board[i-s][j-s]==0)
                {
                    b[1][4]=0;
                    break;
                }
                if(NowStep-board[i-s][j-s]==1)
                {
                    b[1][4]=1;
                    break;
                }
            }
            for(s=1;s=4&&(i+s)=14&&(j+s)=14;s++)         //↘
            {
                if(NowStep-board[i+s][j+s]==2)
                    b[0][5]++;
                if(NowStep-board[i+s][j+s]==0)
                {
                    b[1][5]=0;
                    break;
                }
                if(NowStep-board[i+s][j+s]==1)
                {
                    b[1][5]=1;
                    break;
                }
            }


            for(s=1;s=4&&(i-s)=0&&(j+s)=14;s++)         //↙
            {
                if(NowStep-board[i-s][j+s]==2)
                    b[0][6]++;
                if(NowStep-board[i-s][jj+s]==0)


         {
                    b[1][6]=0;
                    break;
                }
                if(NowStep-board[i-s][j+s]==1)
                {
                    b[1][6]=1;
                    break;
                }
            }
            for(s=1;s=4&&(i+s)=14&&(j-s)=0;s++)         //↗
            {
                if(NowStep-board[i+s][j-s]==2)
                    b[0][7]++;
                if(NowStep-board[i+s][j-s]==0)
                {
                    b[1][7]=0;
                    break;
                }
                if(NowStep-board[i+s][j-s]==1)
                {
                    b[1][7]=1;
                    break;
                }
            }


    for(s=0;s=7;s++)                         //成五
            {
                if((b[0][s]+b[0][s+1])=4)
                    Weight+=10000;
            }
            for(s=0;s=7;s+=2)                         //活四
            {
                if((b[0][s]+b[0][s+1])==3&&b[1][s]==0&&b[1][s+1]==0)
                Weight+=10000;
            }
            for(s=0;s=7;s+=2)
            {
                if((b[0][s]+b[0][s+1])==3&&((b[1][s]==0&&b[1][s+1]==1)||(b[1][s]==1&&b[1][s+1]==0)))    
                {
                    for(t=0;t=7;t+=2)
                    {
                        if((b[0][t]+b[0][t+1])==2&&b[1][t]==0&&b[1][t+1]==0)         //死四活三
                            Weight+=10000;
                        if(t!=s&&(b[0][t]+b[0][t+1])==3&&((b[1][t]==0&&b[1][t+1]==1)||(b[1][t]==1&&b[1][t+1]==0))) //双死四
                            Weight+=5000;
                    }
                    Weight+=500;         //单死四
                }
            }
            for(s=0;s=7;s+=2)
            {


       if((b[0][s]+b[0][s+1]==2)&&b[1][s]==0&&b[1][s+1]==0)    
                {
                    for(t=0;t=7;t+=2)
                    {
                        if(s!=t&&(b[0][t]+b[0][t+1]==2)&&b[1][t]==0&&b[1][t+1]==0)         //双活三
                            Weight+=2500;
                        if(s!=t&&(b[0][t]+b[0][t+1])==2&&((b[1][t]==0&&b[1][t+1]==1)||(b[1][t]==1&&b[1][t+1]==0)))         //死三活三
                            Weight+=1000;
                    }
                    Weight+=200;         //单活三
                }
            }
            for(s=0;s=7;s+=2)
            {
                if((b[0][s]+b[0][s+1])==2&&((b[1][s]==0&&b[1][s+1]==1)||(b[1][s]==1&&b[1][s+1]==0)))
                {
                    for(t=0;t=7;t+=2)
                    {
                        if(s!=t&&(b[0][t]+b[0][t+1])==2&&((b[1][t]==0&&b[1][t+1]==1)||(b[1][t]==1&&b[1][t+1]==0)))     //双死三
                            Weight+=50;
                    }
                    Weight+=50;         //单死三


                }
            }
            for(s=0;s=7;s+=2)
            {
                if((b[0][s]+b[0][s+1]==1)&&b[1][s]==0&&b[1][s+1]==0)
                {
                    for(t=0;t=7;t+=2)
                    {
                        if(s!=t&&(b[0][t]+b[0][t+1]==1)&&b[1][t]==0&&b[1][t+1]==0)         //双活二
                            Weight+=5;
                        if(s!=t&&(b[0][t]+b[0][t+1])==1&&((b[1][t]==0&&b[1][t+1]==1)||(b[1][t]==1&&b[1][t+1]==0)))         //死二活二
                            Weight+=7;
                    }
                    Weight+=5;         //单活二
                }
            }
            for(s=0;s=7;s+=2)
            {
                if((b[0][s]+b[0][s+1])==1&&((b[1][s]==0&&b[1][s+1]==1)||(b[1][s]==1&&b[1][s+1]==0)))
                {
                    for(t=0;t=7;t+=2)
                    {
                        if(s!=t&&(b[0][t]+b[0][t+1])==1&&((b[1][t]==0&&b[1][t+1]==1)||(b[1][t]==1&&b[1][t+1]==0)))         //双死二
                            Weight+=2;
                    }
                    Weight+=3;         //单死二
                }
            }
        }
        return Weight;
    }

    //计算下一步
    void NextStep(struct AIStep *parent)
    {
        if(parent-EndFlag=Steps)
        {
            int i,j;
            int Maxx=7,Maxy=7,Mediumx=7,Mediumy=7,Minx=7,Miny=7;
            int Weight=0,MaxWeight=0,MediumWeight=0,MinWeight=0;
            struct AIStep *next1,*next2,*next3;
            for(i=0;i=14;i++)
            {
                for(j=0;j=14;j++)
                {
                    Weight=CalWeight(i,j,parent);
                    if(WeightMaxWeight)
                    {
                        MaxWeight=Weight;
                        Maxx=i;
                        Maxy=j;
                    }
                    else if(WeightMediumWeight)
                    {
                        MediumWeight=Weight;
                        Mediumx=i;

    楼主 2016-04-15 08:56 回复

共有回帖数 1
  • 回 帖
  • 表情 图片 视频
  • 发表

登录直线网账号

Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号 意见反馈 | 关于直线 | 版权声明 | 会员须知