📄 russia.c
字号:
#include "Russia.h"
int Gameboard[BOARD_WIDTH+2][BOARD_HEIGHT+2];
int nCurrent_block_index;/* 当前下落的方块的索引号*/
int nNext_block_index ; /*下一个方块的索引号*/
int nSpeed, nScore; /*速度和得分*/
int nSpeedUpScore = 1000; /*第一次要加速需达到的分数*/
int bAccel, bOver;
int nOriginX=5, nOriginY=1;/*某一形状的原点的绝对坐标*/
BLOCK arrayBlock[19]={
/*x1,y1,x2,y2,x3,y3,x4,y4, color, next*/
{ 0,-2, 0,-1, 0, 0, 1, 0, CYAN, 1}, /* */
{-1, 0, 0, 0, 1,-1, 1, 0, CYAN, 2}, /* # */
{ 0,-2, 1,-2, 1,-1, 1, 0, CYAN, 3}, /* # */
{-1,-1,-1, 0, 0,-1, 1,-1, CYAN, 0}, /* ## */
{ 0,-2, 0,-1, 0, 0, 1,-2,MAGENTA, 5}, /* */
{-1,-1,-1, 0, 0, 0, 1, 0,MAGENTA, 6}, /* ## */
{ 0, 0, 1,-2, 1,-1, 1, 0,MAGENTA, 7}, /* # */
{-1,-1, 0,-1, 1,-1, 1, 0,MAGENTA, 4}, /* # */
{-1, 0, 0,-1, 0, 0, 1, 0,YELLOW, 9}, /* */
{-1,-1, 0,-2, 0,-1, 0, 0,YELLOW, 10}, /* */
{-1,-1, 0,-1, 0, 0, 1,-1,YELLOW, 11}, /* # */
{ 0,-2, 0,-1, 0, 0, 1,-1,YELLOW, 8}, /* ### */
{-1, 0, 0,-1, 0, 0, 1,-1, BROWN, 13}, /* ## */
{ 0,-2, 0,-1, 1,-1, 1, 0, BROWN, 12}, /* ## */
{-1,-1, 0,-1, 0, 0, 1, 0, WHITE, 15}, /* ## */
{ 0,-1, 0, 0, 1,-2, 1,-1, WHITE, 14}, /* ## */
{ 0,-3, 0,-2, 0,-1, 0, 0, RED, 17},/* # */
{-1, 0, 0, 0, 1, 0, 2, 0, RED, 16},/* # */
/* # */
/* # */
{ 0,-1, 0, 0, 1,-1, 1, 0, BLUE, 18},/* ## */
/* ## */
};
/**********************************************************
* 函数原型:void StartGame () *
* 传入参数:无 *
* 返 回 值:无 *
* 函数功能:游戏开始时调用的函数,其中绘制界面需调用函数 *
* InitializeGameboard(), 接下来需初始化游戏面板的 *
* 各个方块和一些全局变量的初值 *
**********************************************************/
void StartGame()
{
int i,j;
/*设置游戏面板中每个方块的初始值*/
for(j=0;j<=BOARD_HEIGHT;j++)
for(i=0;i<BOARD_WIDTH+2;i++)
{
if(i==0 || i==BOARD_WIDTH+1)
Gameboard[i][j] = FILLED;
else
Gameboard[i][j] = EMPTY;
}
for(i=0;i<BOARD_WIDTH+2;i++)
Gameboard[i][BOARD_HEIGHT+1] = FILLED;
InitializeGameboard();
/*设置游戏变量的初值*/
nNext_block_index = -1; /*游戏初始,没有下一个形状的索引号*/
nSpeed = 0;
nScore = 0;
}
/**********************************************************
* 函数原型:void ProcessInGame() *
* 传入参数:无 *
* 返 回 值:无 *
* 函数功能:核心函数,主要用于处理在游戏中的各种事件(如按下各种按键) *
**********************************************************/
void ProcessInGame()
{
int key;
bioskey(0);
randomize();
while(1)
{
if(nNext_block_index==-1)
{
nCurrent_block_index = rand()%19;
nNext_block_index = rand()%19;
/*绘制下一个提示形状*/
DrawBlock(nNext_block_index, 19,6,arrayBlock[nNext_block_index].nColor );
}
else
{
nCurrent_block_index = nNext_block_index;
DrawBlock(nNext_block_index, 19,6,BGCOLOR ); /* 消除原来的提示形状 */
nNext_block_index = rand()%19;
DrawBlock(nNext_block_index, 19,6,arrayBlock[nNext_block_index].nColor ); /*绘制下一个提示形状 */
}
nOriginX=5, nOriginY=1;
TimerCounter = 0;
DrawBlock(nCurrent_block_index, nOriginX,nOriginY, arrayBlock[nCurrent_block_index].nColor );/*在面板内绘制当前形状*/
while(1)
{
if (bioskey(1))
key=bioskey(0);
else key=0;
bAccel = FALSE;
switch(key)
{
case VK_LEFT: /* 左移 */
HandleLeft(nCurrent_block_index,&nOriginX,&nOriginY );
break;
case VK_RIGHT: /* 右移 */
HandleRight(nCurrent_block_index,&nOriginX,&nOriginY );
break;
case VK_UP: /* 旋转 */
case VK_SPACE:
HandleUp(&nCurrent_block_index, &nOriginX,&nOriginY);
break;
case VK_DOWN: /* 下落加速键 */
bAccel=TRUE;
break;
case VK_END: /* 暂停*/
bioskey(0);
break;
case VK_ESC: /* 退出游戏 */
bOver=TRUE;
return;
}
if(bAccel || TimerCounter>(20-nSpeed*2))
if(HandleDown(nCurrent_block_index,&nOriginX,&nOriginY))
break;
if(bOver)
return;
}
}
}
/**********************************************************
* 函数原型:void main() *
* 传入参数:无 *
* 返 回 值:无 *
* 函数功能:入口函数,包含俄罗斯方块程序的主流程 *
**********************************************************/
void main()
{
InitializeGraph();
SetTimer(newtimer); /*设置新的时钟中断*/
while(1)
{
StartGame();
ProcessInGame();
if(GameOver())
break;
bOver = FALSE;
}
KillTimer();
closegraph();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -