⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 canvasframe.cpp

📁 《Visual C++游戏设计入门》配套代码
💻 CPP
字号:
// canvasFrame.cpp : implementation file
//

#include "stdafx.h"
#include "canvasr.h"
#include "canvasFrame.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// canvasFrame

int board[10][10];
BOOL ptable[10][10][192],ctable[10][10][192];
int cgrades[10][10],pgrades[10][10],cgrade,pgrade;
int win[2][192];
int pcount,ccount;
BOOL player,computer,start = true,over,pwin,cwin,tie;
int i,j,k,m,n,count;
int mat,nat,mde,nde;
char str[10];

IMPLEMENT_DYNCREATE(canvasFrame, CFrameWnd)

canvasFrame::canvasFrame()
{
	RECT rect;
	Create(NULL,"绘图窗口",WS_OVERLAPPEDWINDOW,CRect(0,0,415,470));
	CClientDC dc(this);
	int width = dc.GetDeviceCaps(HORZRES);
	int height = dc.GetDeviceCaps(VERTRES);
	GetWindowRect( &rect );
	width = ( width - ( rect.right - rect.left ))/2 ;
	height = (height - (rect.bottom - rect.top ))/2 ;
	MoveWindow( width , height , (rect.right - rect.left ) , (rect.bottom - rect.top ) ,true);
	mdc = new CDC;
	mdc1 = new CDC;
	mdc->CreateCompatibleDC(&dc);
	mdc1->CreateCompatibleDC(&dc);
	purple = new CBitmap;
	green = new CBitmap;
	bgbmp = new CBitmap;
	temp = new CBitmap;
	temp->CreateCompatibleBitmap(&dc,rect.right,rect.bottom);
	purple->m_hObject = (HBITMAP)::LoadImage(NULL,"purple.bmp",IMAGE_BITMAP,36,36,LR_LOADFROMFILE); //载入砖块图
	green->m_hObject = (HBITMAP)::LoadImage(NULL,"green.bmp",IMAGE_BITMAP,36,36,LR_LOADFROMFILE); //载入小球图
	bgbmp->m_hObject = (HBITMAP)::LoadImage(NULL,"bgbmp.bmp",IMAGE_BITMAP,400,400,LR_LOADFROMFILE); //载
	mdc->SelectObject(temp);
	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++)
			{
				ptable[j+k][i][count] = true;
				ctable[j+k][i][count] = true;
			}
			count++;
		}
	for(i=0;i<10;i++)          //设定垂直方向的获胜位置
		for(j=0;j<6;j++)
		{
			for(k=0;k<5;k++)
			{
				ptable[i][j+k][count] = true;
				ctable[i][j+k][count] = true;
			}
			count++;
		}
	for(i=0;i<6;i++)           //设定正对角线方向的获胜位置
		for(j=0;j<6;j++)
		{
			for(k=0;k<5;k++)
			{
				ptable[j+k][i+k][count] = true;
				ctable[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++)
			{
				ptable[j-k][i+k][count] = true;
				ctable[j-k][i+k][count] = true;
			}
			count++;
		}
	if(rand()%2==0)
		computer = true;
	else 
		player = true;
	count = 0;
}

canvasFrame::~canvasFrame()
{
	delete purple;
	delete green;
	delete bgbmp;
	delete temp;
	delete mdc;
	delete mdc1;
}

BEGIN_MESSAGE_MAP(canvasFrame, CFrameWnd)
	//{{AFX_MSG_MAP(canvasFrame)
	ON_WM_LBUTTONDOWN()
	ON_WM_CREATE()
	ON_WM_TIMER()
	ON_WM_KEYDOWN()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// canvasFrame message handlers

void canvasFrame::OnLButtonDown(UINT nFlags, CPoint point) 
{
	if(!over)
		if(player)
		{
			if(point.x<400 && point.y<400)
			{
				m = (int)floor(point.x/40);
				n = (int)floor(point.y/40);
				if(board[m][n] == 2)      //该格为空格子
				{
					board[m][n] = 0;	  //设定为玩家的棋子
					pcount++;
					if((ccount == 50) && (pcount == 50))
					{
						tie = true;
						over = true;
					}
					for(i=0;i<192;i++)
					{
						if(ptable[m][n][i] && win[0][i] != 7)
							win[0][i]++;
						if(ctable[m][n][i])
						{
							ctable[m][n][i] = false;
							win[1][i]=7;
						}
					}
					player = false;       //换计算机下
					computer = true;
				}
			}
		}
	CFrameWnd::OnLButtonDown(nFlags, point);
}

int canvasFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
	SetTimer(1,500,NULL);	
	return 0;
}

void canvasFrame::OnTimer(UINT nIDEvent) 
{
	CClientDC dc(this);
	if(!over)
	{
		if(computer)
			ComTurn();                 //计算机下子
		for(i=0;i<=1;i++)
			for(j=0;j<192;j++)
			{
				if(win[i][j] == 5)
					if(i==0)           //玩家获胜
					{
						pwin = true;
						over = true;
						break;
					}
					else               //计算机获胜
					{
						cwin = true;
						over = true;
						break;
					}
				if(over)
					break;
			}
		dc.TextOut(85,400,"     该您下了..      ");
	}
	mdc1->SelectObject(bgbmp);
	mdc->BitBlt(0,0,400,400,mdc1,0,0,SRCCOPY);
	for(i=0;i<=9;i++)
		for(j=0;j<=9;j++)
		{
			if(board[i][j] == 0)      //贴上玩家棋子
			{
				mdc1->SelectObject(green);
				mdc->BitBlt(i*40+2,j*40+2,36,36,mdc1,0,0,SRCCOPY);
			}
			if(board[i][j] == 1)      //贴上计算机棋子
			{
				mdc1->SelectObject(purple);
				mdc->BitBlt(i*40+2,j*40+2,36,36,mdc1,0,0,SRCCOPY);
			}
		}
	dc.BitBlt(0,0,400,400,mdc,0,0,SRCCOPY);
	if(pwin)
		dc.TextOut(85,400,"您赢了!按下 F1 可重新进行游戏..");
	if(cwin)
		dc.TextOut(85,400,"计算机赢了!按下 F1 可重新进行游戏..");
	if(tie)
		dc.TextOut(85,400,"不分胜负!按下 F1 可重新进行游戏..");
	CFrameWnd::OnTimer(nIDEvent);
}

void canvasFrame::ComTurn()
{
	for(i=0;i<=9;i++)        //计算玩家在空格子上的获胜分数
		for(j=0;j<=9;j++)
		{
			pgrades[i][j]=0;
			if(board[i][j] == 2)
				for(k=0;k<192;k++)
					if(ptable[i][j][k])
					{
						switch(win[0][k])
						{
						case 1:
							pgrades[i][j]+=5;
							break;
						case 2:
							pgrades[i][j]+=50;
							break;
						case 3:
							pgrades[i][j]+=100;
							break;
						case 4:
							pgrades[i][j]+=400;
							break;
						}
					}
		}
	for(i=0;i<=9;i++)        //计算计算机在空格子上的获胜分数
		for(j=0;j<=9;j++)
		{
			cgrades[i][j]=0;
			if(board[i][j] == 2)
				for(k=0;k<192;k++)
					if(ctable[i][j][k])
					{
						switch(win[1][k])
						{
						case 1:
							cgrades[i][j]+=5;
							break;
						case 2:
							cgrades[i][j]+=50;
							break;
						case 3:
							cgrades[i][j]+=100;
							break;
						case 4:
							cgrades[i][j]+=400;
							break;
						}
					}
		}
	if(start)              //游戏开始
	{
		if(board[4][4]==2)
		{
			m = 4;
			n = 4;
		}
		else
		{
			m = 5;
			n = 5;
		}
		start = false;
	}
	else
	{
		for(i=0;i<10;i++)
			for(j=0;j<10;j++)
				if(board[i][j] == 2)
				{
					if(cgrades[i][j]>=cgrade)
					{
						cgrade = cgrades[i][j];   
						mat = i;
						nat = j;
					}
					if(pgrades[i][j]>=pgrade)
					{
						pgrade = pgrades[i][j];   
						mde = i;
						nde = j;
					}
				}
		if(cgrade>=pgrade)     //攻击
		{
			m = mat;
			n = nat;
		}
		else                   //防守
		{
			m = mde;
			n = nde;
		}
	}
	cgrade = 0;		
	pgrade = 0;
	board[m][n] = 1;      //设定为计算机的棋子
	ccount++;
	if((ccount == 50) && (pcount == 50))
	{
		tie = true;
		over = true;
	}
	for(i=0;i<192;i++)
	{
		if(ctable[m][n][i] && win[1][i] != 7)
			win[1][i]++;
		if(ptable[m][n][i])
		{
			ptable[m][n][i] = false;
			win[0][i]=7;
		}
	}
	player = true;        //换玩家下
	computer = false;
}


void canvasFrame::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	if(nChar == VK_ESCAPE)
		PostMessage(WM_CLOSE);
	if(nChar == VK_F1)
	{
		for(i=0;i<10;i++)
			for(j=0;j<10;j++)
			{
				pgrades[i][j] = 0;
				cgrades[i][j] = 0;
				board[i][j] = 2;
			}
		for(i=0;i<10;i++)
			for(j=0;j<6;j++)
			{
				for(k=0;k<5;k++)
				{
					ptable[j+k][i][count] = true;
					ctable[j+k][i][count] = true;
				}
				count++;
			}
		for(i=0;i<10;i++)
			for(j=0;j<6;j++)
			{
				for(k=0;k<5;k++)
				{
					ptable[i][j+k][count] = true;
					ctable[i][j+k][count] = true;
				}
				count++;
			}
		for(i=0;i<6;i++)
			for(j=0;j<6;j++)
			{
				for(k=0;k<5;k++)
				{
					ptable[j+k][i+k][count] = true;
					ctable[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++)
				{
					ptable[j-k][i+k][count] = true;
					ctable[j-k][i+k][count] = true;
				}
				count++;
			}
		for(i=0;i<=1;i++)
			for(j=0;j<192;j++)
				win[i][j] = 0;
		if(rand()%2==0)
			computer = true;
		else 
			player = true;
		count = 0;
		ccount = 0;
		pcount = 0;
		start = true;
		over = false;
		pwin = false;
		cwin = false;
		tie = false;
	}
	CFrameWnd::OnKeyDown(nChar, nRepCnt, nFlags);
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -