鱼C论坛

 找回密码
 立即注册
查看: 24724|回复: 150

[技术交流] 五子棋AI(人机对战)源码-阶段考核作业

  [复制链接]
发表于 2017-2-1 11:50:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
//之前发过人人对战源码,这次假期闲来无事,终于将人机对战给完成了,虽然机器"智力"比较低,但也是自己独立完成的、、,特发出来与大家分享,不喜勿喷
//感谢鱼C,感谢小甲鱼的教程
//使用Microsoft visual studio 2015编写编译
#include <windows.h>
#include <winuser.h>
#define bool unsigned short//由于C语言没有bool类型  所以这里把它定义为unsigned short
#define true 1
#define false 0
#define CHESSBOARD_NUMBER 15//棋盘规格,注棋盘中黑点不随规格改变而改变
#define BLACK_CHESS_PIECES 1//定义黑色棋子 值为1
#define WHITE_CHESS_PIECES 2  //定义白色棋子  值为2
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int pr_chess_color;//待下棋子颜色
int z_DrawChessMap(HDC hdc,int extent,int cxClient,int cyClient);//绘制棋盘(设备环境句柄,棋盘规格extent*extent,客户区宽度,客户区高度)
int z_initialise_chessboard(struct st_chess_pieces arr_chessboard[CHESSBOARD_NUMBER][CHESSBOARD_NUMBER], int cxClient, int cyClient, bool is_initialise); // 初始化棋盘, 更新棋盘坐标, 需提供客户区大小, 如果is_initialise值为true, 则初始化棋盘颜色
int z_Draw_chesspieces(struct st_chess_pieces arr_chessboard[CHESSBOARD_NUMBER][CHESSBOARD_NUMBER], HDC hdc,HWND hwnd);//绘制棋子
int z_xiaqi(struct st_chess_pieces arr_chessboard[CHESSBOARD_NUMBER][CHESSBOARD_NUMBER], int x, int y, HWND hwnd);//下棋
int z_is_ok(struct st_chess_pieces arr_chessboard[CHESSBOARD_NUMBER][CHESSBOARD_NUMBER]);//判断是否赢棋,黑子赢返回1,白棋赢返回2
int z_calc_score(struct st_value_tab value_tab_st[26], struct st_value_tab point_tab);//计算指定表分值,须传入评分表,点表
POINT computerAI(struct st_chess_pieces arr_chessboard[CHESSBOARD_NUMBER][CHESSBOARD_NUMBER], int  pr_chess_color);//电脑智能走棋算法,传入棋盘数组及要落子颜色,返回落子坐标
struct st_chess_pieces
{
        int extra;//预留
        int chess_color;//棋子颜色(RGB)
        POINT x_y;//棋子坐标(x,y)
};
struct st_value_tab
{
        char x1[7];
        int score;
};
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
        static TCHAR szAppName[] = TEXT("MyWindows");//窗口类名
        HWND hwnd;//窗口句柄
        MSG msg;//消息
        WNDCLASS wndclass;//窗口类

        wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;//窗口风格
        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(WHITE_BRUSH);//背景
        wndclass.lpszMenuName = NULL;//菜单句柄
        wndclass.lpszClassName = szAppName;//窗口类名

        if (!RegisterClass(&wndclass))//注册窗口类
        {
                MessageBox(NULL, TEXT("这个程序需要在 Windows NT 才能执行!"), szAppName, MB_ICONERROR);
                return 0;
        }

        hwnd = CreateWindow(szAppName,
                TEXT("人执白子,电脑执黑子     五子棋-AI算法"), //标题
                WS_OVERLAPPEDWINDOW,
                CW_USEDEFAULT,
                CW_USEDEFAULT,
                600, //窗口大小
                600,
                NULL,
                NULL,
                hInstance,
                NULL);
       
        ShowWindow(hwnd, iCmdShow);//显示窗口
        UpdateWindow(hwnd);//更新窗口

        while (GetMessage(&msg, NULL, 0, 0))//消息循环
        {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
        }

        return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)//处理消息
{
        static HDC hdc;
        PAINTSTRUCT ps;
        RECT rect;
        POINT cursor_point;
        int iGainer;//胜棋者
        static cx_Client;
        static cy_Client;
        static bool bChessBoard_invalidate;//表示棋盘是否能下棋,true不能下,false能下
        static struct st_chess_pieces arr_chessboard[CHESSBOARD_NUMBER][CHESSBOARD_NUMBER];//棋盘数组
        POINT ai_xiaqi;//ai下棋坐标

        switch (message)
        {
        case WM_PAINT:
                hdc = BeginPaint(hwnd, &ps);
                GetClientRect(hwnd, &rect);
                z_DrawChessMap(hdc, CHESSBOARD_NUMBER, rect.right, rect.bottom);//绘制棋盘
                z_Draw_chesspieces(arr_chessboard, hdc,hwnd);//绘制棋子
                EndPaint(hwnd, &ps);
                return 0;
        case WM_SIZE:
                cx_Client = LOWORD(lParam);
                cy_Client = HIWORD(lParam);
                z_initialise_chessboard(arr_chessboard, cx_Client ,cy_Client, false);
                return 0;
        case WM_CREATE:
                pr_chess_color=WHITE_CHESS_PIECES;//初始化白棋
                return 0;
        case WM_LBUTTONUP://下棋
                if (bChessBoard_invalidate == true)//棋盘不能下棋,直接返回
                {
                        return 0;
                }
                GetCursorPos(&cursor_point);//获取鼠标在屏幕内坐标
                ScreenToClient(hwnd, &cursor_point);//将鼠标在屏幕内坐标转换为窗口客户区坐标
                z_xiaqi(arr_chessboard, cursor_point.x, cursor_point.y, hwnd);//将鼠标坐标传入下棋函数
                InvalidateRect(hwnd, NULL, true);//发送客户区失效,重绘客户区
                iGainer = z_is_ok(arr_chessboard);
                if (iGainer == 1)//黑子胜
                {
                        MessageBox(hwnd, TEXT("黑子胜!\n双击鼠标左键重新开盘!"), TEXT("提示:"), MB_OK);
                        bChessBoard_invalidate = true;
                        return 0;
                }else if(iGainer ==2 )//白子胜
                {
                        MessageBox(hwnd,TEXT("白子胜!\n双击鼠标左键重新开盘!"),TEXT("提示:"),MB_OK);
                        bChessBoard_invalidate = true;
                        return 0;
                }
                if (pr_chess_color != BLACK_CHESS_PIECES)//当前落子不是黑色,结束不继续向下
                {
                        return 0;
                }
                //以下代码为计算机走棋
                Sleep(500);
                ai_xiaqi = computerAI(arr_chessboard, pr_chess_color);
                z_xiaqi(arr_chessboard, ai_xiaqi.x, ai_xiaqi.y, hwnd);//将鼠标坐标传入下棋函数
                InvalidateRect(hwnd, NULL, true);//发送客户区失效,重绘客户区
                iGainer = z_is_ok(arr_chessboard);
                if (iGainer == 1)//黑子胜
                {
                        MessageBox(hwnd, TEXT("黑子胜!\n双击鼠标左键重新开盘!"), TEXT("提示:"), MB_OK);
                        bChessBoard_invalidate = true;
                }else if(iGainer ==2 )//白子胜
                {
                        MessageBox(hwnd,TEXT("白子胜!\n双击鼠标左键重新开盘!"),TEXT("提示:"),MB_OK);
                        bChessBoard_invalidate = true;
                }

                return 0;
        case WM_LBUTTONDBLCLK://鼠标左键双击
                if (MessageBox(hwnd, TEXT("是否重新开局!"), TEXT("提示:"), MB_YESNO) == IDYES)
                {
                        z_initialise_chessboard(arr_chessboard, cx_Client, cy_Client, true);//初始化棋盘
                        InvalidateRect(hwnd, NULL, true);//发送客户区失效,重绘客户区
                        bChessBoard_invalidate = false;//
                        pr_chess_color = WHITE_CHESS_PIECES;
                }
                return 0;
        case WM_DESTROY:
                PostQuitMessage(0);
                return 0;
               
        }

        return DefWindowProc(hwnd, message, wParam, lParam);
}
游客,如果您要查看本帖隐藏内容请回复


jdfw1.gif

评分

参与人数 2荣誉 +6 鱼币 +5 贡献 +3 收起 理由
NZND + 1 感谢楼主无私奉献!
alltolove + 5 + 5 + 3 感谢楼主无私奉献!

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-2-1 12:08:12 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-2-3 16:58:36 | 显示全部楼层
bbbbbbbbbbbbbbbbbbbb
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-6 15:30:56 | 显示全部楼层
太牛掰了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-6 18:36:35 | 显示全部楼层
666666666666666666666666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-12 00:47:38 | 显示全部楼层
666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-5-16 14:50:40 | 显示全部楼层
感谢楼主分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-16 14:51:54 | 显示全部楼层
牛逼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-5-20 19:11:30 | 显示全部楼层
66666666666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-29 12:21:21 | 显示全部楼层
hh
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-10-30 12:11:32 | 显示全部楼层
厉害了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-31 16:52:15 | 显示全部楼层
        感谢楼主无私奉献!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-1 09:16:45 | 显示全部楼层
寰堟劅鍏磋叮,鐪嬬湅
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-28 12:42:14 | 显示全部楼层
1>d:\c练习\test\test\test.cpp(85) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
这个怎么解决
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-3 11:15:20 | 显示全部楼层
棒棒哒
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-5 16:01:57 | 显示全部楼层
真不错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-6 10:34:16 | 显示全部楼层
niubi
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-12 14:58:32 | 显示全部楼层
看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-12-19 22:42:15 | 显示全部楼层
6666666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-10 22:28:27 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 23:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表