需求文档
可行性分析
技术
项目基础进度要求:至少完成JavaSwing之前的所有学习内容,包括文件流。
核心功能(即功能的简要描述)
-
方块的自动下落
方块会在地图中自动下落,玩家需要再方块到达底部之前对方块进行相关操作。
玩家控制方块移动
玩家可以使用键盘方向键来左右移动方块
玩家可以使用上键和下键对方块进行旋转操作。
方块加速下落
玩家可以点击相关按键让方块加速下落到最底部
消除完整行
当某一行被完全填满时,该行将会被消除,所有再改行上方的方块将会下移一行。
游戏失败判定
当方块堆积到达顶端时,游戏结束。
计分系统
每消除一行,玩家就会获得相应的分数
连续消除多行将会获得额外的分数奖励
随机生成方块
每个新方块都是从四种经典形状中随机生成的,保证有息的随机性和挑战性。
方块旋转
方块可以顺时针或逆时针旋转,以便于更好地填充空隙。
暂停和继续游戏
玩家可以在游戏过程中暂停游戏,并在需要时继续游戏。
数据设计及逻辑可行性分析
3.1数据设计
/*
方块:
piece[i][0]表示第i块方块的x轴坐标
piece[i][1]表示第i块方块的y轴坐标
*/
int piece[4][2] = {
{x1, y1},
{x2, y2},
{x3, y3},
{x4, y4}
}
// 当前方块形状
Tetrominoes currentShape;
// 下一个方块形状
Tetrominoes nextShape;
/*
地图:
grid[i][j]表示地图上(i,j)坐标点是什么东西
0表示空地,1表示墙壁,2表示固定的方块
*/
int grid[22][10] = {
// 初始化地图,0表示空地
}
/*
游戏状态:
记录游戏是否开始,是否暂停,是否结束
*/
boolean isStarted;
boolean isPaused;
boolean isGameOver;
// 已消除的行数
int numLinesRemoved;
3.2逻辑的思路描述
方块自动下落
// 每隔一段时间自动下落
while (gameRunning) {
if (isPaused) continue;
sleep(interval); // 等待一段时间
if (!tryMove(currentPiece, currentX, currentY - 1)) {
pieceLanded();
}
}
玩家控制方块移动
// 接收玩家输入
switch (keyPressed) {
case 'left':
tryMove(currentPiece, currentX - 1, currentY);
break;
case 'right':
tryMove(currentPiece, currentX + 1, currentY);
break;
case 'up':
tryMove(currentPiece.rotateRight(), currentX, currentY);
break;
case 'down':
tryMove(currentPiece.rotateLeft(), currentX, currentY);
break;
}
方块加速下落
// 玩家按下空格键
if (keyPressed == 'space') {
while (tryMove(currentPiece, currentX, currentY - 1));
pieceLanded();
}
消除完整行
// 检查并消除完整行
for (int i = 0; i < BOARD_HEIGHT; i++) {
boolean lineIsFull = true;
for (int j = 0; j < BOARD_WIDTH; j++) {
if (grid[i][j] == 0) {
lineIsFull = false;
break;
}
}
if (lineIsFull) {
removeLine(i);
}
}
游戏失败判定
// 判断是否游戏结束
if (!tryMove(newPiece, startX, startY)) {
isGameOver = true;
}
计分系统
// 每消除一行,增加分数
if (lineIsFull) {
score += pointsPerLine;
}
随机生成方块
// 随机生成新的方块
Tetrominoes[] shapes = {Tetrominoes.LineShape, Tetrominoes.SquareShape, Tetrominoes.LShape, Tetrominoes.TShape};
currentPiece.setShape(shapes[random.nextInt(shapes.length)]);
方块旋转
// 方块旋转
if (keyPressed == 'up') {
tryMove(currentPiece.rotateRight(), currentX, currentY);
} else if (keyPressed == 'down') {
tryMove(currentPiece.rotateLeft(), currentX, currentY);
}
暂停或继续游戏
// 暂停和继续游戏
if (keyPressed == 'P') {
isPaused = !isPaused;
}