c语言五子棋代码

c语言五子棋代码
c语言五子棋代码

#include

#define MAX 20//绘制20X20的棋盘

#define TextWidth 200//棋盘右边的宽度

#define ERROR 0

#define NO 0

#define OK 1

#define DEFAULT 0

#define ICO_CUR 0x1000 //预定义光标的id

int leng=1;

HDC hdc,hdc1,hdc2;

int xw,yw;

int iGame[MAX][MAX];

POINT point;//鼠标点击位置

enum {Default,Player1,Player2}play;

enum {Stop,Play,Paush}plays;

void Init(HWND hwnd);

void paint(int play,int x,int y);

void chagePlayer();

int Look(int x,int y,int play);

void over(HWND hwnd,int play);

LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM); char szClassName[] = "超简单的五子棋";

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)//主函数

{

HWND hwnd;

MSG messages;

WNDCLASSEX wincl;

wincl.hInstance = hThisInstance;

wincl.lpszClassName = szClassName;

wincl.lpfnWndProc = WindowProcedure;

wincl.style = CS_DBLCLKS;

wincl.cbSize = sizeof (WNDCLASSEX);

wincl.hIcon = LoadIcon(hThisInstance,MAKEINTRESOURCE(ICO_CUR));

wincl.hIconSm = LoadIcon (NULL, IDI_APPLICA TION);

wincl.hCursor = LoadCursor (NULL, IDC_ARROW);

wincl.lpszMenuName = NULL;

wincl.cbClsExtra = 0;

wincl.cbWndExtra = 0;

wincl.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);

if (!RegisterClassEx (&wincl))

return 0;

hwnd = CreateWindowEx (1,

szClassName,

szClassName,

WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT,

CW_USEDEFAULT,

800,

600,

HWND_DESKTOP,

NULL,

hThisInstance,

NULL

);

ShowWindow (hwnd, nFunsterStil);//该函数设置指定窗口的显示状态

while (GetMessage (&messages, NULL, 0, 0))

{

TranslateMessage(&messages);

DispatchMessage(&messages);

}

return messages.wParam;

}

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) //处理窗口事件

{

PAINTSTRUCT ps;

static HPEN hpen,hpen1,hpen2; //设备

static HBRUSH hbrush,hbrush1,hbrush2; //画刷的句柄

int x,y;

switch (message) //消息

{

case WM_KEYDOWN:

switch (wParam)

{

case VK_F2: //F2重新开始游戏

Init(hwnd); //初始绘制游戏界面

Rectangle(hdc,0,0,xw,yw);

for(x=0;x

for(y=0;y

{

Rectangle(hdc,x*xw/MAX,y*yw/MAX,(x+1)*xw/MAX,(y+1)*yw/MAX) ; iGame[x][y]=Default;

}

leng=1;

plays=Play;

break;

case VK_F1:

leng=1;

plays=Play;

break;

}

break;

case WM_CREA TE: //初始化窗体时调用

plays=Stop;

play=Player1;

break;

case WM_SIZE:

xw=LOWORD(lParam); //获取窗体的宽度

yw=HIWORD(lParam); //获取窗体的高度

//TCHAR xx[20];

//wsprintf(xx,"%d",xw);

//MessageBox(hwnd,xx,xx,MB_OK);

xw-=TextWidth; //xw保存棋盘的宽度

InvalidateRect(hwnd,NULL,TRUE);//向窗体绘制一个矩形,支持重新绘制break;

case WM_LBUTTONDOWN: //响应用户鼠标左键

//获取但前鼠标坐标

point.x=LOWORD(lParam);

point.y=HIWORD(lParam);

//初始化设备DC

Init(hwnd);

//鼠标坐标换为数组坐标

x=(point.x)/(xw/MAX); //定位到小狂格中去

y=(point.y)/(yw/MAX);

if(plays==Stop)

break;

if(x

{

if(iGame[x][y]==Default&&plays==Play)//判断但前位置是否有棋子覆盖是否是下棋模式{

leng=1;

paint(play,x,y);

if(Look(x,y,play))

over(hwnd,play);

chagePlayer();

}

}

break;

case WM_PAINT://开始绘制

{

hdc=BeginPaint(hwnd,&ps);

Init(hwnd);

Rectangle(hdc,0,0,xw,yw);

for(x=0;x

for(y=0;y

{

Rectangle(hdc,x*xw/MAX,y*yw/MAX,(x+1)*xw/MAX,(y+1)*yw/MAX) ;

paint(iGame[x][y],x,y);

}

EndPaint(hwnd,&ps);

}

break;

case WM_DESTROY: //当用户关闭游戏

PostQuitMessage (0); // 发送一个消息给message queue

break;

default: //什么都不做

return DefWindowProc (hwnd, message, wParam, lParam);

}

return 0;

}

void Init(HWND hwnd) //初始化方法

{

hdc1=GetDC(hwnd);

hdc2=GetDC(hwnd);

//初始背景(游戏的界面)

SelectObject(hdc,CreatePen(0,1,RGB(0,0,0))); //小矩形框的边框的颜色

SelectObject(hdc,CreateSolidBrush(RGB(255,218,185))); //填充的颜色

//初始玩家一图形

SelectObject(hdc1,CreatePen(0,1,RGB(255,255,255))); //玩家一的棋子颜色

SelectObject(hdc1,CreateSolidBrush(RGB(255,255,255))); //填充白色

//初始玩家二图形

SelectObject(hdc2,CreatePen(0,1,RGB(255,255,255))); //玩家二的棋子颜色

SelectObject(hdc2,CreateSolidBrush(RGB(0,0,0))); //填充黑色

//该背景分为两层背景,一层为游戏界面(hdc),一层为玩家的棋子(hdc1,hdc2)

//SetBkMode(hdc,0);该方法好像没什么用

//绘制右边操作提示区域

Rectangle(hdc,xw,29,xw+200,30);//从xw开始绘制到xw+200结束(绘制长200宽为30-29的矩形)的线条

TextOut(hdc,xw+45,13,"超简单的五子棋",14); //从坐标(xw+45)(13)开始绘制“超简单的五子棋”宽为14

TextOut(hdc,xw+45,40,"F1 - 开始游戏",13);

TextOut(hdc,xw+45,60,"F2 -重新开始游戏",16);

Rectangle(hdc,xw,80,xw+200,81);

TextOut(hdc,xw+45,150,"白棋为第二玩家",14);

TextOut(hdc,xw+45,250,"黑棋为第二玩家",14);

Rectangle(hdc,xw,330,xw+200,331);

}

void paint(int play,int x,int y) //画棋子

{

switch (play)

{

case Player1:

if(iGame[x][y]!=Default){

//该地方已经有棋子了

}else{

Ellipse(hdc1,x*xw/MAX,y*yw/MAX,(x+1)*xw/MAX,(y+1)*yw/MAX) ;//Ellipse(圆心x坐标,圆心y坐标,起始角度,终止角度,x轴半径,y轴半径)

}//绘制玩家player1的棋子

iGame[x][y]=Player1; //将该地方标准已经有棋子

break;

case Player2:

if(iGame[x][y]!=Default){}else{

Ellipse(hdc2,x*xw/MAX,y*yw/MAX,(x+1)*xw/MAX,(y+1)*yw/MAX) ;

}//绘制玩家player2的棋子

iGame[x][y]=Player2; //将该地方标准已经有棋子

break;

}

}

void chagePlayer() //改变玩家

{

if(play==Player1) play=Player2;

else

play=Player1;

}

int Look(int x,int y,int play) // 检查模块

{

int i,tempx,tempy;

tempx=x;tempy=y;

for(i=0;i<5&&iGame[tempx][tempy]==play;tempy--,i++); if(i>=5) return OK; //向上核对(y轴)

tempx=x;tempy=y;

for(i=0;i<5&&iGame[tempx][tempy]==play;tempy++,i++); if(i>=5) return OK; //向下核对(y轴)

tempx=x;tempy=y;

for(i=0;i<5&&iGame[tempx][tempy]==play;tempx--,i++); if(i>=5) return OK; //向左核对(x轴)

tempx=x;tempy=y;

for(i=0;i<5&&iGame[tempx][tempy]==play;tempx++,i++); if(i>=5) return OK; //向右核对(y轴)

tempx=x;tempy=y;

for(i=0;i<5&&iGame[tempx][tempy]==play;tempx--,tempy--,i++); if(i>=5) return OK; //向左上核对(x,y轴的对角线向上\)

tempx=x;tempy=y;

for(i=0;i<5&&iGame[tempx][tempy]==play;tempx++,tempy--,i++); if(i>=5) return OK; //向右上核对(x,y轴的对角线向下\)

tempx=x;tempy=y;

for(i=0;i<5&&iGame[tempx][tempy]==play;tempx--,tempy++,i++); if(i>=5) return OK; //向左下核对(x,y轴的对角线向上/)

tempx=x;tempy=y;

for(i=0;i<5&&iGame[tempx][tempy]==play;tempx++,tempy++,i++); if(i>=5) return OK; //向右下核对(x,y轴的对角线向上/)

return NO;

}

void over(HWND hwnd,int play) //判断胜负

{

switch(play)

{

case Player1:

MessageBox(hwnd,"恭喜白棋玩家获得胜利","胜利",0); SendMessage(hwnd,WM_KEYDOWN,VK_F2,NULL); //重新开始游戏plays=Stop;

break;

case Player2:

MessageBox(hwnd,"恭喜黑棋玩家获得胜利","胜利",0); SendMessage(hwnd,WM_KEYDOWN,VK_F2,NULL);

plays=Stop;

break;

}

}

最终效果图:

相关主题
相关文档
最新文档