学生用计算机怎么玩俄罗斯方块,计算机专业项目二 俄罗斯方块

这个博客介绍了如何使用C++编程实现经典游戏俄罗斯方块,包括方块形状的初始化、随机生成、边界处理、自动下落、碰撞检测以及行消除等功能。通过代码示例详细展示了游戏的核心逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

俄罗斯方块比上一个项目贪吃蛇的难度大,

需要考虑到初始化方块的形状,以及对方块变形的存储

随机产生方块图形可以类比贪吃蛇食物的随机产生 srand()实现

初始化边界

方块的自动下落 用sleep()控制下落速度

控制范围,当靠近边界空间不够时,不能进行形状的变换

当某一行被方块铺满时,消除

...........................

不多说了

直接上代码吧

// 方块 简单.cpp : 定义控制台应用程序的入口点。

//

#include "stdafx.h" //

#include

#include

#include

#include

#include

#define MOD 28

#define SIZE_N 19

#define SIZE_M 12

int cur_x, cur_y;

int score, mark, next, map[SIZE_N][SIZE_M], Gamespeed = 300;

int shape[28][6] = {//这是个比较偷懒的方法,就是7种方块,加上旋转总共28种

{ 0,-1,0,-2,1,0 },{ 0,1,1,0,2,0 },{ -1,0,0,1,0,2 },{ 0,-1,-1,0,-2,0 },

{ 0,-1,0,1,-1,0 },{ 0,1,1,0,-1,0 },{ 1,0,0,-1,0,1 },{ 1,0,-1,0,0,-1 },

{ -1,1,0,1,1,0 },{ 0,-1,1,0,1,1 },{ -1,0,0,-1,1,-1 },{ -1,-1,-1,0,0,1 },

{ -1,0,0,1,1,1 },{ 0,1,1,-1,1,0 },{ -1,0,0,1,1,1 },{ 0,1,1,-1,1,0 },

{ -1,0,0,-1,0,-2 },{ -1,0,-2,0,0,1 },{ 0,1,0,2,1,0 },{ 0,-1,1,0,2,0 },

{ 0,1,1,0,1,1 },{ 0,-1,1,0,1,-1 },{ -1,0,0,-1,-1,-1 },{ -1,0,-1,1,0,1 },

{ 0,1,0,2,0,3 },{ 1,0,2,0,3,0 },{ 0,-1,0,-2,0,-3 },{ -1,0,-2,0,-3,0 }

};

void gotoxy(int x, int y) {//gotoxy在TC中是在system.h库文件里的一个函数//功能就是在屏幕上输出字符

COORD c;

c.X = x - 1;

c.Y = y - 1;

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c);

}

void Gameover() {//游戏结束的判断

int i, j, flag = 0;

for (j = 1;j

if (map[1][j] != 0) {

flag = 1;

break;

}

}

if (flag == 1) {

for (i = 1;i

gotoxy(2, i + 1);

for (j = 1;j

printf("□");

}

puts("");

}

gotoxy(7, 9);

printf("GAME OVER!");

gotoxy(1, SIZE_N + 1);

exit(0);

}

}

void ShowMap(int id) {

int i, j;

gotoxy(1, 1);

if (id != -1) {

for (i = 0;i

for (j = 0;j

if (i == 0 && j == 0 || i == 0 && j == SIZE_M - 1 || j == 0 && i == SIZE_N - 1 || j == SIZE_M - 1 && i == SIZE_N - 1)

printf(" ");//四个角落

else if (i == 0 || i == SIZE_N - 1)

printf("--");//绘制顶部边界

else if (j == 0 || j == SIZE_M - 1)

printf("|");//两侧边界

else if (map[i][j] == 2)

printf("■");//接触到底部,固定显示

else if (i == cur_x + shape[id][0] && j == cur_y + shape[id][1] ||

i == cur_x + shape[id][2] && j == cur_y + shape[id][3] ||

i == cur_x + shape[id][4] && j == cur_y + shape[id][5] ||

i == cur_x && j == cur_y)

printf("■");//初始话方块的图形,从上方下落

else if (map[i][j] == 0)

printf(" ");//非方框产生和下落部分,清空

}

/*//边框右侧的显示区域**

****

*/

if (i == 1)

printf(" next:");

if (i == 11)

printf(" score : %d", score);

if (i == 14)

printf(" speed : %d", score / 100 + 1);

puts("");

}

}

else {

mark = 1;

for (i = 0;i

for (j = 0;j

if (i == 0 && j == 0 || i == 0 && j == SIZE_M - 1 || j == 0 && i == SIZE_N - 1 || j == SIZE_M - 1 && i == SIZE_N - 1)

printf(" ");//四个角落

else if (i == 0 || i == SIZE_N - 1)

printf("--");// 消除底层的话,用符号覆盖

else if (j == 0 || j == SIZE_M - 1)

printf("|");

else if (map[i][j] == 2)

printf("■");

else if (map[i][j] == 0)

printf(" ");

}

if (i == 1)

printf(" next:");

if (i == 11)

printf(" score : %d", score);

if (i == 14)

printf(" speed : %d", score / 100 + 1);

puts("");

}

}

/*对于 next 方块的处理,

先擦除再画图

*****

*/

gotoxy(30, 6);

printf(" ");

for (i = 0;i<6;i = i + 2) {

gotoxy(30 + 2 * shape[id][i + 1], 6 + shape[id][i]);

printf(" ");

}

gotoxy(30, 6);

printf("■");

for (i = 0;i<6;i = i + 2) { //显示next方块的形状在右侧区域

gotoxy(30 + 2 * shape[next][i + 1], 6 + shape[next][i]);

printf("■");

}

Sleep(Gamespeed);

}

void init(int id) {//初始化函数,cur_x,cur_y是全局变量,标记了移动方块的位置

memset(map, 0, sizeof(map)); //用o对map内存空间初始化

for (int i = 0;i

for (int j = 0;j

if (i == SIZE_N - 1 || j == 0 || j == SIZE_M - 1)

map[i][j] = -1;

}

cur_x = 0; cur_y =5;

ShowMap(id);

}

/*判断是否出界,或者说是否合法**

**********

**********/

int judge_in(int x, int y, int id) {//判断是否出界,或者说是否合法

if (map[x][y] != 0)

return 0;

for (int i = 0;i<6;i = i + 2) {

if (map[x + shape[id][i]][y + shape[id][i + 1]] != 0)

return 0;

}

return 1;

}

void fun_score() {//得分,擦除行的闪烁,还有图形的向下平移

for (int i = 1;i

int flag = 0;

for (int j = 1;j

if (map[i][j] != 2) {

flag = 1;

break;

}

}

if (flag == 0) {

int k = 3;

while (k--) {

gotoxy(2, i + 1);

for (int ii = 1;ii

if (map[i][ii] == 2) {

if (k % 2 == 1)

printf(" ");

else

printf("■");

}

}

Sleep(100);

}

for (int ii = i;ii>1;ii--) {

for (int jj = 1;jj

map[ii][jj] = map[ii - 1][jj];

}

ShowMap(-1);

score += 10;

if (score % 100 == 0 && score != 0)

Gamespeed -= 50;

}

}

}

void main() {

int i, id, set = 1;

srand((unsigned)time(NULL));

id = rand() % MOD;

id = (id + MOD) % MOD;

next = rand() % MOD;

next = (next + MOD) % MOD;

init(id);

while (1) {

Here:mark = 0;

if (set == 0) {

id = next;

next = rand() % MOD;

next = (next + MOD) % MOD;

cur_x = 0;

cur_y = 5;

set = 1;

}

while (!_kbhit()) {

Gameover();

if (judge_in(cur_x + 1, cur_y, id) == 1)

cur_x++;

else {

map[cur_x][cur_y] = 2;

for (i = 0;i<6;i = i + 2)

map[cur_x + shape[id][i]][cur_y + shape[id][i + 1]] = 2;

fun_score();

set = 0;

}

if (mark != 1)ShowMap(id);

goto Here;

}//end of while(!kbhit())

char key;

key = _getch();

if (key == 72) {

int tmp = id;

id++;

if (id % 4 == 0 && id != 0)

id = id - 4;

if (judge_in(cur_x, cur_y, id) != 1)

id = tmp;

}

else if (key == 80 && judge_in(cur_x + 1, cur_y, id) == 1)

cur_x++;

else if (key == 75 && judge_in(cur_x, cur_y - 1, id) == 1)

cur_y--;

else if (key == 77 && judge_in(cur_x, cur_y + 1, id) == 1)

cur_y++;

else if (key == 27) { gotoxy(1, SIZE_N + 1);

exit(0); }

}

}

标题“51单片机通过MPU6050-DMP获取姿态角例程”解析 “51单片机通过MPU6050-DMP获取姿态角例程”是一个基于51系列单片机(一种常见的8位微控制器)的程序示例,用于读取MPU6050传感器的数据,并通过其内置的数字运动处理器(DMP)计算设备的姿态角(如倾斜角度、旋转角度等)。MPU6050是一款集成三轴加速度计和三轴陀螺仪的六自由度传感器,广泛应用于运动控制和姿态检测领域。该例程利用MPU6050的DMP功能,由DMP处理复杂的运动学算法,例如姿态融合,将加速度计和陀螺仪的数据进行整合,从而提供稳定且实时的姿态估计,减轻主控MCU的计算负担。最终,姿态角数据通过LCD1602显示屏以字符形式可视化展示,为用户提供直观的反馈。 从标签“51单片机 6050”可知,该项目主要涉及51单片机和MPU6050传感器这两个关键硬件组件。51单片机基于8051内核,因编程简单、成本低而被广泛应用;MPU6050作为惯性测量单元(IMU),可测量设备的线性和角速度。文件名“51-DMP-NET”可能表示这是一个与51单片机及DMP相关的网络资源或代码库,其中可能包含C语言等适合51单片机的编程语言的源代码、配置文件、用户手册、示例程序,以及可能的调试工具或IDE项目文件。 实现该项目需以下步骤:首先是硬件连接,将51单片机与MPU6050通过I2C接口正确连接,同时将LCD1602连接到51单片机的串行数据线和控制线上;接着是初始化设置,配置51单片机的I/O端口,初始化I2C通信协议,设置MPU6050的工作模式和数据输出速率;然后是DMP配置,启用MPU6050的DMP功能,加载预编译的DMP固件,并设置DMP输出数据的中断;之后是数据读取,通过中断服务程序从DMP接收姿态角数据,数据通常以四元数或欧拉角形式呈现;再接着是数据显示,将姿态角数据转换为可读的度数格
MathorCup高校数学建模挑战赛是一项旨在提升学生数学应用、创新和团队协作能力的年度竞赛。参赛团队需在规定时间内解决实际问题,运用数学建模方法进行分析并提出解决方案。2021年第十一届比赛的D题就是一个典型例子。 MATLAB是解决这类问题的常用工具。它是一款强大的数值计算和编程软件,广泛应用于数学建模、数据分析和科学计算。MATLAB拥有丰富的函数库,涵盖线性代数、统计分析、优化算法、信号处理等多种数学操作,方便参赛者构建模型和实现算法。 在提供的文件列表中,有几个关键文件: d题论文(1).docx:这可能是参赛队伍对D题的解答报告,详细记录了他们对问题的理解、建模过程、求解方法和结果分析。 D_1.m、ratio.m、importfile.m、Untitled.m、changf.m、pailiezuhe.m、huitu.m:这些是MATLAB源代码文件,每个文件可能对应一个特定的计算步骤或功能。例如: D_1.m 可能是主要的建模代码; ratio.m 可能用于计算某种比例或比率; importfile.m 可能用于导入数据; Untitled.m 可能是未命名的脚本,包含临时或测试代码; changf.m 可能涉及函数变换; pailiezuhe.m 可能与矩阵的排列组合相关; huitu.m 可能用于绘制回路图或流程图。 matlab111.mat:这是一个MATLAB数据文件,存储了变量或矩阵等数据,可能用于后续计算或分析。 D-date.mat:这个文件可能包含与D题相关的特定日期数据,或是模拟过程中用到的时间序列数据。 从这些文件可以推测,参赛队伍可能利用MATLAB完成了数据预处理、模型构建、数值模拟和结果可视化等一系列工作。然而,具体的建模细节和解决方案需要查看解压后的文件内容才能深入了解。 在数学建模过程中,团队需深入理解问题本质,选择合适的数学模
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值