>_<:Learning its AI logic.

>_<:resource

>_<:code:

 #include <windows.h>
// C 运行时头文件
#include <stdlib.h>
#include <cstdio>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>
#include <time.h>
#include <string>
#include <cmath> #define MAX_LOADSTRING 100
// 全局变量:
HINSTANCE hInst; // 当前实例
TCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本
TCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名
HBITMAP cheers[];
HDC hdc,mdc,bufdc;
HWND hWnd;
DWORD tPre,tNow;
int board[][]; //记录棋盘上格子的信息0,1,2分标表示玩家棋子、电脑棋子、空
bool ptab[][][]; //玩家获胜表
bool ctab[][][]; //电脑获胜表
int win[][];
int num[]; //分别计算玩家和计算机下棋个数
bool turn,over;//turn 用来指示是有哪一方下棋,true玩家;false电脑;;over 指示棋局是否结束,ture结束
int begin;
int winner; //指示当前棋局谁赢0表示玩家赢;1表示电脑赢;2表示平局 // 此代码模块中包含的函数的前向声明:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
void MyPaint(HDC hdc);
void InitGame();//游戏初始操作
void ComTurn();//计算机下棋时计算分数决定下棋位置 int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow){ MSG msg;
MyRegisterClass(hInstance);
// 执行应用程序初始化:
if (!InitInstance (hInstance, nCmdShow)){
return FALSE;
}
// 主消息循环:
while (GetMessage(&msg, NULL, , )){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int) msg.wParam;
} // 函数: MyRegisterClass()
//
// 目的: 注册窗口类。
ATOM MyRegisterClass(HINSTANCE hInstance){
WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = ;
wcex.cbWndExtra = ;
wcex.hInstance = hInstance;
wcex.hIcon = NULL;
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+);
wcex.lpszMenuName = "Beautifulzzzz";
wcex.lpszClassName = "Beautifulzzzz";
wcex.hIconSm = NULL; return RegisterClassEx(&wcex);
} //
// 函数: InitInstance(HINSTANCE, int)
//
// 目的: 保存实例句柄并创建主窗口
//
// 注释:
//
// 在此函数中,我们在全局变量中保存实例句柄并
// 创建和显示主程序窗口。
// 棋盘拼接以及调用InitGame()开始棋局
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow){
HBITMAP tile,bmp;
int rowNum,colNum;
int i,x,y; hInst = hInstance; // 将实例句柄存储在全局变量中 begin=;
hWnd = CreateWindow("Beautifulzzzz","Beautifulzzzz", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, , CW_USEDEFAULT, , NULL, NULL, hInstance, NULL); if (!hWnd)
{
return FALSE;
} MoveWindow(hWnd,,,,,true);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd); hdc=GetDC(hWnd);
mdc=CreateCompatibleDC(hdc);
bufdc=CreateCompatibleDC(hdc); bmp=CreateCompatibleBitmap(hdc,,);
SelectObject(mdc,bmp); tile=(HBITMAP)LoadImageA(NULL,"tile.bmp",IMAGE_BITMAP,,,LR_LOADFROMFILE);
cheers[]=(HBITMAP)LoadImageA(NULL,"cheers[0].bmp",IMAGE_BITMAP,,,LR_LOADFROMFILE);
cheers[]=(HBITMAP)LoadImageA(NULL,"cheers[1].bmp",IMAGE_BITMAP,,,LR_LOADFROMFILE); for(i=;i<;i++)//产生棋盘
{
rowNum=i/;
colNum=i%;
x=colNum*;
y=rowNum*; SelectObject(bufdc,tile);
BitBlt(mdc,x,y,,,bufdc,,,SRCCOPY);
} InitGame();//初始化 SetTimer(hWnd,,,NULL);
MyPaint(hdc); begin=;
return TRUE;
} //
// 函数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
// 目的: 处理主窗口的消息。
//
// WM_COMMAND - 处理应用程序菜单
// WM_PAINT - 绘制主窗口
// WM_DESTROY - 发送退出消息并返回
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){
int wmId, wmEvent;
PAINTSTRUCT ps;
int x,y,m,n,i; switch (message){
case WM_TIMER:
A:MyPaint(hdc);
break;
case WM_KEYDOWN://按下见消息
switch(wParam){
case VK_ESCAPE:
PostQuitMessage();
break;
case VK_F1:
InitGame();
break;
}
break;
case WM_LBUTTONDOWN:
if(!over)
if(turn)
{
x=LOWORD(lParam);
y=HIWORD(lParam); if(x> && x< && y> && y<)
{
m=(int)floor((double)((x-)/));
n=(int)floor((double)((y-)/)); if(board[m][n]==)
{
board[m][n]=;
num[]++; if(num[]== && num[]==)
{
winner=;
over=true;
}
else for(i=;i<;i++)
{
if(ptab[m][n][i])
{
win[][i]++;
ctab[m][n][i]=false;
win[][i]=; if(win[][i]==)
{
winner=;
over=true;
}
}
}
turn=false;//换由计算机下
}
}
}
break;
case WM_PAINT:
if(begin==){
hdc = BeginPaint(hWnd, &ps);
goto A;// TODO: 在此添加任意绘图代码...
EndPaint(hWnd, &ps);}
break;
case WM_DESTROY:
DeleteDC(mdc);
DeleteDC(bufdc);
DeleteObject(cheers[]);
DeleteObject(cheers[]); ReleaseDC(hWnd,hdc); PostQuitMessage();
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return ;
} //初始化棋盘
//1、设定棋盘初始状态及获胜表内容
//2、决定先下子的一方`
void InitGame(){
int i,j,k;
int count=; over=false;
num[]=num[]=; //设定玩家与计算机在各个获胜组合中的棋子数
for(i=;i<;i++){
win[][i]=;
win[][i]=;
} //初始化棋盘状态
for(i=;i<;i++)
for(j=;j<;j++)
board[i][j]=; //设定水平方向的获胜组合
for(i=;i<;i++){
for(j=;j<;j++){
for(k=;k<;k++){//5个棋子1个获胜组合 ptab[i][j+k][count]=true;
ctab[i][j+k][count]=true;
}
count++;
}
} //设定垂直方向的获胜组合
for(i=;i<;i++){
for(j=;j<;j++){
for(k=;k<;k++){
ptab[j+k][i][count]=true;
ctab[j+k][i][count]=true;
}
count++;
}
} //设定正对角线方向上的获胜组合
for(i=;i<;i++){
for(j=;j<;j++){
for(k=;k<;k++){
ptab[j+k][i+k][count]=true;
ctab[j+k][i+k][count]=true;
}
count++;
}
} //设定反对角线方向的获胜组合
for(i=;i<;i++){
for(j=;j>=;j--){
for(k=;k<;k++){
ptab[j-k][i+k][count]=true;
ctab[j-k][i+k][count]=true;
}
count++;
}
} //随机数决定由哪一方先下棋子
srand(GetTickCount());
if(rand()%==)
turn=true;
else
turn=false;
} //计算机下棋函数
//1、计算获胜分数
//2、选择最佳位置进行下棋
void ComTurn(){
int grades[][][];
int m,n,i,max=;
int u,v; for(m=;m<;m++){
for(n=;n<;n++){
grades[][m][n]=;
grades[][m][n]=; if(board[m][n]==){
for(i=;i<;i++){
//计算玩家在空棋格上的获胜分数
if(ptab[m][n][i] && win[][i]!=){
switch(win[][i]){
case :
grades[][m][n]+=;
break;
case :
grades[][m][n]+=;
break;
case :
grades[][m][n]+=;
break;
case :
grades[][m][n]+=;
break;
case :
grades[][m][n]+=;
break;
}
} //计算计算机在空格上的获胜分数
if(ctab[m][n][i] && win[][i]!=){
switch(win[][i]){
case :
grades[][m][n]+=;
break;
case :
grades[][m][n]+=;
break;
case :
grades[][m][n]+=;
break;
case :
grades[][m][n]+=;
break;
case :
grades[][m][n]+=;
break;
}
}
} if(max==){
u=m;
v=n;
} if(grades[][m][n]>max){
max=grades[][m][n];
u=m;
v=n;
}else if(grades[][m][n]==max){
if(grades[][m][n]>grades[][u][v]){
u=m;
v=n;
}
} if(grades[][m][n]>max){
max=grades[][m][n];
u=m;
v=n;
}else if(grades[][m][n]==max){
if(grades[][m][n]>grades[][u][v]){
u=m;
v=n;
}
}
}
}
} board[u][v]=;//设定为计算机的棋子
num[]++; if(num[]== && num[]==){
winner=;
over=true;
}else for(i=;i<;i++){
if(ctab[u][v][i]){
win[][i]++;
ptab[u][v][i]=false;
win[][i]=; if(win[][i]==){
winner=;
over=true;
}
}
}
turn=true;
} //MyPaint()
void MyPaint(HDC hdc){
int m,n;
char* str;
char* whitestr=" "; if(over){
switch(winner){
case :
str="您赢了!按下[F1]键可重新进行游戏..";
break;
case :
str="计算机赢了!按下[F1]键可重新进行游戏..";
break;
case :
str="不分胜负!按下[F1]键可重新进行游戏..";
break;
}
TextOutA(hdc,,,whitestr,strlen(whitestr));
TextOutA(hdc,,,str,strlen(str));
} else if(!turn){ //电脑下棋
TextOutA(hdc,,,whitestr,strlen(whitestr));
str="计算机思考中...";
TextOutA(hdc,,,str,strlen(str));
ComTurn();
}else{
TextOutA(hdc,,,whitestr,strlen(whitestr));
str="该您下了...";
TextOutA(hdc,,,str,strlen(str));
} for(m=;m<;m++)
for(n=;n<;n++)
{
if(board[m][n]==)//贴上玩家棋子
{
SelectObject(bufdc,cheers[]);
BitBlt(mdc,m*+,n*+,,,bufdc,,,SRCCOPY);
}
else if(board[m][n]==)//贴上计算机棋子
{
SelectObject(bufdc,cheers[]);
BitBlt(mdc,m*+,n*+,,,bufdc,,,SRCCOPY);
}
else
{
SelectObject(bufdc,cheers[]);
BitBlt(mdc,m*+,n*+,,,bufdc,,,WHITENESS);
}
} BitBlt(hdc,,,,,mdc,,,SRCCOPY); tPre=GetTickCount();
}

[游戏模版18] Win32 五子棋的更多相关文章

  1. [游戏模版2] Win32最小框架

    >_<:Just the minimum Win32  frame don't have any other special function. //{{NO_DEPENDENCIES}} ...

  2. [游戏模版3] Win32 画笔 画刷 图形

    >_<:introduce the functions of define\create\use pen and brush to draw all kinds of line and s ...

  3. [游戏模版4] Win32 显示鼠标位置

    >_<:use MOUSE_MOVE message refresh the position information. >_<:use LOWORD(lParam) get ...

  4. [游戏模版5] Win32 折线 弧线

    >_<:first build some points put in poly1[],poly2[] and poly3[] in the function of InitInstance ...

  5. [游戏模版6] Win32 graph

    >_<:there in the MyPaint(...) function respectively use Ellipse(...) draw ellipse, use RoundRe ...

  6. [游戏模版7] Win32 最简单贴图

    >_<:this is the first using mapping. >_<:There will be introducing how to do: First load ...

  7. [游戏模版8] Win32 透明贴图

    >_<:The same with previous introduction. In the InitInstance fanction make a little change: &g ...

  8. [游戏模版9] Win32 半透明 图像处理

    >_<:Previous part we talk about how to map a transparent picture, and this time we will solve ...

  9. [游戏模版10] Win32 平面地图贴图 正

    >_<:picture resource >_<:If you master the ways of mapping picture,then this problem is ...

随机推荐

  1. js 正则 以字母开头必须有 大小写字母数字组成 可以有“@"或 ”.“

    js  正则  以字母开头必须有 大小写字母数字组成 可以有“@"或 ”.“ var reg = /^[a-zA-Z]{1}(?=.*[a-z])(?=.*[A-Z])[a-zA-Z\d_@ ...

  2. timingFunction

    *  动画的开始与结束的快慢,有五个预置分别为(下同): *  kCAMediaTimingFunctionLinear            线性,即匀速 *  kCAMediaTimingFunc ...

  3. 《CSS3秘籍》(第三版)-读书笔记

    第3章 选择器:明确设置哪些样式 每个样式(或者规则)由两个主要部分组成:选择器是告诉浏览器要格式化什么内容:声明块则列出浏览器用来给选择器定义样式的格式化指令. 1.标签选择器:整体控制 标签选择器 ...

  4. Unicode explorer

    It can be cumbersome to work out some of the details of this by hand, so you can use the little Java ...

  5. 使用apache和htaccess对目录访问设置密码保护配置教程

    对目录设置密码保护配置说明我们有时候访问某些网站的时候,要求输入用户名和密码才能访问.这是为了保护隐私,只让经过许可的人访问.在本教程中主要介绍两种方法,一种是通过apache httpd.conf配 ...

  6. select与poll函数介绍

    select与poll函数介绍 在所有依从POSIX的平台上,select函数使我们可以执行I/O多路转接.传向select的参数告诉内核: 1)我们所关心的描述符 2)对于每个描述符我们所关心的状态 ...

  7. 数据库操作(C#)

    数据库在软件开发中发挥着举足轻重的作用,基本上所有的大项目都会用到数据库.ADO .Net是一组向.Net程序员公开数据访问服务的类,其主要分为数据提供程序(Data Provider)和数据集(Da ...

  8. Python使用中文注释和输出中文(原创)

    刚开始学习python,需要在Python中注释中文和输出中文,现在开始尝试: 仅为初步学习参考,高手请绕行. -------------------------------------------- ...

  9. 状态机学习(三)解析JSON

    来自 从零开始的 JSON 库教程 从零开始教授如何写一个符合标准的 C 语言 JSON 库 作者 Milo Yip https://zhuanlan.zhihu.com/json-tutorial ...

  10. PoEdu - C++阶段班- Lesson07 To Lesson10_C to C++

    07  重载导致的二义性 问题:为什么一定要重载呢?重载能方便我们注重函数的功能,当参数类型不确定时,我们能很便捷的利用重载的机制达到目的. 重载注意点:二义性 看代码: #include <c ...