提交 af32ecd3 编写于 作者: b2b160's avatar b2b160

add GameRussiaTetris

上级 ff7b3d7f
// GameRussiaTetris.cpp : 定义控制台应用程序的入口点。
//
#include "../import/include/SimpleCG.h"
#include "Tetris.h"
#ifdef _DEBUG
#pragma comment(lib,"../import/lib/SimpleCG_MDd.lib")
#else
#ifdef _WIN64
#pragma comment(lib,"../import/lib/x64/MTRelease/SimpleCG_MT64.lib")
#else
#pragma comment(lib,"../import/lib/SimpleCG_MT.lib")
#endif
#endif
#define C_TETRIS_VERSION 1001
#define C_IMAGE_WIDTH 640
#define C_IMAGE_HEIGHT 480
LRESULT OnKeyDown(HWND hWnd, WPARAM wParam, LPARAM lParam);
//绘制游戏
void RenderGame()
{
DrawMapBack();
DrawMap();
DrawMovinggBlock();
}
//更新游戏状态
void UpdateGame( UINT nElapse )
{
static int s_nLastTick = 0;
if( ( nElapse - s_nLastTick )<GetSpeed()*120 )
return;
s_nLastTick = nElapse;
if( !MovingDown() )
{
ClearBlock();
};
}
//按键消息响应函数
LRESULT OnKeyDown(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
switch( wParam )
{
case VK_SPACE:
while( MovingDown() );
ClearBlock();
break;
case VK_UP:
TurnRight();
break;
case VK_DOWN:
if( !MovingDown() )
{
ClearBlock();
};
break;
case VK_LEFT:
MoveLeft();
break;
case VK_RIGHT:
MoveRight();
break;
}
return 0;
}
LRESULT OnLButtonDown( HWND hWnd, WPARAM wParam, int nX, int nY )
{
MoveLeft();
return false;
}
LRESULT OnRButtonDown( HWND hWnd, WPARAM wParam, int nX, int nY )
{
MoveRight();
return false;
}
LRESULT OnWheel( HWND hWnd, WPARAM wParam, int nX, int nY )
{
TurnRight();
return false;
}
//初始化游戏
void InitGame(HWND hWnd)
{
int i=0;
int j=0;
srand(GetTickCount());
NewBlock();
//按键处理初始化
//SetKeyboardProcess( enumINMSG_KEYDOWN, OnKeyDown );
GetKeyboardInput()->onKeyDown = OnKeyDown;
GetMouseInput()->onMouseDownLeft = OnLButtonDown;
GetMouseInput()->onMouseDownRight = OnRButtonDown;
GetMouseInput()->onMouseWheel = OnWheel;
RenderBack();
}
int _tmain(int argc, _TCHAR* argv[])
{
SCG_GameLoopInfo info;
info.nFPS = 60;
info.nHeight = C_IMAGE_HEIGHT;
info.nWidth = C_IMAGE_WIDTH;
info.pFunDrawProcess = RenderGame;
info.pFunFrameUpdate = UpdateGame;
info.pFunInitGame = InitGame;
info.pFunInput = NULL;
if( !StartGameLoopEx( &info ))
return 1;
return 0;
}
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{5A3E1EDF-A63C-451B-9E51-D983E1916264}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>GameRussiaTetris</RootNamespace>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>
</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<None Include="ReadMe.txt" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="stdafx.h" />
<ClInclude Include="targetver.h" />
<ClInclude Include="Tetris.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="GameRussiaTetris.cpp" />
<ClCompile Include="stdafx.cpp" />
<ClCompile Include="Tetris.cpp" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="源文件">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="头文件">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
</Filter>
<Filter Include="资源文件">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<None Include="ReadMe.txt" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="stdafx.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="targetver.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="Tetris.h">
<Filter>头文件</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="stdafx.cpp">
<Filter>源文件</Filter>
</ClCompile>
<ClCompile Include="GameRussiaTetris.cpp">
<Filter>源文件</Filter>
</ClCompile>
<ClCompile Include="Tetris.cpp">
<Filter>源文件</Filter>
</ClCompile>
</ItemGroup>
</Project>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
</Project>
\ No newline at end of file
========================================================================
控制台应用程序:GameRussiaTetris 项目概述
========================================================================
应用程序向导已为您创建了此 GameRussiaTetris 应用程序。
本文件概要介绍组成 GameRussiaTetris 应用程序的每个文件的内容。
GameRussiaTetris.vcxproj
这是使用应用程序向导生成的 VC++ 项目的主项目文件,
其中包含生成该文件的 Visual C++
的版本信息,以及有关使用应用程序向导选择的平台、配置和项目功能的信息。
GameRussiaTetris.vcxproj.filters
这是使用“应用程序向导”生成的 VC++ 项目筛选器文件。
它包含有关项目文件与筛选器之间的关联信息。 在 IDE
中,通过这种关联,在特定节点下以分组形式显示具有相似扩展名的文件。
例如,“.cpp”文件与“源文件”筛选器关联。
GameRussiaTetris.cpp
这是主应用程序源文件。
/////////////////////////////////////////////////////////////////////////////
其他标准文件:
StdAfx.h,StdAfx.cpp
这些文件用于生成名为 GameRussiaTetris.pch 的预编译头 (PCH) 文件和
名为 StdAfx.obj 的预编译类型文件。
/////////////////////////////////////////////////////////////////////////////
其他注释:
应用程序向导使用“TODO:”注释来指示应添加或自定义的源代码部分。
/////////////////////////////////////////////////////////////////////////////
/*===========================================================*\
|简介: 俄罗斯方块
|功能: 俄罗斯方块
|作者: Bill
|主页: http://simplecg.qqpet.com
|博客: https://blog.csdn.net/b2b160
|贴吧: https://tieba.baidu.com/f?kw=simplecg
|日期: 2023-09-11
\*===========================================================*/
#include "Tetris.h"
enum ENUM_MAPTYPE
{
enumMAPTYPE_NULL
, enumMAPTYPE_FIXBLOCK
, enumMAPTYPE_DEADBLOCK
};
int g_nMap[ C_MAP_WIDTH * C_MAP_HEIGHT] = {0};
int g_nXMapPos = 100;
int g_nYMapPos = 50;
tagTeris g_TetrsTemplate[] = {
{
1, 1, 1, 1,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0
},
{
1, 1, 1, 0,
1, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0
},
{
1, 1, 1, 0,
0, 1, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0
},
{
1, 1, 1, 0,
0, 0, 1, 0,
0, 0, 0, 0,
0, 0, 0, 0
},
{
0, 0, 0, 0,
0, 1, 1, 0,
0, 1, 1, 0,
0, 0, 0, 0
},
{
0, 0, 0, 0,
1, 1, 0, 0,
0, 1, 1, 0,
0, 0, 0, 0
},
{
0, 0, 0, 0,
0, 1, 1, 0,
1, 1, 0, 0,
0, 0, 0, 0
}
};
tagTeris g_TetrsRunning = {0};
int g_nMovingX = 0;
int g_nMovingY = 0;
tagTeris g_Next=g_TetrsTemplate[1];
int g_nColorBlockNext = RGB(rand()%255,rand()%255,rand()%255);
int g_nColorBlock = g_nColorBlockNext;
int g_nSpeed = 9;
int g_nScore = 0;
int GetSpeed()
{
return g_nSpeed;
}
//创建新的方块
void NewBlock()
{
g_TetrsRunning = g_Next;
int nCount = sizeof(g_TetrsTemplate)/sizeof(g_TetrsTemplate[0]);
g_Next = g_TetrsTemplate[rand()%nCount];
g_nColorBlock = g_nColorBlockNext;
g_nMovingY = 0;
g_nMovingX = 4;
g_nColorBlockNext = RGB(rand()%255,rand()%255,rand()%255);
g_nScore += 10;
}
//绘制单个方块,绝对坐标
void DrawBlockPos( int nX, int nY, COLORREF nColor )
{
setlinewidth(3);
setfillcolor(nColor);
setlinecolor(SCGSubColor(nColor,100));
fillrectangle( nX, nY, nX + C_IMAGE_BLOCK-3, nY + C_IMAGE_BLOCK-3);
setlinecolor(SCGAddColor(nColor,100));
line(nX, nY, nX + C_IMAGE_BLOCK-5,nY);
line(nX, nY, nX,nY + C_IMAGE_BLOCK-5);
}
//绘制单个方块,地图坐标
void DrawBlock( int nX, int nY, COLORREF nColor )
{
int nXPos = g_nXMapPos + nX*C_IMAGE_BLOCK + 2;
int nYPos = g_nYMapPos + nY*C_IMAGE_BLOCK;
DrawBlockPos(nXPos, nYPos,nColor);
}
//绘制形状方块,地图坐标
void DrawTerisBlock( tagTeris *Tetris, int nX, int nY, COLORREF nColor )
{
int i=0;
int j=0;
for(i=0;i<4;++i)
for(j=0;j<4;++j)
if(Tetris->nBlocks[i][j])
{
DrawBlock( nX + j, i + nY, nColor );
};
}
//绘制背景
void DrawMapBack( )
{
clearrectangle(g_nXMapPos+1,g_nYMapPos-1,g_nXMapPos+1+C_IMAGE_BLOCK*C_MAP_WIDTH, g_nYMapPos+C_IMAGE_BLOCK*C_MAP_HEIGHT);
clearrectangle(320,90,350+C_IMAGE_BLOCK*4, 240);
DrawTerisBlock(&g_Next, 12, 3, g_nColorBlockNext);
outtextXY(350,80,_T("下一个"));
outtextXY(320,180,_T("当前级别"));
outtextXY(320,220,_T("当前分数"));
printfXY( 400, 220, _T("%d"), g_nScore );
printfXY( 400, 180, _T("%d"), 10 - g_nSpeed);
}
//绘制界面
void RenderBack()
{
setline(0, 1, 0);
line(g_nXMapPos,g_nYMapPos,g_nXMapPos,g_nYMapPos+C_IMAGE_BLOCK*C_MAP_HEIGHT);
line(g_nXMapPos+C_IMAGE_BLOCK*C_MAP_WIDTH,g_nYMapPos,g_nXMapPos+C_IMAGE_BLOCK*C_MAP_WIDTH,g_nYMapPos+C_IMAGE_BLOCK*C_MAP_HEIGHT);
line(g_nXMapPos,g_nYMapPos+C_IMAGE_BLOCK*C_MAP_HEIGHT,g_nXMapPos+C_IMAGE_BLOCK*C_MAP_WIDTH,g_nYMapPos+C_IMAGE_BLOCK*C_MAP_HEIGHT);
}
//绘制内容
void DrawMap( )
{
int i=0;
int j=0;
for(j=0;j<C_MAP_HEIGHT;++j)
{
for(i=0;i<C_MAP_WIDTH;++i)
{
switch( g_nMap[j*C_MAP_WIDTH+i] )
{
case enumMAPTYPE_FIXBLOCK:
DrawBlock( i, j, RGB(30,60,235) );
break;
case enumMAPTYPE_DEADBLOCK:
break;
}
}
}
}
//绘制移动中方块
void DrawMovinggBlock( )
{
DrawTerisBlock(&g_TetrsRunning, g_nMovingX, g_nMovingY, g_nColorBlock);
}
//转动左边,00=03,01=13,02=23...10=02,11=12,12=22
void TurnLeft()
{
tagTeris temp;
int i=0;
int j=0;
for(i=0;i<4;++i)
for(j=0;j<4;++j)
temp.nBlocks[i][j]=g_TetrsRunning.nBlocks[j][3-i];
if(!IsExisted(&temp))
return;
int nLeft = 0;
int nRight = 0;
GetCurLeftRight(&temp, &nLeft, &nRight);
if( nLeft<0 )
{
g_nMovingX -= nLeft;
}
if( nRight>=C_MAP_WIDTH )
{
g_nMovingX -= nRight - C_MAP_WIDTH + 1;
}
g_TetrsRunning = temp;
}
//转动右边00=30,01=20,02=10...10=31,11=21,12=11
void TurnRight()
{
tagTeris temp;
int i=0;
int j=0;
for(i=0;i<4;++i)
for(j=0;j<4;++j)
temp.nBlocks[i][j]=g_TetrsRunning.nBlocks[3-j][i];
if(!IsExisted(&temp))
return;
int nLeft = 0;
int nRight = 0;
GetCurLeftRight(&temp, &nLeft, &nRight);
if( nLeft<0 )
{
g_nMovingX -= nLeft;
}
if( nRight>=C_MAP_WIDTH )
{
g_nMovingX -= nRight - C_MAP_WIDTH + 1;
}
g_TetrsRunning = temp;
}
//移动左边
void MoveLeft()
{
if(CanMovHor(-1))
--g_nMovingX;
}
//移动右边
void MoveRight()
{
if(CanMovHor(1))
++g_nMovingX;
}
//获取方块最左位置
void GetCurLeftRight(tagTeris *pTest, int *pLeft, int *pRight)
{
int i=0;
int j=0;
*pLeft = 99;
*pRight = -1;
for(i=0;i<4;++i)
for(j=0;j<4;++j)
{
if(pTest->nBlocks[i][j])
{
if( *pLeft>j + g_nMovingX )
*pLeft = j + g_nMovingX;
if( *pRight<j + g_nMovingX )
*pRight = j + g_nMovingX;
};
}
}
//是否可以往左右移动
bool CanMovHor(int nStepX)
{
int i=0;
int j=0;
for(i=0;i<4;++i)
for(j=0;j<4;++j)
{
if(g_TetrsRunning.nBlocks[i][j])
{
int nX=j + g_nMovingX + nStepX;
int nY=i + g_nMovingY;
if(nX<0 || nX>=C_MAP_WIDTH )
return false;
if( g_nMap[nY*C_MAP_WIDTH+nX] != enumMAPTYPE_NULL )
return false;
};
}
return true;
}
//是否与原来方块冲突
bool IsExisted(tagTeris *pTest)
{
int i=0;
int j=0;
for(i=0;i<4;++i)
for(j=0;j<4;++j)
{
if(pTest->nBlocks[i][j])
{
int nY=i + g_nMovingY + 1;
if( nY>=C_MAP_HEIGHT )
return false;
if( g_nMap[nY*C_MAP_WIDTH+j+g_nMovingX] )
return false;
};
}
return true;
}
//往下移动
bool MovingDown()
{
if(!IsExisted(&g_TetrsRunning))
{
int i=0;
int j=0;
for(i=0;i<4;++i)
for(j=0;j<4;++j)
{
if(g_TetrsRunning.nBlocks[i][j])
{
int nY=i + g_nMovingY;
g_nMap[nY*C_MAP_WIDTH+j+g_nMovingX] = enumMAPTYPE_FIXBLOCK;
//测试是否结束
if(nY<=0)
{
outtextXY(200,20,_T("游戏结束"));
return false;
}
}
}
NewBlock();
return false;
}
++g_nMovingY;
return true;
}
//清除
void ClearBlock()
{
int i=0;
int j=0;
bool bIsClear=true;
for(j=C_MAP_HEIGHT-1;j>=0;--j)
{
bIsClear=true;
for(i=0;i<C_MAP_WIDTH;++i)
{
if( g_nMap[j*C_MAP_WIDTH+i]==enumMAPTYPE_NULL )
{
bIsClear = false;
break;
}
}
if(bIsClear)
{
ClearLine(j);
g_nScore += 100;
if(g_nScore>=(10-g_nSpeed)*1000 && g_nSpeed>0)
--g_nSpeed;
++j;
}
}
}
//清除
void ClearLine(int nY)
{
int i=0;
int j=0;
for(j=nY;j>0;--j)
{
for(i=0;i<C_MAP_WIDTH;++i)
{
g_nMap[j*C_MAP_WIDTH+i]=g_nMap[(j-1)*C_MAP_WIDTH+i];
}
}
}
\ No newline at end of file
/*===========================================================*\
|简介: 俄罗斯方块
|功能: 俄罗斯方块
|作者: Bill
|主页: http://simplecg.qqpet.com
|博客: https://blog.csdn.net/b2b160
|贴吧: https://tieba.baidu.com/f?kw=simplecg
|日期: 2023-09-11
\*===========================================================*/
#ifndef _TETRIS_H
#define _TETRIS_H
#include "../import/include/SimpleCG.h"
#define C_IMAGE_BLOCK 20
#define C_MAP_WIDTH 10
#define C_MAP_HEIGHT 20
struct _tagTetris
{
int nBlocks[4][4];
};
typedef struct _tagTetris tagTeris;
int GetSpeed();
//初始化
void NewBlock();
//绘制单个方块
void DrawBlock( int nX, int nY, COLORREF nColor );
//绘制背景
void DrawMapBack( );
//绘制界面
void RenderBack();
//绘制内容
void DrawMap( );
//绘制移动中方块
void DrawMovinggBlock( );
//转动左边
void TurnLeft();
//转动右边
void TurnRight();
//移动左边
void MoveLeft();
//移动右边
void MoveRight();
//获取方块最左最右位置
void GetCurLeftRight(tagTeris *pTest, int *pLeft, int *pRight);
//是否可以往左右移动
bool CanMovHor(int nStepX);
//是否可以往下移动
bool IsExisted(tagTeris *pTest);
//往下移动
bool MovingDown();
//清除
void ClearBlock();
//清除
void ClearLine(int nY);
#endif
\ No newline at end of file
// stdafx.cpp : 只包括标准包含文件的源文件
// GameRussiaTetris.pch 将作为预编译头
// stdafx.obj 将包含预编译类型信息
#include "stdafx.h"
// TODO: 在 STDAFX.H 中
// 引用任何所需的附加头文件,而不是在此文件中引用
// stdafx.h : 标准系统包含文件的包含文件,
// 或是经常使用但不常更改的
// 特定于项目的包含文件
//
#pragma once
#include "targetver.h"
#include <stdio.h>
#include <tchar.h>
// TODO: 在此处引用程序需要的其他头文件
#pragma once
// 包括 SDKDDKVer.h 将定义可用的最高版本的 Windows 平台。
// 如果要为以前的 Windows 平台生成应用程序,请包括 WinSDKVer.h,并将
// WIN32_WINNT 宏设置为要支持的平台,然后再包括 SDKDDKVer.h。
#include <SDKDDKVer.h>
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册