【c语言小项目】基于easyX的俄罗斯方块

article/2025/10/29 17:43:40

EeayX是针对 C/C++ 的简单图形库插件,本项目基于easyX游戏框架下实现俄罗斯方块游戏。 

 

俄罗斯方块功能实现中主要运用了二维数组的循环遍历。能够实现基本功能,暂未实现旋转

c语言系列专栏:c语言之路重点知识整合  

更多【c语言】小项目:

【c语言】贪吃蛇游戏

【c语言小项目】基于easyX实现的《是男人就下一百层》小游戏

创作不易,本篇文章如果帮助到了你,还请点赞支持一下♡>𖥦<)!! 

主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!

给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ

目录

运行结果:

代码: 

main.cpp

game_function.cpp 

date_type.h

 game_function.h

global_var.h

图片文件:

EasyX游戏框架:


 运行结果:

代码: 

main.cpp

#define _CRT_SECURE_NO_WARNINGS 1
#include <easyx.h>
#include <time.h>
#include <conio.h>
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<string>
#include<graphics.h>
#include "game_function.h"
/*游戏界面绘制*/
void gamePaint();
/*游戏初始化绘制*/
void gameInit();
/*游戏定时处理*/
void gameInterval();
/*游戏键盘按下*/
void gameKeypress(int key);
/*游戏鼠标按下*/
void gameMouseDown(int mouseX, int mouseY);
/*游戏鼠标右键按下*/
void gameMouseRightDown(int mouseX, int mouseY);
/*游戏鼠标抬起*/
void gameMouseUp(int mouseX, int mouseY);
/*游戏鼠标移动*/
void gameMousemove(int mouseX, int mouseY);/*
含透明的图的绘制
x为要载入图片的X坐标,y为Y坐标
*/
void drawImage(int  picture_x, int picture_y, IMAGE* picture);
/*调整图片透明度角度转弧度:PI/180*角度弧度转角度:180/PI*弧度
*/
void drawImageAlpha(int x0, int y0, IMAGE* img, double f);
/*两个矩形碰撞检测
即两个矩形是否相交。x1, y1, w1, h1是第一个矩形的xy宽高的四个参数x2, y2, w2, h2是第二个矩形的xy宽高的四个参数返回0代表不相交 返回1代表相交
*/
int testHit(int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2);/*设置100即每隔100毫秒刷新以下界面绘图。*/
int interval = 100;//TODO: 1 设置定时器时间间隔(单位毫秒)
// TODO: 1 设置窗口: 宽度 高度
int screenWidth = 470;
int screenHeight = 616;
int stop = 0;//是否停止游戏
//-----------------------------------//
int times = 0;
/*初始化游戏 */
void initgame()
{srand((unsigned)time(NULL));//随机数初始化setbkcolor(NULL);//背景色setbkmode(TRANSPARENT);// 设置背景混合模式: TRANSPARENT为透明gameInit();
}
/*界面绘图演示案例
*//*绘制显示游戏界面*/
void paint()
{BeginBatchDraw();//打开双缓冲cleardevice();// 清屏gamePaint();//-----------------------------//EndBatchDraw();//关闭双缓冲
}/*游戏运行*/
void run()
{ExMessage msg;//ExMessage key;while (1)	// 游戏主循环  可借助break 结束循环{if (peekmessage(&msg, -1, true)){switch (msg.message){case WM_MOUSEMOVE://鼠标移动gameMousemove(msg.x, msg.y);break;case WM_LBUTTONDOWN://左键按下gameMouseDown(msg.x, msg.y);break;case WM_LBUTTONUP://左键抬起gameMouseUp(msg.x, msg.y);break;case WM_LBUTTONDBLCLK://左键双击break;case WM_RBUTTONDOWN://右键按下break;case WM_RBUTTONUP://右键抬起gameMouseRightDown(msg.x, msg.y);break;case WM_RBUTTONDBLCLK://右键双击break;case WM_KEYDOWN:gameKeypress(msg.vkcode);break;}paint();continue;}//------时间处理 勿动-----------//Sleep(1);times++;if (times % (interval / 10) != 0) {continue;}times = 0;if (stop){break;}gameInterval();//-------------------------------//paint();// 刷新显示游戏界面}
}/*绘制透明背景图*/
void drawImage(int  picture_x, int picture_y, IMAGE* picture) //x为载入图片的X坐标,y为Y坐标
{// 变量初始化DWORD* dst = GetImageBuffer();    // GetImageBuffer()函数,用于获取绘图设备的显存指针,EASYX自带DWORD* draw = GetImageBuffer();DWORD* src = GetImageBuffer(picture); //获取picture的显存指针int picture_width = picture->getwidth(); //获取picture的宽度,EASYX自带int picture_height = picture->getheight(); //获取picture的高度,EASYX自带int graphWidth = getwidth();       //获取绘图区的宽度,EASYX自带int graphHeight = getheight();     //获取绘图区的高度,EASYX自带int dstX = 0;    //在显存里像素的角标// 实现透明贴图 公式: Cp=αp*FP+(1-αp)*BP , 贝叶斯定理来进行点颜色的概率计算for (int iy = 0; iy < picture_height; iy++){for (int ix = 0; ix < picture_width; ix++){int srcX = ix + iy * picture_width; //在显存里像素的角标int sa = ((src[srcX] & 0xff000000) >> 24); //0xAArrggbb;AA是透明度int sr = ((src[srcX] & 0xff0000) >> 16); //获取RGB里的Rint sg = ((src[srcX] & 0xff00) >> 8);   //Gint sb = src[srcX] & 0xff;              //Bif (ix >= 0 && ix <= graphWidth && iy >= 0 && iy <= graphHeight && dstX <= graphWidth * graphHeight){dstX = (ix + picture_x) + (iy + picture_y) * graphWidth; //在显存里像素的角标if (dstX < 0) continue;int dr = ((dst[dstX] & 0xff0000) >> 16);int dg = ((dst[dstX] & 0xff00) >> 8);int db = dst[dstX] & 0xff;draw[dstX] = ((sr * sa / 255 + dr * (255 - sa) / 255) << 16)  //公式: Cp=αp*FP+(1-αp)*BP  ; αp=sa/255 , FP=sr , BP=dr| ((sg * sa / 255 + dg * (255 - sa) / 255) << 8)         //αp=sa/255 , FP=sg , BP=dg| (sb * sa / 255 + db * (255 - sa) / 255);              //αp=sa/255 , FP=sb , BP=db}}}
}
/*调整图片透明度*/
void drawImageAlpha(int x0, int y0, IMAGE* img, double f)
{//获得图片尺寸int qwidth, qheight;qwidth = img->getwidth();qheight = img->getheight();//P图为背景图,RS为目标图片static IMAGE RS(qwidth, qheight);static IMAGE P(qwidth, qheight);//背景图的绘制getimage(&P, x0, y0, qwidth, qheight);//获取指针,作为透明度计算DWORD* M = GetImageBuffer(&P);DWORD* N = GetImageBuffer(img);DWORD* R = GetImageBuffer(&RS);// 开启批量绘图模式,解决闪烁问题BeginBatchDraw();//计算与赋值int i, j;for (i = 0; i < qheight; i++) {for (j = 0; j < qwidth; j++) {int r, g, b;int ij;//计算ij = i * qwidth + j;r = (int)((GetRValue(N[ij])) * (1 - f) + GetRValue(M[ij]) * f);g = (int)((GetGValue(N[ij])) * (1 - f) + GetGValue(M[ij]) * f);b = (int)((GetBValue(N[ij])) * (1 - f) + GetBValue(M[ij]) * f);R[ij] = RGB(r, g, b);}}//贴出图片并释放内存putimage(x0, y0, &RS);FlushBatchDraw();// 绘制
}
//检测两个矩形是否相碰撞
int testHit(int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2)
{return !(x1 + w1 < x2 ||y1 + h1 < y2 ||x2 + w2 < x1 ||y2 + h2 < y1);
}
// 主函数,开启游戏
int main()
{initgraph(screenWidth, screenHeight, EW_DBLCLKS | EW_SHOWCONSOLE);initgame();					// 初始化游戏paint();// 刷新显示游戏界面flushmessage();		// 清空鼠标缓冲区while (_kbhit()) _getch();	// 清空键盘缓冲区run();						// 开始游戏closegraph();//关闭图形环return 0;
}//--------------优雅的警戒线 以上为雷区 非专业 勿进------------------// 
//TODO: 2 全局变量声明位置 
//TODO: 2 全局变量声明位置 
IMAGE imgbg;//背景色
IMAGE imgfk[11];//方块图片
TCHAR imgPath[100];
int luoKuai[20][10] = { 0 };//下落的方块
int shiKuai[20][10] = { 0 };//落实不动的方块
int color;
int score = 0;//得分
int level = 1;
//TODO: 3 游戏初始化位置  
void gameInit()
{loadimage(&imgbg, L".\\images\\2\\bg-3.png"); //自己的图片路径for (int c = 0; c < 11; c++){_stprintf(imgPath, L".\\images\\2\\%d.png", c);//自己的的图片路径loadimage(&imgfk[c], imgPath);}//color = rand() % 10 + 1;//随机颜色 1~10//luoKuai[0][3] = luoKuai[0][4] = luoKuai[0][5] = color;//				luoKuai[1][4] = color;createNewLuoKuai();
}
//TODO: 4 绘图处理位置  
void gamePaint()
{putimage(0, 0, &imgbg);//---------显示下落方块-------------//int h, l;for (h = 0; h < 20; h++){for (l = 0; l < 10; l++){if (luoKuai[h][l] != 0){drawImage(30 + l * 30, 5 + h * 30, &imgfk[luoKuai[h][l]]);}if (shiKuai[h][l] != 0){drawImage(30 + l * 30, 5 + h * 30, &imgfk[shiKuai[h][l]]);}}}//---------显示  得分 等级-------------//settextstyle(18, 0, _T("黑体"));settextcolor(0xffffff);TCHAR str[100];_stprintf(str, L"%d分", score);outtextxy(390, 228, str);_stprintf(str, L"Level %d", level);outtextxy(390, 294, str);
}
//TODO: 5 定时处理位置
void gameInterval()
{if (downNotOut()&&downNotStop()){downMove();}else{merge();updateScore(clearLine());if (isOver()){gameover();}else{createNewLuoKuai();}}
}
//TODO: 6 处理键盘控制位置
void gameKeypress(int key)
{switch (key){case VK_LEFT:if (leftNotOut() && leftNotStop()){leftMove();}break;case VK_RIGHT:if (rightNotOut() && rightNotStop()){rightMove();}break;case VK_UP:break;case VK_DOWN:break;}}//TODO: 7 处理鼠标控制位置
void gameMouseDown(int mouseX, int mouseY)
{}
void gameMouseUp(int mouseX, int mouseY)
{}
void gameMousemove(int mouseX, int mouseY)
{}void gameMouseRightDown(int mouseX, int mouseY)
{}

game_function.cpp 

#include "game_function.h"
#include <stdlib.h>
/*向左移动*/
void leftMove()
{for (int k = 1; k < 10; k++){for (int h = 0; h < 20; h++){luoKuai[h][k - 1] = luoKuai[h][k];luoKuai[h][k] = 0;}}
}
/* 左不出界 */
_BOOL_ leftNotOut()
{for (int h = 0; h < 20; h++){if (luoKuai[h][0]){return FALSE;}}return TRUE;
}
/*左不阻挡*/
_BOOL_ leftNotStop()
{for (int k = 1; k < 10; k++){for (int h = 0; h < 20; h++){if (luoKuai[h][k] && shiKuai[h][k - 1]){return FALSE;}}}return TRUE;
}
/*向右移动*/
void rightMove()
{for (int k = 8; k >= 0; k--){for (int h = 0; h < 20; h++){luoKuai[h][k+1] = luoKuai[h][k];luoKuai[h][k] = 0;}}
}
/* 右不出界 */
_BOOL_ rightNotOut()
{for (int h = 0; h < 20; h++){if (luoKuai[h][9]){return FALSE;}}return TRUE;
}
/* 右不阻挡 */
_BOOL_ rightNotStop()
{for (int k = 8; k >= 0; k--){for (int h = 0; h < 20; h++){if (luoKuai[h][k] && shiKuai[h][k + 1]){return FALSE;}}}return TRUE;
}
/*向下移动*/
void downMove()
{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;}}
}
/*下不出界*/
_BOOL_ downNotOut()
{for (int k = 0; k < 10; k++){if (luoKuai[19][k] != 0){return FALSE;}}return TRUE;
}
/*下不阻挡*/
_BOOL_ downNotStop()
{for (int h = 18; h >= 0; h--){for (int k = 0; k < 10; k++){if (luoKuai[h][k] && shiKuai[h+1][k]){return FALSE;}}}return TRUE;
}
/* 合并 */
void merge()
{for (int h = 0; h < 20; h++){for (int k = 0; k < 10; k++){if (luoKuai[h][k]){shiKuai[h][k] = luoKuai[h][k];luoKuai[h][k] = 0;}}}
}
/*消除行*/
int clearLine()
{int count = 0;//记录消除了多少行for (int xh = 0; xh < 20; xh++){//检验本行是否能消除_BOOL_ can = TRUE;//假设能消除//验证假设for (int i = 0; i < 10; i++) //10列{if (shiKuai[xh][i] == 0){can = FALSE; //假设不成立break;}}if (can == TRUE){count++;//消除行:整体向下一行for (int h = xh - 1; h >= 0; h--){for (int k = 0; k < 10; k++){shiKuai[h + 1][k] = shiKuai[h][k];//覆盖下一行shiKuai[h][k] = 0;}}}}return count;
}
/*更新得分*/
void updateScore(int lines)
{switch (lines){case 1:score += 20;level++;break;case 2:score += 50;level++;break;case 3:score += 100;level++;break;case 4:score += 150;level++;break;case 5:score += 200;level++;break;}if (lines >= 6){score +=200;}
}_BOOL_ isOver()
{for (int k = 0; k < 8; k++){if (shiKuai[0][k] != 0){return TRUE;}}return FALSE;
}
/* 创建新落块 */
void createNewLuoKuai()
{//1方块种类随机BLOCK_TYPE bt = (BLOCK_TYPE)(rand() % 7);//2方块颜色随机color = rand() % 10 + 1;switch (bt){case L:luoKuai[0][3] = luoKuai[1][3] = luoKuai[2][3] =luoKuai[2][4]= color;break;case Z:luoKuai[0][3] = luoKuai[0][4] = luoKuai[1][4] = luoKuai[1][5] = color;break;case TIAN:luoKuai[0][3] = luoKuai[0][4] = luoKuai[1][3] = luoKuai[1][4] = color;break;case T:luoKuai[0][3] = luoKuai[0][4] = luoKuai[1][4] = luoKuai[0][5] = color;break;case I:luoKuai[0][3] = luoKuai[1][3] = luoKuai[2][3] = luoKuai[3][3] = color;break;case YI:luoKuai[0][3] = luoKuai[0][4] = luoKuai[0][5] = luoKuai[0][6] = color;break;case J:luoKuai[0][4] = luoKuai[1][4] = luoKuai[2][3] = luoKuai[2][4] = color;break;}}void gameover()
{stop = TRUE;
}

date_type.h

#pragma once
//创建逻辑布尔类型
#define TRUE 1
#define FALSE 0
typedef int _BOOL_;//枚举类型:方块样式
typedef 
enum block_type { L,Z,TIAN,T,I,YI,J } BLOCK_TYPE;

 game_function.h

#pragma once
#include "date_type.h"
#include "global_var.h"
//功能模块/*左移动*/
void leftMove();
/**/
_BOOL_ leftNotOut();
/*左不阻挡*/
_BOOL_ leftNotStop();/*右移动*/
void rightMove();
/*右*/
_BOOL_ rightNotOut();
/*右不阻挡*/
_BOOL_ rightNotStop();
/*下移动*/
void downMove();/*下*/
_BOOL_ downNotOut();
/*下不阻挡*/
_BOOL_ downNotStop();/*合并*/
void merge();
/*消除行返回消除的行数
*/
int clearLine();
/*更新得分
lines:消除的行数*/
void updateScore(int lines);_BOOL_ isOver();
/*创建新方块*/
void createNewLuoKuai();void gameover();

global_var.h

#pragma once
#include "game_function.h"
#include"date_type.h"
//集中管理全局变量声明 共享使用
extern int luoKuai[20][10];//下落的方块
extern int shiKuai[20][10];//落实不动的方块
extern int color;
extern int stop;//是否停止游戏
extern int score;
extern int level;

图片文件:

 

 

EasyX游戏框架:

#define _CRT_SECURE_NO_WARNINGS 1
#include <easyx.h>
#include <time.h>
#include <conio.h>
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<string>
#include<graphics.h>/*游戏界面绘制*/
void gamePaint();
/*游戏初始化绘制*/
void gameInit();
/*游戏定时处理*/
void gameInterval();
/*游戏键盘按下*/
void gameKeypress(int key);
/*游戏鼠标按下*/
void gameMouseDown(int mouseX,int mouseY);
/*游戏鼠标右键按下*/
void gameMouseRightDown(int mouseX,int mouseY);
/*游戏鼠标抬起*/
void gameMouseUp(int mouseX,int mouseY);
/*游戏鼠标移动*/
void gameMousemove(int mouseX,int mouseY);/*
含透明的图的绘制
x为要载入图片的X坐标,y为Y坐标
*/
void drawImage(int  picture_x, int picture_y,IMAGE* picture);  
/*调整图片透明度角度转弧度:PI/180*角度弧度转角度:180/PI*弧度
*/
void drawImageAlpha(int x0, int y0, IMAGE* img, double f);
/*两个矩形碰撞检测
即两个矩形是否相交。x1, y1, w1, h1是第一个矩形的xy宽高的四个参数x2, y2, w2, h2是第二个矩形的xy宽高的四个参数返回0代表不相交 返回1代表相交
*/
int testHit(int x1,int y1,int w1,int h1,int x2,int y2,int w2,int h2 );/*设置100即每隔100毫秒刷新以下界面绘图。*/
int interval = 100;//TODO: 1 设置定时器时间间隔(单位毫秒)
// TODO: 1 设置窗口: 宽度 高度
int screenWidth = 800;
int screenHeight=600;
int stop = 0;//是否停止游戏
//-----------------------------------//
int times = 0; 
/*初始化游戏 */
void initgame()
{srand((unsigned)time(NULL));//随机数初始化setbkcolor(NULL);//背景色setbkmode(TRANSPARENT);// 设置背景混合模式: TRANSPARENT为透明gameInit();
}
/*界面绘图演示案例
*//*绘制显示游戏界面*/
void paint()
{BeginBatchDraw();//打开双缓冲cleardevice();// 清屏gamePaint();//-----------------------------//EndBatchDraw();//关闭双缓冲
}/*游戏运行*/
void run()
{ExMessage msg ;//ExMessage key;while (1)	// 游戏主循环  可借助break 结束循环{if (peekmessage(&msg,-1,true)){switch (msg.message){case WM_MOUSEMOVE://鼠标移动gameMousemove(msg.x, msg.y);break;case WM_LBUTTONDOWN://左键按下gameMouseDown(msg.x, msg.y);break;case WM_LBUTTONUP://左键抬起gameMouseUp(msg.x, msg.y);break;case WM_LBUTTONDBLCLK://左键双击break;case WM_RBUTTONDOWN://右键按下break;case WM_RBUTTONUP://右键抬起gameMouseRightDown(msg.x, msg.y);break;case WM_RBUTTONDBLCLK://右键双击break;case WM_KEYDOWN:gameKeypress(msg.vkcode);break;}paint();continue;}//------时间处理 勿动-----------//Sleep(1);times++;if(times%(interval/10)!=0){continue;}times=0;if(stop){break;}gameInterval();//-------------------------------//paint();// 刷新显示游戏界面}
}/*绘制透明背景图*/void drawImage(int  picture_x, int picture_y,IMAGE* picture  ) //x为载入图片的X坐标,y为Y坐标
{// 变量初始化DWORD *dst = GetImageBuffer();    // GetImageBuffer()函数,用于获取绘图设备的显存指针,EASYX自带DWORD *draw = GetImageBuffer(); DWORD *src = GetImageBuffer(picture); //获取picture的显存指针int picture_width = picture->getwidth(); //获取picture的宽度,EASYX自带int picture_height = picture->getheight(); //获取picture的高度,EASYX自带int graphWidth = getwidth();       //获取绘图区的宽度,EASYX自带int graphHeight = getheight();     //获取绘图区的高度,EASYX自带int dstX = 0;    //在显存里像素的角标// 实现透明贴图 公式: Cp=αp*FP+(1-αp)*BP , 贝叶斯定理来进行点颜色的概率计算for (int iy = 0; iy < picture_height; iy++){for (int ix = 0; ix < picture_width; ix++){int srcX = ix + iy * picture_width; //在显存里像素的角标int sa = ((src[srcX] & 0xff000000) >> 24); //0xAArrggbb;AA是透明度int sr = ((src[srcX] & 0xff0000) >> 16); //获取RGB里的Rint sg = ((src[srcX] & 0xff00) >> 8);   //Gint sb = src[srcX] & 0xff;              //Bif (ix >= 0 && ix <= graphWidth && iy >= 0 && iy <= graphHeight && dstX <= graphWidth * graphHeight){dstX = (ix + picture_x )+ (iy +   picture_y ) * graphWidth; //在显存里像素的角标if (dstX<0) continue;int dr = ((dst[dstX] & 0xff0000) >> 16);int dg = ((dst[dstX] & 0xff00) >> 8);int db = dst[dstX] & 0xff;draw[dstX] = ((sr * sa / 255 + dr * (255 - sa) / 255) << 16)  //公式: Cp=αp*FP+(1-αp)*BP  ; αp=sa/255 , FP=sr , BP=dr| ((sg * sa / 255 + dg * (255 - sa) / 255) << 8)         //αp=sa/255 , FP=sg , BP=dg| (sb * sa / 255 + db * (255 - sa) / 255);              //αp=sa/255 , FP=sb , BP=db}}}
}
/*调整图片透明度*/
void drawImageAlpha(int x0, int y0, IMAGE* img, double f)
{//获得图片尺寸int qwidth, qheight;qwidth = img->getwidth();qheight = img->getheight();//P图为背景图,RS为目标图片static IMAGE RS(qwidth, qheight);static IMAGE P(qwidth, qheight);//背景图的绘制getimage(&P, x0, y0, qwidth, qheight);//获取指针,作为透明度计算DWORD* M = GetImageBuffer(&P);DWORD* N = GetImageBuffer(img);DWORD* R = GetImageBuffer(&RS);// 开启批量绘图模式,解决闪烁问题BeginBatchDraw();//计算与赋值int i, j;for (i = 0; i < qheight; i++) {for (j = 0; j < qwidth; j++) {int r, g, b;int ij;//计算ij = i * qwidth + j;r = (int)((GetRValue(N[ij])) * (1 - f) + GetRValue(M[ij]) * f);g = (int)((GetGValue(N[ij])) * (1 - f) + GetGValue(M[ij]) * f);b = (int)((GetBValue(N[ij])) * (1 - f) + GetBValue(M[ij]) * f);R[ij] = RGB(r, g, b);}}//贴出图片并释放内存putimage(x0, y0, &RS);FlushBatchDraw();// 绘制
}
//检测两个矩形是否相碰撞
int testHit(int x1,int y1,int w1,int h1,int x2,int y2,int w2,int h2 )
{return !(x1 + w1 < x2||y1 + h1 < y2 ||x2 + w2 <x1 ||y2 + h2<y1 );
}
// 主函数,开启游戏
int main  ()
{initgraph(screenWidth, screenHeight,SHOWCONSOLE);		initgame();					// 初始化游戏paint();// 刷新显示游戏界面flushmessage();		// 清空鼠标缓冲区while (_kbhit()) _getch();	// 清空键盘缓冲区run();						// 开始游戏closegraph();//关闭图形环return 0;
}//--------------------------------// 
//TODO: 2 全局变量声明位置 //TODO: 3 游戏初始化位置  void gameInit()
{}//TODO: 4 绘图处理位置  
void gamePaint()
{}//TODO: 5 定时处理位置
void gameInterval()
{}
//TODO: 6 处理键盘控制位置
void gameKeypress(int key)
{switch (key ){case VK_LEFT:printf("按 左\n");break;case VK_RIGHT:printf("按 右\n");break;case VK_UP:printf("按 上\n");break;case VK_DOWN:printf("按 下\n");break;}switch (key ){case 'A':case 'a':printf("按 A\n");break;case 'B':case 'b':printf("按 B\n");break;case 'c':case 'C':printf("按 C\n");break;case 'D':case 'd':printf("按 d\n");break;}
}//TODO: 7 处理鼠标控制位置
void gameMouseDown(int mouseX,int mouseY)
{printf("按下鼠标左键\n");}
void gameMouseUp(int mouseX,int mouseY)
{}
void gameMousemove (int mouseX,int mouseY)
{}void gameMouseRightDown(int mouseX,int mouseY)
{}

大家的点赞、收藏、关注将是我更新的最大动力!欢迎留言或私信建议或问题。
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!


http://chatgpt.dhexx.cn/article/HkmoUgIb.shtml

相关文章

c语言俄罗斯方块程序设计论文,c语言俄罗斯方块游戏程序设计报告

c语言俄罗斯方块游戏程序设计报告 俄罗斯方块程序设计报告 2018-7-1511 计本(2)班 卢文俊C 语言课程设计报告主标题&#xff1a; C 语言课程设计 副标题&#xff1a; 俄罗斯方块游戏 ----界面设计姓 名&#xff1a; 卢文俊 指导教师&#xff1a; 刘慧 院 系&#xff1a; 信息工…

【C语言程序设计】开源俄罗斯方块的代码的改进以及分析

实验二 数据类型运算符与表达式 实验三 选择结构程序设计 实验四 循环结构序设计 实验五 数组和字符串 实验六 函数 实验七 指针 实验八 结构体与文件读写 结课实验 俄罗斯方块小游戏 目录 前言 核心代码解析 1.定位程序 2.页面设计 3.文本读写 4.隐藏光标 结语 前言 这…

俄罗斯方块—C语言

思路&#xff1a; 1.初始化界面&#xff0c;用一个矩阵来保存界面的每一个位置&#xff0c;包括颜色跟数值&#xff0c;数值用来区分是墙还是方块还是空格&#xff0c;便于运行时的判断。 2.初始化方块&#xff0c;用4*4矩阵保存&#xff0c;1表示方块&#xff0c;0表示空格。…

俄罗斯方块c语言代码及注释,C语言代码实现俄罗斯方块

这里为大家敲写一段怎样用C语言实现俄罗斯方块: 首先推荐大家使用CodeBlocks这个软件,方便添加不同的工程。 代码中有很多注释便于理解! 下面是效果图和全部的代码以及注释,大家可以观看并自己新增内容! 1、首先是main.c文件: #include #include #include "game.h…

【C语言】百行代码实现—俄罗斯方块

文章目录 自述整体框架和流程开始游戏页面设计游戏设计流程介绍 注意可执行源码-全部 自述 这个代码是19年的末尾写的&#xff0c;最近就想着想把这个用博客分享出来&#xff0c;一方面是为了巩固自己的知识&#xff0c;另一方面也希望同学们能够因为这篇文章有所收获&#xf…

两张图片告诉你 载波聚合为4G加速的原因

描述 2015年被业界认为是LTE-A的规模商用元年&#xff0c;说到底&#xff0c;是载波聚合的规模商用。载波聚合作为LTE-A的关键技术之一&#xff0c;通过将两个或两个以上的载波&#xff08;Component Carrier&#xff0c;CC&#xff09;汇聚在一起&#xff0c;从而将分散的频谱…

LTE-A载波聚合技术(3)---L1/L2映射方案

1.5 L1/L2映射 1.5.1 NTT DOCOMO和Panasonic方案 DOCOMO和Panasonic提出的建议基本上是一样的&#xff0c;大体上可以分为3种&#xff1a; Option 1&#xff1a;每个CC一个TB和一个HARQ实体&#xff1b; Option 2&#xff1a;所有聚合的CC一个TB和一个HARQ实体&#xff1b; O…

LTE、NR载波聚合(CA)-- 等级划分

LTE、NR载波聚合(CA)-- 等级划分 一、LTE载波聚合等级划分:LTE根据载波对应的RB数命名 LTE CA信道参考3GPP TS 36.508 举个例子,“DC_3C-n78A”这个组合,就代表B3和n78这两个频段间的聚合,其中B3的频段内聚合等级为C,就表示2个LTE B3的带内聚合,且RB数量在100到200…

4G时代 载波聚合——用户、网络双受益

1、序言 2013下半年以来&#xff0c;载波聚合成为为先行LTE运营商网络演进的重点方向。进入2014年&#xff0c;随着爱立信与澳洲电讯宣布完成20MHz 20MHz载波聚合演示&#xff0c;韩国SK电信宣布年内商用20MHz 10MHz 10MHz三频段载波聚合&#xff0c;可以期待LTE商用网络的下…

[4G5G专题-12]:功能-LTE载波聚合CA对空口协议栈的影响概述

目录 1. LTE空口协议栈 2. 载波聚合对空口协议栈影响 2.1 载波聚合对空口协议栈影响的总体架构 2.2 L3 RRC层影响 2.3 L2 PDCP层影响 2.4 L2 RLC层影响 2.5 L2 MAC层影响 2.6 L1 PHY层影响 2.7 L0 Radio层影响 1. LTE空口协议栈 L0 RF: 负责模数转换、射频调制、无线…

【移动通信】4G载波聚合

载波聚合 Carrier Aggregation&#xff08;CA&#xff09; 根据香农定理&#xff0c;网速受限于带宽&#xff0c;载波聚合最早在3GPP R10版本提出。因为运营商的频谱比较碎&#xff0c;在低频段难以找到合适的大带宽&#xff0c;因此通过载波聚合将多个载波聚合成一个更宽的频…

4G+、VoLTE、载波聚合到底是啥?

原文地址&#xff1a;http://news.zol.com.cn/561/5613290.html 2016年来到了&#xff0c;运营商将普遍进入到4G时代&#xff0c;4G就是比4G还快的意思&#xff0c;下载速率可达300M。这个“”的帽子并不能乱戴&#xff0c;必须得应用了两个新技术才可称为4G&#xff0c;这两个…

基于MATLAB的LTEA载波聚合算法仿真

目录 一、理论基础 二、案例背景 1.问题描述 2.思路流程 三、部分MATLAB仿真 四、仿真结论分析 五、参考文献 一、理论基础 在非连续载波聚合( 高频低频) 场景下&#xff0c;载波衰减特性不同&#xff0c;聚合的载波有不同的覆盖范围&#xff0c;使得不同用户可调度的载…

LTE-A载波聚合技术(1)---载波聚合的技术特征、分类、仿真场景

1 技术特征 1.1 Carrier Aggregation概述 为了支持LTE-A达到100MHz的系统带宽的要求&#xff0c;3GPP在#53bis会议上提出了载波聚合。所谓载波聚合&#xff0c;就是LTE-A为了支持下行传输带宽超过20MHz聚合两个或者更多的成分载波&#xff08;component carrier&#xff09;。…

载波聚合CA

为什么需要载波聚合&#xff1f; 一般来说&#xff0c;要提升网速或者容量&#xff0c;有下面几个思路&#xff1a; 建更多的基站&#xff1a;这样一来同一个基站下抢资源的人就少了&#xff0c;网速自然就上去了。但缺点是投入太大了&#xff0c;运营商肯定不会做亏本的买卖…

CA(载波聚合)

文章目录 CA基本概念1. CA分类2. Pcell、Scell以及Serving CellPcell&#xff08;Primary Cell&#xff09;Scell&#xff08;Secondary Cell&#xff09; 3. Pcell、Scell部署场景场景1场景2场景3场景4 4. CA的协议控制4.1 Camping/Connetion Establishment:4.2 CC Management…

通俗说法+专业解释,载波聚合

通俗说法专业解释&#xff0c;载波聚合那些事全明白 发布时间&#xff1a;2016-05-19 13:36:30 来源&#xff1a;RF技术社区 (http://rf.eefocus.com) 标签&#xff1a;传输带宽载波聚合&#xff08;CA&#xff09;LTE频段 导读&#xff1a;随着LTE深入发展&#xff0c;用户…

载波聚合

一.为什么要进行载波聚合&#xff1f; lte中最大带宽是20M&#xff08;100个PRB&#xff09;,该小区下ue能获得速率是有限的&#xff08;LTE_FDD上行理想状态下75Mbps左右&#xff0c;而下行理想状态在175Mbps&#xff08;注&#xff1a;后面我会专门一篇文章计算LTE_TDD&#…

载波聚合(CA)

载波聚合(CA) 1. 载波聚合目的 为了满足LTE-A下行峰速1 Gbps&#xff0c;上行峰速500 Mbps的要求&#xff0c;需要提供最大100 MHz的传输带宽&#xff0c;但由于这么大带宽的连续频谱的稀缺&#xff0c;LTE-A提出了载波聚合&#xff08;Carrier Aggregation&#xff0c;CA&…

载波聚合(CA)-carrier aggregation

1 为什么需要载波聚合&#xff1f; 一般来说&#xff0c;要提升网速或者容量&#xff0c;有下面几个思路&#xff1a; 建更多的基站&#xff1a;这样一来同一个基站下抢资源的人就少了&#xff0c;网速自然就上去了。但缺点是投入太大了&#xff0c;运营商肯定不会做亏本的买…