亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? gamebo~1.cpp

?? 經典的一款俄羅斯方塊-源程序.java.~
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
/////////////////////////////////////////////////////////////////////////////
// This file is part of the completely free tetris clone "CGTetris".
//
// This is free software.
// You may redistribute it by any means providing it is not sold for profit
// without the authors written consent.
//
// No warrantee of any kind, expressed or implied, is included with this
// software; use at your own risk, responsibility for damages (if any) to
// anyone resulting from the use of this software rests entirely with the
// user.
/////////////////////////////////////////////////////////////////////////////


// GameBoard.cpp : implementation file
//

#include "stdafx.h"
#include "Tetris.h"
#include "GameBoard.h"
#include "Piece.h"
#include "MemDC.h"
#include "VolumeCtrl.h"

#include <stdlib.h>
#include <time.h>

using namespace std;

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


static CGameBoard * gpGameBoard;

CGameBoard * TetrisGetGameBoard() { return gpGameBoard; }


static	UINT	guBoomArray[] = {
					IDI_Boom_1,
					IDI_Boom_2,
					IDI_Boom_3,
					IDI_Boom_4,
					IDI_Boom_5,
					IDI_Boom_6,
					IDI_Boom_7,
					IDI_Boom_8,
					IDI_Boom_9,
					IDI_Boom_10,
				};

#define ENDVEC( vector )	(vector-1+sizeof(vector)/sizeof(vector[0]))

/////////////////////////////////////////////////////////////////////////////
// CGameBoard

BOOL		CGameBoard :: m_bRegistered = Register();

IMPLEMENT_DYNAMIC(CGameBoard, CWnd);

CGameBoard::CGameBoard()
{
	m_pCurPiece = m_pNextPiece = 0;
	m_usLevel = 0;
	m_clrCurPiece = RGB(0,0,0);
	m_bShowGrid = TRUE;
	m_nSquareWidth = 14;
	m_nSquareHeight = 14;
	m_clrBackground = RGB(255, 255, 255);
	m_bExFigures = FALSE;
	m_pMusic = 0;
	m_uTimer = 0;
	m_dwVolume = 100;	// 100% music volume by default

	gpGameBoard = this;
}

CGameBoard::~CGameBoard()
{
	if(m_pCurPiece)
		delete m_pCurPiece;
	if(m_pNextPiece)
		delete m_pNextPiece;

	if( m_pMusic )
		delete m_pMusic;

	gpGameBoard = 0;
}

BOOL CGameBoard :: Register()
{
	WNDCLASS wc;
	wc.style = CS_GLOBALCLASS | CS_HREDRAW | CS_VREDRAW;
	wc.lpfnWndProc = GameBoardWndProc;
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hInstance = 0;
	wc.hIcon = 0;
	wc.hCursor = 0;
	wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
	wc.lpszMenuName = 0;
	wc.lpszClassName = TEXT("TetrisGameBoard");
	VERIFY(RegisterClass(&wc));
	return TRUE;
}

BEGIN_MESSAGE_MAP(CGameBoard, CWnd)
	//{{AFX_MSG_MAP(CGameBoard)
	ON_WM_PAINT()
	ON_WM_TIMER()
	ON_WM_NCDESTROY()
	ON_WM_CREATE()
	ON_WM_ERASEBKGND()
	ON_WM_KEYDOWN()
	ON_WM_KEYUP()
	ON_WM_MOUSEMOVE()
	//}}AFX_MSG_MAP
	ON_MESSAGE(WM_MIDI_VOLUMECHANGED, OnVolumeChanged)
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CGameBoard message handlers

void CGameBoard::ShowGrid(BOOL bShow)
{
	m_bShowGrid = bShow;
}

void CGameBoard :: Paint()
{
	Invalidate();
	//UpdateWindow();
	OnPaint();	// force an immediately paint
}

void CGameBoard :: OnPaint()
{
	CPaintDC pdc(this); // device context for painting

	CMemDC dc(&pdc);

	COLORREF clrTopLeft = ::GetSysColor(COLOR_BTNHILIGHT);
	COLORREF clrBottomRight = ::GetSysColor(COLOR_BTNSHADOW);

	CRect rect;
	GetClientRect(rect);
	
	dc.FillSolidRect(0, 0, rect.Width(), rect.Height(), m_clrBackground);

	register const UINT uWidth = Width(rect);
	register const UINT uHeight = Height(rect);

	// paint the board itself
	for( register UINT i=0; i<uHeight; ++i )
		for( register UINT j=0; j<uWidth; ++j ) {
			if( m_Board[i][j] != m_clrBackground ) {
				dc.FillSolidRect(j*m_nSquareWidth, i*m_nSquareHeight, m_nSquareWidth, m_nSquareHeight, m_Board[i][j]);
				dc.Draw3dRect(j*m_nSquareWidth, i*m_nSquareHeight, m_nSquareWidth, m_nSquareHeight, clrTopLeft, clrBottomRight);
			}
		}

	// now paint the current piece ...
	if( m_pCurPiece != 0 ) {
		register const int nLines = m_pCurPiece->GetLines();
		register const int nCols  = m_pCurPiece->GetColumns();

		for( register int l = nLines-1 ; l >= 0 ; --l )
			for( register int c = 0 ; c < nCols ; ++c ) {
				int nL = m_nCurLine - ((nLines-1) & l);
				int nC = m_nCurCol + c;
				if( nL >= 0 && nL < Height() &&
					nC >= 0 && nC < Width() )
					if( m_pCurPiece->IsSquare(l, c) ) {
						dc.FillSolidRect(nC*m_nSquareWidth, nL*m_nSquareHeight, m_nSquareWidth, m_nSquareHeight, m_clrCurPiece);
						dc.Draw3dRect(nC*m_nSquareWidth, nL*m_nSquareHeight, m_nSquareWidth, m_nSquareHeight, clrTopLeft, clrBottomRight);
					}
			}
	}

	// draw the grid
	if( m_bShowGrid ) {
		// draw vertical lines
		for( register h = m_nSquareWidth; h < rect.Width(); h += m_nSquareWidth ) {
			dc.MoveTo(h, 0);
			dc.LineTo(h, rect.bottom);
		}

		// draw horizontal lines
		for( register v = m_nSquareHeight; v < rect.Height(); v += m_nSquareHeight ) {
			dc.MoveTo(0, v);
			dc.LineTo(rect.right, v);
		}
	}
}

void CGameBoard::SetDimension(int nWidth, int nHeight)
{
	m_nSquareWidth = nWidth;
	m_nSquareHeight = nHeight;
}

void CGameBoard::GetDimension(int & nWidth, int & nHeight)
{
	nWidth = m_nSquareWidth;
	nHeight = m_nSquareHeight;
}

int CGameBoard::Width(LPCRECT pRect) const
{
	CRect rect(pRect ? pRect : CRect(0,0,0,0));
	if( ! pRect )
		GetClientRect(rect);

	return rect.Width() / m_nSquareWidth;
}

int CGameBoard::Height(LPCRECT pRect) const
{
	CRect rect(pRect ? pRect : CRect(0,0,0,0));
	if( ! pRect )
		GetClientRect(rect);

	return rect.Height() / m_nSquareHeight;
}

void CGameBoard::InitBoard()
{
	CRect rect;
	GetClientRect(rect);
	register const int nHeight = Height(rect);
	register const int nWidth = Width(rect);
	m_Board.resize(nHeight, vector<COLORREF>());
	for( register int i=0; i<nHeight; ++i ) {
		m_Board[i].resize(nWidth, m_clrBackground);
		for( register int j=0; j<nWidth; ++j )
			m_Board[i][j] = m_clrBackground;
	}

	m_ulCompleteLines = 0;
	m_usLevel = 0;
	m_ulPieces = 0;
	m_uPoints = 0;

	if( m_uTimer )
		KillTimer(m_uTimer);
	m_uTimer = 0;

	if( m_pCurPiece )
		delete m_pCurPiece;
	m_pCurPiece = 0;
	if( m_pNextPiece )
		delete m_pNextPiece;
	m_pNextPiece = SelectPiece();

	NotifyParent();

	Paint();
}

void CGameBoard::MoveLeft() {
	ASSERT(m_pCurPiece);	// make sure we're inside a game

	if( CanPlace(m_nCurLine, m_nCurCol-1) ) {
		--m_nCurCol;
		m_SndKey.Play();
	}
}

void CGameBoard::MoveRight() {
	ASSERT(m_pCurPiece);	// make sure we're inside a game

	if( CanPlace(m_nCurLine, m_nCurCol+1) ) {
		++m_nCurCol;
		m_SndKey.Play();
	}
}

void CGameBoard::Rotate() {
	ASSERT(m_pCurPiece);	// make sure we're inside a game

	m_pCurPiece->Rotate();
	if( ! CanPlace(m_nCurLine, m_nCurCol) )
		m_pCurPiece->BackRotate();
	else
		m_SndKey.Play();
}

void CGameBoard::BackRotate() {
	ASSERT(m_pCurPiece);	// make sure we're inside a game

	m_pCurPiece->BackRotate();
	if( ! CanPlace(m_nCurLine, m_nCurCol) )
		m_pCurPiece->Rotate();
	else
		m_SndKey.Play();
}

void CGameBoard::StartFall() {
	if( m_uTimer ) {
		m_SndKey.Play();
		ResetTimer(TRUE);	// increase speed to maximum
	}
}

void CGameBoard::StopFall() {
	if( m_uTimer )
		ResetTimer();	// restore speed
}

void CGameBoard::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	if( m_pCurPiece ) {
		switch(nChar) {
			case VK_LEFT:
			case VK_NUMPAD4:
				MoveLeft();
				break;

			case VK_RIGHT:
			case VK_NUMPAD6:
				MoveRight();
				break;

			case VK_UP:
			case VK_NUMPAD8:
			case VK_NUMPAD5:
				Rotate();
				break;

			case VK_DOWN:
			case VK_NUMPAD2:
				BackRotate();
				break;

			case VK_SPACE:
			case VK_NUMPAD0:
				if( !(nFlags & (1<<14)) ) {
					// the key was not down before
					StartFall();
				}
				break;
			case VK_ADD:
			case VK_SUBTRACT:
			case TCHAR('+'):
			case TCHAR('-'):
				if( m_pMusic ) {
					CVolumeCtrl dlg(m_pMusic);
					dlg.DoModal();
					m_dwVolume = dlg.GetVolume();
				}
				break;
		}
	}
	Paint();
	CWnd::OnChar(nChar, nRepCnt, nFlags);
}


void CGameBoard::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	if(nChar == VK_SPACE || nChar == VK_NUMPAD0) {
		if( (nFlags & (1<<14)) ) {
			// the key was down before
			StopFall();
		}
	} else
		CWnd::OnKeyUp(nChar, nRepCnt, nFlags);
}


bool CGameBoard::CanPlace(int nLine, int nCol)
{
	ASSERT( m_pCurPiece != 0 );

	register const int nCols = m_pCurPiece->GetColumns();

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
高清成人在线观看| 狠狠狠色丁香婷婷综合久久五月| 中文字幕制服丝袜一区二区三区 | 欧美大片顶级少妇| 日韩欧美综合一区| 欧美一级免费大片| 日韩视频在线永久播放| 欧美xxx久久| 久久一留热品黄| 久久久国产精华| 亚洲国产精品国自产拍av| 欧美激情一区二区三区| 国产欧美精品一区aⅴ影院 | 亚洲视频1区2区| 亚洲黄色在线视频| 亚洲福利一二三区| 视频一区欧美日韩| 蜜臀av性久久久久av蜜臀妖精| 久久国内精品视频| 国产成人免费高清| 色综合一个色综合| 欧美日韩成人在线| 日韩欧美成人一区二区| 久久精品视频一区二区| 中文字幕一区二区三| 樱花影视一区二区| 蜜桃精品视频在线观看| 国产高清在线精品| 91碰在线视频| 在线播放视频一区| 久久久久久亚洲综合影院红桃| 国产精品视频在线看| 亚洲无人区一区| 美国三级日本三级久久99| 国产精品99久久久久久久女警| a美女胸又www黄视频久久| 在线观看一区二区视频| 91麻豆精品国产91久久久更新时间| 日韩精品一区二区三区四区| 国产精品人成在线观看免费| 亚洲一区二区不卡免费| 韩日欧美一区二区三区| 色先锋久久av资源部| 精品久久久久久久久久久久包黑料 | 丝袜亚洲精品中文字幕一区| 韩国一区二区三区| 色先锋aa成人| 久久综合九色综合久久久精品综合| 亚洲欧美一区二区视频| 另类人妖一区二区av| 99热在这里有精品免费| 日韩一区二区电影在线| 国产精品久久久久永久免费观看 | 精品视频在线看| 久久久久亚洲综合| 午夜欧美电影在线观看| 国产99精品国产| 4438x亚洲最大成人网| 国产精品国产自产拍高清av| 日韩国产精品大片| 91视频在线观看免费| 精品成人私密视频| 亚洲成人精品在线观看| 成人在线综合网站| 日韩美女视频在线| 亚洲成a人片在线观看中文| 成人性生交大片免费看中文网站| 91麻豆精品国产91久久久更新时间| 国产精品美女久久久久久久久| 久久国产尿小便嘘嘘尿| 欧美巨大另类极品videosbest| 国产精品毛片无遮挡高清| 九九**精品视频免费播放| 欧美精品第1页| 亚洲综合在线电影| 成人av资源下载| 久久嫩草精品久久久精品一| 亚洲电影中文字幕在线观看| 99久久婷婷国产综合精品电影 | 日韩va亚洲va欧美va久久| 91色porny蝌蚪| 国产女人水真多18毛片18精品视频| 日本v片在线高清不卡在线观看| 色94色欧美sute亚洲线路一ni | 欧美在线一区二区三区| 成人性视频免费网站| www.日本不卡| 久久久精品国产免大香伊| 亚洲第一搞黄网站| 精品欧美乱码久久久久久| 亚洲第一福利视频在线| 91视频在线观看免费| 国产精品免费av| 成人h精品动漫一区二区三区| 久久精品视频免费| 国产乱淫av一区二区三区 | 亚洲制服欧美中文字幕中文字幕| 成人免费福利片| 欧美极品另类videosde| 国产精品自产自拍| 精品久久久久久最新网址| 蜜桃久久久久久| 精品日韩99亚洲| 国产在线精品国自产拍免费| 国产精品狼人久久影院观看方式| 欧美挠脚心视频网站| 亚洲黄色尤物视频| 欧洲精品在线观看| 亚洲一区中文在线| 91久久一区二区| 午夜一区二区三区在线观看| 欧美日韩亚洲高清一区二区| 亚洲不卡一区二区三区| 欧美肥妇free| 蜜臀av一区二区在线观看| 精品少妇一区二区三区在线视频| 久久精工是国产品牌吗| 久久久久久免费毛片精品| 国产 日韩 欧美大片| 亚洲视频一区二区在线| 91网站最新地址| 亚洲电影在线播放| 日韩一区二区三区高清免费看看| 国产一区二区三区免费| 国产精品久久久久久亚洲伦| 日本精品一区二区三区高清 | 亚洲国产精品久久艾草纯爱 | 国产精品免费视频一区| 91色视频在线| 亚洲第一成年网| 欧美成人女星排名| 国产91清纯白嫩初高中在线观看 | 国产精品久久久久久久久晋中| www.欧美日韩| 亚洲尤物视频在线| 精品福利一二区| 成人激情视频网站| 亚洲在线一区二区三区| 在线综合视频播放| 国产成人亚洲综合色影视| 亚洲精品一二三| 欧美变态tickle挠乳网站| 高清国产一区二区三区| 亚洲国产欧美在线| 久久久精品一品道一区| 97se狠狠狠综合亚洲狠狠| 亚洲高清三级视频| 久久综合网色—综合色88| 91黄视频在线观看| 麻豆精品视频在线观看| 亚洲人xxxx| 久久亚洲影视婷婷| 色综合视频在线观看| 久久国产乱子精品免费女| 亚洲天堂2016| www国产精品av| 在线免费亚洲电影| 国产美女一区二区| 夜夜揉揉日日人人青青一国产精品| 日韩一级大片在线| 97精品久久久午夜一区二区三区| 日本三级亚洲精品| 伊人婷婷欧美激情| 亚洲国产成人一区二区三区| 欧美美女激情18p| 99在线精品免费| 激情成人综合网| 午夜视频在线观看一区| **欧美大码日韩| 久久亚洲捆绑美女| 91精品国产欧美日韩| 91社区在线播放| 成人少妇影院yyyy| 国内精品久久久久影院色 | 在线观看日产精品| 国产99久久久国产精品潘金网站| 免费成人在线视频观看| 一区二区三区四区不卡在线| 中文字幕免费不卡| 久久看人人爽人人| 精品噜噜噜噜久久久久久久久试看 | 91视视频在线直接观看在线看网页在线看| 日韩电影网1区2区| 性久久久久久久久久久久| 自拍偷拍国产亚洲| 中文字幕免费不卡| 国产欧美一区在线| 欧美精品一区二区三区四区| 7777精品伊人久久久大香线蕉超级流畅 | 国产亚洲女人久久久久毛片| 日韩欧美一级精品久久| 欧美日韩国产综合视频在线观看| 色综合久久久久综合体| 91在线小视频| 成人久久18免费网站麻豆| 国产v日产∨综合v精品视频| 久久草av在线| 麻豆极品一区二区三区| 精品一区二区三区不卡| 美女国产一区二区|