[游戏模版18] Win32 五子棋
>_<: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 五子棋的更多相关文章
- [游戏模版2] Win32最小框架
>_<:Just the minimum Win32 frame don't have any other special function. //{{NO_DEPENDENCIES}} ...
- [游戏模版3] Win32 画笔 画刷 图形
>_<:introduce the functions of define\create\use pen and brush to draw all kinds of line and s ...
- [游戏模版4] Win32 显示鼠标位置
>_<:use MOUSE_MOVE message refresh the position information. >_<:use LOWORD(lParam) get ...
- [游戏模版5] Win32 折线 弧线
>_<:first build some points put in poly1[],poly2[] and poly3[] in the function of InitInstance ...
- [游戏模版6] Win32 graph
>_<:there in the MyPaint(...) function respectively use Ellipse(...) draw ellipse, use RoundRe ...
- [游戏模版7] Win32 最简单贴图
>_<:this is the first using mapping. >_<:There will be introducing how to do: First load ...
- [游戏模版8] Win32 透明贴图
>_<:The same with previous introduction. In the InitInstance fanction make a little change: &g ...
- [游戏模版9] Win32 半透明 图像处理
>_<:Previous part we talk about how to map a transparent picture, and this time we will solve ...
- [游戏模版10] Win32 平面地图贴图 正
>_<:picture resource >_<:If you master the ways of mapping picture,then this problem is ...
随机推荐
- PHP基于SOAP实现webservice
简单对象访问协议(SOAP)是一种轻量的.简单的.基于 XML 的协议,它被设计成在 WEB 上交换结构化的和固化的信息. SOAP 可以和现存的许多因特网协议和格式结合使用,包括超文本传输协议( H ...
- 如何让我们的VMware虚拟机上网——转载
一.必须检查你的windows系统的VMware DHCP Service 和VMware NAT Service这个两个服务是否启动.如果未启动请启动. 1,在开始windows里面输入servic ...
- shell讲解-小案例
shell讲解-小案例 一.文件拷贝输出检查 下面测试文件拷贝是否正常,如果cp命令并没有拷贝文件myfile到myfile.bak,则打印错误信息.注意错误信息中basename $0打印脚本名.如 ...
- Appium学习路-打包apk和ipa篇
间隔这么长时间再去写Appium的学习篇是有原因的,因为在想要用appium测试ios时,发现appium只能测试debug版本的ipa包.然后就需要自己去学习打包了啊.然后就对xcode各种不了解, ...
- 用Python玩转词云
第一步:引入相关的库包: #coding:utf-8 __author__ = 'Administrator' import jieba #分词包 import numpy #numpy计算包 imp ...
- CoreData创建
云盘-->CoreData文件 一 创建表打开点击增加的Entity名字应该与 EntityForName一致 二 创建NSManageObject SubClass 三 拖进CoreD ...
- css基本知识框架(转)
css基本知识框架: 1.css样式表的基本概念 2.样式表基本类型-----1.内嵌样式 2.内联样式3.链入外部样式表4.导入外部?式 3.样式表配置方法 4.字体属性----1.font-fam ...
- Oracle基础知识笔记
1.打开oracle相关服务 2.创建Oracle用户 create user 用户名 identified by 密码;(需要dba角色创建) 3.权限管理 (1)添加权限 grant 权限.角色 ...
- IT公司笔试题(一)
1. 已知一个递归算法的算法复杂度计算公式为T(n) = T(n/2) + n,则T(n)的算法复杂度为多少? 解:O(n) T(n) = T(n/2) + n = T(n/4) + n/2 + n ...
- github 项目版本控制
1.申请github账号 2.安装github for windows工具 安装后就可以使用Git Bash打开特制的终端,在里面用来命令行了.喜欢Git命令行方式的朋友到这里就够了. 打开Git B ...