我的CPP文件中倒数第五行的 dc.Rectangle(&rect); //绘制矩形 在窗口上反应不出来啊//
//头文件 TicTac.h
//
#define ID_MOVE 1
#define ID_FOOD 2class SnakePoint{ //蛇的数据结构
public:
int x[100]; //存储蛇节点坐标的数组
int y[100]; //x[0],y[0]存储随机出现的食物点
int node; //蛇节点数
int direction; //蛇走动方向,1为右,2为下,3为左,4为上
};class CMyApp : public CWinApp
{
public:
virtual BOOL InitInstance ();
};class CMainWindow : public CWnd
{
protected:
CRect m_rcSquares[20][20]; // 这个客户区由20*20个rect构成
SnakePoint snake; //蛇
bool needfood;
bool alive;
CRect rect;public:
CMainWindow ();protected:
virtual void PostNcDestroy (); afx_msg void OnKeyDown( UINT nChar, UINT nRepCnt, UINT nFlags );
afx_msg void OnTimer(UINT nTimerID);
afx_msg void OnPaint();
// afx_msg void OnCreate(LPCREATESTRUCT lpcs);
DECLARE_MESSAGE_MAP ()
};
//头文件 TicTac.h
//
#define ID_MOVE 1
#define ID_FOOD 2class SnakePoint{ //蛇的数据结构
public:
int x[100]; //存储蛇节点坐标的数组
int y[100]; //x[0],y[0]存储随机出现的食物点
int node; //蛇节点数
int direction; //蛇走动方向,1为右,2为下,3为左,4为上
};class CMyApp : public CWinApp
{
public:
virtual BOOL InitInstance ();
};class CMainWindow : public CWnd
{
protected:
CRect m_rcSquares[20][20]; // 这个客户区由20*20个rect构成
SnakePoint snake; //蛇
bool needfood;
bool alive;
CRect rect;public:
CMainWindow ();protected:
virtual void PostNcDestroy (); afx_msg void OnKeyDown( UINT nChar, UINT nRepCnt, UINT nFlags );
afx_msg void OnTimer(UINT nTimerID);
afx_msg void OnPaint();
// afx_msg void OnCreate(LPCREATESTRUCT lpcs);
DECLARE_MESSAGE_MAP ()
};
//TicTac.cpp
//#include <afxwin.h>
#include "TicTac.h"
#include <stdlib.h>CMyApp myApp;/////////////////////////////////////////////////////////////////////////
// CMyApp member functionsBOOL CMyApp::InitInstance ()
{
m_pMainWnd = new CMainWindow;
m_pMainWnd->ShowWindow (m_nCmdShow);
m_pMainWnd->UpdateWindow ();
return TRUE;
}/////////////////////////////////////////////////////////////////////////
// CMainWindow message map and member functionsBEGIN_MESSAGE_MAP (CMainWindow, CWnd)
ON_WM_PAINT ()
ON_WM_KEYDOWN()
ON_WM_TIMER()
END_MESSAGE_MAP ()CMainWindow::CMainWindow ()
{ for(int i=0;i<20;i++)
for(int j=0;j<20;j++)
m_rcSquares[i][j]=CRect( j*10 , i*10 , (j+1)*10 , (i+1)*10 ) ;
snake.direction=3; //默认向左移动
snake.x[1]=2;
snake.y[1]=3;
snake.x[2]=3;
snake.y[2]=3;
snake.node=2; //刚开始事,蛇为两节,方向向左
//
// Register a WNDCLASS.
//
CString strWndClass = AfxRegisterWndClass (
CS_DBLCLKS, // Class style
AfxGetApp ()->LoadStandardCursor (IDC_ARROW), // Class cursor
(HBRUSH) (COLOR_3DFACE + 1), // Background brush
AfxGetApp ()->LoadStandardIcon (IDI_WINLOGO) // Class icon
); //
// Create a window.
//
CreateEx (0, strWndClass, _T ("贪吃蛇"),
WS_OVERLAPPED | WS_SYSMENU | WS_CAPTION | WS_MINIMIZEBOX,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL); //
// Size the window.
//
CRect rect (0, 0, 200, 200);
CalcWindowRect (&rect); SetWindowPos (NULL, 0, 0, rect.Width (), rect.Height (),
SWP_NOZORDER | SWP_NOMOVE | SWP_NOREDRAW);
SetTimer(ID_MOVE,100,NULL);
SetTimer(ID_FOOD,200,NULL);
}void CMainWindow::OnPaint()
{
}
void CMainWindow::PostNcDestroy ()
{
delete this;
}void CMainWindow::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
switch(nChar)
{
case VK_LEFT: snake.direction=3; break;
case VK_RIGHT: snake.direction=1; break;
case VK_UP : snake.direction=4; break;
case VK_DOWN : snake.direction=2; break;
}}void CMainWindow::OnTimer(UINT nTimerID)
{
switch(nTimerID)
{
case ID_FOOD:
//如果食物被吃掉,则随机产生一个食物点
if(needfood)
{
snake.x[0]=(int)rand()%20;
snake.y[0]=(int)rand()%20;
needfood=false;
}
break;
case ID_MOVE:
//移动蛇身
for(int i=snake.node;i>1;i--)
{
snake.x[i]=snake.x[i-1];
snake.y[i]=snake.y[i-1];
}
//移动蛇头
switch(snake.direction)
{
case 1:snake.x[1]+=1;break;
case 2:snake.y[1]+=1;break;
case 3:snake.x[1]-=1;break;
case 4:snake.y[1]-=1;break;
}
//判断蛇头是否撞到自己
for(int k=3;k<=snake.node;k++)
{
if(snake.x[k]==snake.x[0]&&snake.y[k]==snake.y[0])
{
alive=false;
break;
}
}
//判断蛇头是否出界
if(snake.x[1]<0||snake.x[1]>=20||snake.y[1]<0||snake.y[1]>=20)
{
alive=false;
}
//判断是否吃到食物
if(snake.x[1]==snake.x[0]&&snake.y[1]==snake.y[0])
{
snake.node++;
needfood=true;
for(int m=snake.node;m<=1; m++)
{
snake.x[m]=snake.x[m-1];
snake.y[m]=snake.y[m-1];
}
}
}
CClientDC dc (this);
CBrush brush(RGB(25,25,25));
CBrush *pOldBrush=dc.SelectObject (&brush);
int x1,y1;
for(int j=2;j<=snake.node;j++)
{
x1=snake.x[j]; //取出坐标
y1=snake.y[j]; //取出坐标
rect= m_rcSquares[ x1 ][ y1]; //根据坐标返回rect
dc.Rectangle(&rect); //绘制矩形
}
dc.SelectObject(pOldBrush);}