#include<windows.h>
#include<stdio.h>
#include<math.h>
//--------变量声明
HBITMAP chess[2]; //对象数组 chess[0]玩家 chess[1]电脑
HDC hdc,mdc,bufdc; //棋盘状态
DWORD tPre,tNow;
HWND hwnd;
int board[10][10];
bool ptab[10][10][192]; //玩家获胜表
bool ctab[10][10][192]; //电脑获胜表
int win[2][192]; //第一位0代表玩家 1代表电脑 第二位判断获胜组合编号
int num[2]; //记录玩家和电脑的棋子数
bool turn,over=false; //turn来判断谁下棋 over判断是否结束
int winner; //winner0,1,2代表玩家赢 电脑赢 平局
//------函数声明
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
void mypaint(HDC hdc);
void InitGame();//初始游戏状态
void ComTurn();//计算机下棋调用函数
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int iCmdShow)
{
WNDCLASS wndclass;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndclass.hInstance=hInstance;
wndclass.lpfnWndProc=WndProc;
wndclass.lpszClassName="wnd";
wndclass.lpszMenuName=NULL;
wndclass.style=CS_HREDRAW | CS_VREDRAW;
RegisterClass(&wndclass);
hwnd=CreateWindow("wnd","五子棋",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);
MoveWindow(hwnd,10,10,480,520,true);
ShowWindow(hwnd,SW_NORMAL);
UpdateWindow(hwnd);
HBITMAP tile,bmp;
int rowNum,colNum;
int i,x,y;
hdc=GetDC(hwnd);
mdc=CreateCompatibleDC(hdc);
bufdc=CreateCompatibleDC(hdc);
bmp=CreateCompatibleBitmap(hdc,450,450);
SelectObject(mdc,bmp);
tile=(HBITMAP)LoadImage(NULL,"tile.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
chess[0]=(HBITMAP)LoadImage(NULL,"chess0.bmp",IMAGE_BITMAP,38,38,LR_LOADFROMFILE);
chess[1]=(HBITMAP)LoadImage(NULL,"chess1.bmp",IMAGE_BITMAP,38,38,LR_LOADFROMFILE);
for(i=0;i<100;i++)
{
rowNum=i/10;
colNum=i%10;
x=colNum*45;
y=rowNum*45;
SelectObject(bufdc,tile);
BitBlt(mdc,x,y,45,45,bufdc,0,0,SRCCOPY);
}
InitGame();
mypaint(hdc);
MSG msg;
while(GetMessage(&msg,NULL,0,0))//msg.message!=WM_QUIT)
{
// if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
// {
TranslateMessage(&msg);
DispatchMessage(&msg);
// }
// else
// {
// tNow=GetTickCount();
// if(tNow-tPre>=40)
// {
// mypaint(hdc);
// }
// }
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
int x,y,m,n,i;
switch(message)
{
case WM_KEYDOWN:
switch(wParam)
{
case VK_ESCAPE:
PostQuitMessage(0);
break;
case VK_F1:
InitGame();
break;
}
case WM_LBUTTONDOWN:
if(!over)
{
if(turn)
{
x=LOWORD(lParam);
y=HIWORD(lParam);
if(x>10 && x<460 && y>10 && y<460)
{
m=(int)floor((double)((x-10)/45));
n=(int)floor((double)((y-10)/45));
if(board[m][n]==2)
{
board[m][n]=0;
num[0]++;
if(num[0]==50 && num[1]==50)
{
winner=2;
over=true;
}
else
{
for(i=0;i<192;i++)
{
if(ptab[m][n][i])
{
win[0][i]++;
ctab[m][n][i]=false;
win[1][i]=7;
if(win[0][i]>4 && win[0][i]<7)
{
winner=0;
over=true;
mypaint(hdc);
}
}
}
}
turn=false;
}
}
}
}
mypaint(hdc);
break;
case WM_CLOSE:
if(IDYES==MessageBox(hwnd,"是否真的退出","五子棋",MB_YESNO))
{
DestroyWindow(hwnd);
}
break;
case WM_DESTROY:
DeleteDC(mdc);
DeleteDC(bufdc);
DeleteObject(chess[0]);
DeleteObject(chess[1]);
ReleaseDC(hwnd,hdc);
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,message,wParam,lParam);
}
return 0;
}
void InitGame()
{
int i,j,k;
int count=0;
over=false;
num[0]=num[1]=0;
//设定玩家与计算机在各个获胜组合中的棋子数
for(i=0;i<192;i++)
{
win[0][i]=0;
win[1][i]=0;
}
//初始化棋盘
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
board[i][j]=2;
}
}
//水平获胜组合
for(i=0;i<10;i++)
{
for(j=0;j<6;j++)
{
for(k=0;k<5;k++)
{
ptab[i][j+k][count]=true;
ctab[i][j+k][count]=true;
}
count++;
}
}
//垂直
for(i=0;i<10;i++)
{
for(j=0;j<6;j++)
{
for(k=9;k<5;k++)
{
ptab[i][j+k][count]=true;
ctab[i][j+k][count]=true;
}
count++;
}
}
//正对角
for(i=0;i<6;i++)
{
for(j=0;j<6;j++)
{
for(k=0;k<5;k++)
{
ptab[j+k][i+k][count]=true;
ctab[j+k][i+k][count]=true;
}
count++;
}
}
//反对角
for(i=0;i<6;i++)
{
for(j=9;j>=4;j--)
{
for(k=0;k<5;k++)
{
ptab[j-k][i+k][count]=true;
ctab[j-k][i+k][count]=true;
}
count++;
}
}
srand(GetTickCount());
if(rand()%2==0)
turn=true;
else
turn=false;
}
void ComTurn()
{
int grades[2][10][10];
int m,n,i,max=0;
int u,v;
for(m=0;m<10;m++)
{
for(n=0;n<10;n++)
{
grades[0][m][n]=0;
grades[1][m][n]=0;
if(board[m][n]==2)
{
for(i=0;i<192;i++)
{
if(ptab[m][n][i]&&win[0][1]!=7)
{
switch(win[0][i])
{
case 0:
grades[0][m][n]+=1;
break;
case 1:
grades[0][m][n]+=200;
break;
case 2:
grades[0][m][n]+=400;
break;
case 3:
grades[0][m][n]+=2000;
break;
case 4:
grades[0][m][n]+=10000;
break;
}
}
if(ctab[m][n][i]&&win[1][i]!=7)
{
switch(win[1][i])
{
case 0:
grades[1][m][n]+=1;
break;
case 1:
grades[1][m][n]+=220;
break;
case 2:
grades[1][m][n]+=420;
break;
case 3:
grades[1][m][n]+=2100;
break;
case 4:
grades[1][m][n]+=20000;
break;
}
}
}
if(max==0)
{
u=m;
v=n;
}
if(grades[0][m][n]>max)
{
max=grades[0][m][n];
u=m;
v=n;
}
else if(grades[0][m][n]==max)
{
if(grades[1][m][n]>grades[1][u][v])
{
u=m;
v=n;
}
}
if(grades[1][m][n]>max)
{
max=grades[1][m][n];
u=m;
v=n;
}
else if(grades[1][m][n]==max)
{
if(grades[0][m][n]>grades[0][u][v])
{
u=m;
v=n;
}
}
}
}
}
board[u][v]=1;
num[1]++;
if(num[0]==50 && num[1]==50)
{
winner=2;
over=true;
}
else
{
for(i=0;i<192;i++)
{
if(ctab[u][v][i])
{
win[1][i]++;
ptab[u][v][i]=false;
win[0][i]=7;
if(win[1][i]>=5 && win[1][i]<7)
{
winner=1;
over=true;
}
}
}
}
turn=true;
}
void mypaint(HDC hdc)
{
int m,n;
char *str;
if(over)
{
switch(winner)
{
case 0:
str="你赢了";
break;
case 1:
str="电脑赢了";
break;
case 2:
str="不分胜负";
break;
}
MessageBox(hwnd,str,"提示",0);
}
if(!turn)
{
str="计算机思考中........ ";
TextOut(hdc,10,470,str,strlen(str));
ComTurn();
}
else
{
str="该你下了............. ";
TextOut(hdc,10,470,str,strlen(str));
}
for(m=0;m<10;m++)
{
for(n=0;n<10;n++)
{
if(board[m][n]==0)
{
SelectObject(bufdc,chess[0]);
BitBlt(mdc,m*45+3,n*45+3,38,38,bufdc,0,0,SRCCOPY);
}
else if(board[m][n]==1)
{
SelectObject(bufdc,chess[1]);
BitBlt(mdc,m*45+3,n*45+3,38,38,bufdc,0,0,SRCCOPY);
}
else
{
SelectObject(bufdc,chess[1]);
BitBlt(mdc,m*45+3,n*45+3,38,38,bufdc,0,0,WHITENESS);
}
}
}
BitBlt(hdc,10,10,450,450,
wuziqi.rar_五子棋
版权申诉
116 浏览量
2022-09-24
02:27:00
上传
评论
收藏 224KB RAR 举报
刘良运
- 粉丝: 68
- 资源: 1万+
最新资源
- 基于matlab实现本份代码能对图像进行gabor滤波处理,结合指纹方向图以及指纹沟壑频率特性,对指纹图像进行增强.rar
- 基于matlab实现RBM神经网络实现了手写数字体识别的GUI程序.rar
- 基于matlab实现蝙蝠算法优化相关向量机建模对数据进行建模和预测.rar
- 基于matlab实现编写的禁忌搜索算法,解决了TSP问题,对初学者有重要的参考价值.rar
- 基于matlab实现SOH关于IMU进行姿态求解的C代码,里面包含了两套代码,分别是重力约束法求解和梯度下降法求解.rar
- 1_简单电子邮件客户端.zip
- 基于matlab实现powell优化搜索算法,适合于多参数优化且目标函数中不包含参数的情况.rar
- 基于matlab实现PID神经网络前向和反向学习算法的matlab的原程序代码.rar
- 基于matlab实现nsga-2的多目标优化算法,有注解.rar
- AIR-AP1815-K9-ME-8-5-182-0.zipFor 1815 1830 1840 1850 2700 3700
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈