|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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);
}
|
-
评分
-
查看全部评分
|