俄罗斯方块
目录
前言
一、设计原则
二、用例图
三、活动图
三、落块行为
四、实块行为
五、game行为
六、各部分cpp代码框架
1、落块
2、实块
3、game
总结
前言
在这个项目中,我们将尝试使用C语言来实现经典游戏俄罗斯方块。俄罗斯方块是一款流行的益智游戏,玩家需要将不同形状的方块移动和旋转,以在游戏区域内创建完整的水平行,从而消除方块并得分。通过这个项目,我们将学习如何使用C编程语言来处理游戏逻辑、图形界面和用户输入,希望通过这个项目的实践,提升我们编程的技能和理解。让我们开始这个有趣的项目,一起来实现我们自己的俄罗斯方块游戏吧!
一、设计原则
二、用例图
三、活动图
根据活动图,建立头文件,datatype用来写自定义类型,然后将.h文件在主游戏框架中引用。
三、落块行为
#pragma once
#include"datatype.h"
//全局变量 外部链接声明
//函数声明
/*左不出界*/
BOOL leftNotOut(void);
/*左不被挡住*/
BOOL leftNotStop(void);
/*左移动*/
void leftMove(void);
/*右不出界*/
BOOL rightNotOut(void);
/*右不被挡住*/
BOOL rightNotStop(void);
/*右移动*/
void rightMove(void);
/*下不出界*/
BOOL downNotOut(void);
/*下不被挡住*/
BOOL downNotStop(void);
/*下移动*/
void downMove(void);
四、实块行为
#pragma once
#include"datatype.h"
//全局变量 外部链接声明
//函数声明
/*合并*/
void merge(void);
/*清除方块: 返回被清除的行数*/
int cleanBlock(void);
/*能否结束*/
BOOL enableOver(void);
五、game行为
#pragma once
//全局变量 外部链接声明
//函数声明
/*更新得分
* 参数:lines 被清除的行数
*/
void updateScore(int lines);
/*结束游戏*/
void game_over(void);
六、各部分cpp代码框架
1、落块
#include "luokuai.h"
#include"shikuai.h"
#include<stdlib.h>
int luoKuai[20][10] = { 0 };//可以移动的方块
BOOL leftNotOut(void)
{
for (int h = 0; h < 20; h++)
{
if (luoKuai[h][0] != 0)
{
return FALSE;
}
}
return TRUE;
}
BOOL leftNotStop(void)
{
for (int h = 19; h >=0; h--)
{
for (int k = 1; k < 10; k++)
{
if (luoKuai[h][k] != 0 && shiKuai[h][k -1] != 0)
{
return FALSE;
}
}
}
return TRUE;
}
void leftMove(void)
{
for (int h = 0; h < 20; h++)
{
for (int k = 1; k <10; k++)
{
luoKuai[h][k - 1] = luoKuai[h][k];
luoKuai[h][k] = 0;
}
}
}
BOOL rightNotOut(void)
{
for (int h = 0; h < 20; h++)
{
if (luoKuai[h][9] != 0)
{
return FALSE;
}
}
return TRUE;
}
BOOL rightNotStop(void)
{
for (int h =19; h >=0 ; h--)
{
for (int k = 8; k >=0; k--)
{
if (luoKuai[h][k] != 0 && shiKuai[h][k+1] != 0)
{
return FALSE;
}
}
}
return TRUE;
}
void rightMove(void)
{
for (int h = 0; h<20; h++)
{
for (int k = 8; k >=0; k--)
{
luoKuai[h][k+1] = luoKuai[h][k];
luoKuai[h][k] = 0;
}
}
}
BOOL downNotOut(void)
{
for (int k = 0; k < 10; k++)
{
if (luoKuai[19][k]!=0)
{
return FALSE;
}
}
return TRUE;
}
BOOL downNotStop(void)
{
for (int h=18;h>=0;h--)
{
for (int k=0;k<10;k++)
{
if (luoKuai[h][k]!=0&&shiKuai[h+1][k]!=0)
{
return FALSE;
}
}
}
return TRUE;
}
void downMove(void)
{
for(int h=18;h>=0;h--)
{
for (int k=0;k<10;k++)
{
luoKuai[h+1][k]=luoKuai[h][k];
luoKuai[h][k] = 0;
}
}
}
void newLuoKuai(void)
{
//随机颜色
int color = rand() % 10 + 1;//随机颜色
//随机图案
BlockType bt = (BlockType)(rand() % 5);
switch (bt)
{
case Z:
luoKuai[0][3] = luoKuai[0][4] = color;
luoKuai[1][4] = luoKuai[1][5] = color;
break;
case O:
luoKuai[0][3] = luoKuai[0][4] = color;
luoKuai[1][3] =luoKuai[1][4] = color;
break;
case T:
luoKuai[0][3] = luoKuai[0][4] = luoKuai[0][5] = color;
luoKuai[1][4] = color;
break;
case I:luoKuai[0][3] = color;
luoKuai[1][3] = color;
luoKuai[2][3] = color;
luoKuai[3][3] = color;
break;
case L:
luoKuai[0][3] = color;
luoKuai[1][3] = color;
luoKuai[2][3] = luoKuai[2][4] = color;
break;
}
}
2、实块
#include "shikuai.h"
#include"luokuai.h"
int shiKuai[20][10] = { 0 };//收集不能下落的方块
void merge(void)
{
for (int h=0;h<20;h++)
{
for (int k=0;k<9;k++)
{
if (luoKuai[h][k]!=0)
{
shiKuai[h][k] = luoKuai[h][k];
luoKuai[h][k] = 0;
}
}
}
}
int cleanBlock(void)
{
return 0;
}
BOOL enableOver(void)
{
return FALSE;
}
3、game
#include "game.h"
#include<stdlib.h>
int score = 0;//得分
void updateScore(int lines)
{
score+=lines;
}
void game_over(void)
{
}
总结
以上为俄罗斯方块的总体架构,俄罗斯方块项目主要涉及到游戏逻辑、界面设计、碰撞检测和得分计算等方面,通过合理的架构设计和代码实现,可以完成一个简单而有趣的俄罗斯方块游戏。