每天一个C语言的小项目,提高你的编程能力!
俄罗斯方块是经典的童年游戏~ ~
由小方块组成的不同形状的方块一个接一个地从屏幕顶部落下,玩家可以通过调整方块的位置和方向,让它们在屏幕底部拼出一个或几个棋子。这些完整的横条会立刻消失,为新掉落的盘子空腾出空间,同时玩家会获得积分奖励。没有被消除的块继续堆积。一旦它们到达屏幕顶部,玩家就输了,游戏结束。
这次是用C语言实现的!这个程序没有在界面上做任何额外的修改,而是侧重于游戏手感和消息处理过程。游戏手感上做了一些细节处理,仔细体验。
效果如图所示:
还增加了按键操作功能:& # 34;一& # 34;向左移动一格;"D & # 34向右移动一格;"W & # 34旋转正方形;s下移一格;空让盒子掉到最后),& # 34;ESC & # 34Jian退出游戏,用户也可以根据自己自定义的按钮操作游戏。
编译环境:Visual Studio 2019/2022,EasyX插件。
代码展示:
#include <stdio.h>#include <graphics.h>#include <conio.h>#include <time.h>/////////////////////////////////////////////// 定义常量、枚举量、结构体、全局变量/////////////////////////////////////////////#defineWIDTH10// 游戏区宽度#defineHEIGHT22// 游戏区高度#defineUNIT20// 每个游戏区单位的实际像素// 定义操作类型enum CMD{CMD_ROTATE,// 方块旋转CMD_LEFT, CMD_RIGHT, CMD_DOWN,// 方块左、右、下移动CMD_SINK,// 方块沉底CMD_QUIT// 退出游戏};// 定义绘制方块的方法enum DRAW{SHOW,// 显示方块CLEAR,// 擦除方块FIX// 固定方块};// 定义七种俄罗斯方块struct BLOCK{WORD dir[4];// 方块的四个旋转状态COLORREF color;// 方块的颜色};BLOCK g_Blocks[7] = {{0x0F00, 0x4444, 0x0F00, 0x4444, RED},// I{0x0660, 0x0660, 0x0660, 0x0660, BLUE},// 口{0x4460, 0x02E0, 0x0622, 0x0740, MAGENTA},// L{0x2260, 0x0E20, 0x0644, 0x0470, YELLOW},// 反 L{0x0C60, 0x2640, 0x0C60, 0x2640, CYAN},// Z{0x0360, 0x4620, 0x0360, 0x4620, GREEN},// 反 Z{0x4E00, 0x4C40, 0x0E40, 0x4640, BROWN}};// T// 定义当前方块、下一个方块的信息struct BLOCKINFO{byte id;// 方块 IDchar x, y;// 方块在游戏区中的坐标byte dir:2;// 方向}g_CurBlock, g_NextBlock;// 定义游戏区BYTE g_World[WIDTH][HEIGHT] = {0};/////////////////////////////////////////////// 函数声明/////////////////////////////////////////////void Init();// 初始化游戏void Quit();// 退出游戏void NewGame();// 开始新游戏void GameOver();// 结束游戏CMD GetCmd();// 获取控制命令void DispatchCmd(CMD _cmd);// 分发控制命令void NewBlock();// 生成新的方块bool CheckBlock(BLOCKINFO _block);// 检测指定方块是否可以放下void DrawUnit(int x, int y, COLORREF c, DRAW _draw);// 画单元方块void DrawBlock(BLOCKINFO _block, DRAW _draw = SHOW);// 画方块void OnRotate();// 旋转方块void OnLeft();// 左移方块void OnRight();// 右移方块void OnDown();// 下移方块void OnSink();// 沉底方块/////////////////////////////////////////////// 函数定义/////////////////////////////////////////////// 主函数void main(){Init();CMD c;while(true){c = GetCmd();DispatchCmd(c);// 按退出时,显示对话框咨询用户是否退出if (c == CMD_QUIT){HWND wnd = GetHWnd();if (MessageBox(wnd, _T("您要退出游戏吗?"), _T("提醒"), MB_OKCANCEL | MB_ICONQUESTION) == IDOK)Quit();}}}// 初始化游戏void Init(){initgraph(640, 480);srand((unsigned)time(NULL));setbkmode(TRANSPARENT);// 设置图案填充的背景色为透明// 显示操作说明settextstyle(14, 0, _T("宋体"));outtextxy(20, 330, _T("操作说明"));outtextxy(20, 350, _T("上:旋转"));outtextxy(20, 370, _T("左:左移"));outtextxy(20, 390, _T("右:右移"));outtextxy(20, 410, _T("下:下移"));outtextxy(20, 430, _T("空格:沉底"));outtextxy(20, 450, _T("ESC:退出"));// 设置坐标原点setorigin(220, 20);// 绘制游戏区边界rectangle(-1, -1, WIDTH * UNIT, HEIGHT * UNIT);rectangle((WIDTH + 1) * UNIT – 1, -1, (WIDTH + 5) * UNIT, 4 * UNIT);// 开始新游戏NewGame();}// 退出游戏void Quit(){closegraph();exit(0);}// 开始新游戏void NewGame(){// 清空游戏区setfillcolor(BLACK);solidrectangle(0, 0, WIDTH * UNIT – 1, HEIGHT * UNIT – 1);ZeroMemory(g_World, WIDTH * HEIGHT);// 生成下一个方块g_NextBlock.id = rand() % 7;g_NextBlock.dir = rand() % 4;g_NextBlock.x = WIDTH + 1;g_NextBlock.y = HEIGHT – 1;// 获取新方块NewBlock();}// 结束游戏void GameOver(){HWND wnd = GetHWnd();if (MessageBox(wnd, _T("游戏结束。\n您想重新来一局吗?"), _T("游戏结束"), MB_YESNO | MB_ICONQUESTION) == IDYES)NewGame();elseQuit();}// 获取控制命令DWORD m_oldtime;CMD GetCmd(){// 获取控制值while(true){// 如果超时,自动下落一格DWORD newtime = GetTickCount();if (newtime – m_oldtime >= 500){m_oldtime = newtime;return CMD_DOWN;}// 如果有按键,返回按键对应的功能if (_kbhit()){switch(_getch()){case 'w':case 'W':return CMD_ROTATE;case 'a':case 'A':return CMD_LEFT;case 'd':case 'D':return CMD_RIGHT;case 's':case 'S':return CMD_DOWN;case 27:return CMD_QUIT;case ' ':return CMD_SINK;case 0:case 0xE0:switch(_getch()){case 72:return CMD_ROTATE;case 75:return CMD_LEFT;case 77:return CMD_RIGHT;case 80:return CMD_DOWN;}}}// 延时 (降低 CPU 占用率)Sleep(20);}}// 分发控制命令void DispatchCmd(CMD _cmd){switch(_cmd){case CMD_ROTATE:OnRotate();break;case CMD_LEFT:OnLeft();break;case CMD_RIGHT:OnRight();break;case CMD_DOWN:OnDown();break;case CMD_SINK:OnSink();break;case CMD_QUIT:break;}}// 生成新的方块void NewBlock(){g_CurBlock.id = g_NextBlock.id,g_NextBlock.id = rand() % 7;g_CurBlock.dir = g_NextBlock.dir,g_NextBlock.dir = rand() % 4;g_CurBlock.x = (WIDTH – 4) / 2;g_CurBlock.y = HEIGHT + 2;// 下移新方块直到有局部显示WORD c = g_Blocks[g_CurBlock.id].dir[g_CurBlock.dir];while((c & 0xF) == 0){g_CurBlock.y–;c >>= 4;}// 绘制新方块DrawBlock(g_CurBlock);// 绘制下一个方块setfillcolor(BLACK);solidrectangle((WIDTH + 1) * UNIT, 0, (WIDTH + 5) * UNIT – 1, 4 * UNIT – 1);DrawBlock(g_NextBlock);// 设置计时器,用于判断自动下落m_oldtime = GetTickCount();}// 画单元方块void DrawUnit(int x, int y, COLORREF c, DRAW _draw){// 计算单元方块对应的屏幕坐标int left = x * UNIT;int top = (HEIGHT – y – 1) * UNIT;int right = (x + 1) * UNIT – 1;int bottom = (HEIGHT – y) * UNIT – 1;// 画单元方块switch(_draw){case SHOW:// 画普通方块setlinecolor(0x006060);roundrect(left + 1, top + 1, right – 1, bottom – 1, 5, 5);setlinecolor(0x003030);roundrect(left, top, right, bottom, 8, 8);setfillcolor(c);setlinecolor(LIGHTGRAY);fillrectangle(left + 2, top + 2, right – 2, bottom – 2);break;case FIX:// 画固定的方块setfillcolor(RGB(GetRValue(c) * 2 / 3, GetGValue(c) * 2 / 3, GetBValue(c) * 2 / 3));setlinecolor(DARKGRAY);fillrectangle(left + 1, top + 1, right – 1, bottom – 1);break;case CLEAR:// 擦除方块setfillcolor(BLACK);solidrectangle(x * UNIT, (HEIGHT – y – 1) * UNIT, (x + 1) * UNIT – 1, (HEIGHT – y) * UNIT – 1);break;}}// 画方块void DrawBlock(BLOCKINFO _block, DRAW _draw){WORD b = g_Blocks[_block.id].dir[_block.dir];int x, y;for(int i = 0; i < 16; i++, b <<= 1)if (b & 0x8000){x = _block.x + i % 4;y = _block.y – i / 4;if (y < HEIGHT)DrawUnit(x, y, g_Blocks[_block.id].color, _draw);}}// 检测指定方块是否可以放下bool CheckBlock(BLOCKINFO _block){WORD b = g_Blocks[_block.id].dir[_block.dir];int x, y;for(int i = 0; i < 16; i++, b <<= 1)if (b & 0x8000){x = _block.x + i % 4;y = _block.y – i / 4;if ((x < 0) || (x >= WIDTH) || (y < 0))return false;if ((y < HEIGHT) && (g_World[x][y]))return false;}return true;}// 旋转方块void OnRotate(){// 获取可以旋转的 x 偏移量int dx;BLOCKINFO tmp = g_CurBlock;tmp.dir++;if (CheckBlock(tmp)){dx = 0;goto rotate;}tmp.x = g_CurBlock.x – 1;if (CheckBlock(tmp)){dx = -1;goto rotate;}tmp.x = g_CurBlock.x + 1;if (CheckBlock(tmp)){dx = 1;goto rotate;}tmp.x = g_CurBlock.x – 2;if (CheckBlock(tmp)){dx = -2;goto rotate;}tmp.x = g_CurBlock.x + 2;if (CheckBlock(tmp)){dx = 2;goto rotate;}return;rotate:// 旋转DrawBlock(g_CurBlock, CLEAR);g_CurBlock.dir++;g_CurBlock.x += dx;DrawBlock(g_CurBlock);}// 左移方块void OnLeft(){BLOCKINFO tmp = g_CurBlock;tmp.x–;if (CheckBlock(tmp)){DrawBlock(g_CurBlock, CLEAR);g_CurBlock.x–;DrawBlock(g_CurBlock);}}// 右移方块void OnRight(){BLOCKINFO tmp = g_CurBlock;tmp.x++;if (CheckBlock(tmp)){DrawBlock(g_CurBlock, CLEAR);g_CurBlock.x++;DrawBlock(g_CurBlock);}}// 下移方块void OnDown(){BLOCKINFO tmp = g_CurBlock;tmp.y–;if (CheckBlock(tmp)){DrawBlock(g_CurBlock, CLEAR);g_CurBlock.y–;DrawBlock(g_CurBlock);}elseOnSink();// 不可下移时,执行“沉底方块”操作}// 沉底方块void OnSink(){int i, x, y;// 连续下移方块DrawBlock(g_CurBlock, CLEAR);BLOCKINFO tmp = g_CurBlock;tmp.y–;while (CheckBlock(tmp)){g_CurBlock.y–;tmp.y–;}DrawBlock(g_CurBlock, FIX);// 固定方块在游戏区WORD b = g_Blocks[g_CurBlock.id].dir[g_CurBlock.dir];for(i = 0; i < 16; i++, b <<= 1)if (b & 0x8000){if (g_CurBlock.y – i / 4 >= HEIGHT){// 如果方块的固定位置超出高度,结束游戏GameOver();return;}elseg_World[g_CurBlock.x + i % 4][g_CurBlock.y – i / 4] = 1;}// 检查是否需要消掉行,并标记BYTE remove = 0;// 低 4 位用来标记方块涉及的 4 行是否有消除行为for(y = g_CurBlock.y; y >= max(g_CurBlock.y – 3, 0); y–){i = 0;for(x = 0; x < WIDTH; x++)if (g_World[x][y] == 1)i++;if (i == WIDTH){remove |= (1 << (g_CurBlock.y – y));setfillcolor(LIGHTGREEN);setlinecolor(LIGHTGREEN);setfillstyle(BS_HATCHED, HS_DIAGCROSS);fillrectangle(0, (HEIGHT – y – 1) * UNIT + UNIT / 2 – 5, WIDTH * UNIT – 1, (HEIGHT – y – 1) * UNIT + UNIT / 2 + 5);setfillstyle(BS_SOLID);}}if (remove)// 如果产生整行消除{// 延时 300 毫秒Sleep(300);// 擦掉刚才标记的行IMAGE img;for(i = 0; i < 4; i++, remove >>= 1){if (remove & 1){for(y = g_CurBlock.y – i + 1; y < HEIGHT; y++)for(x = 0; x < WIDTH; x++){g_World[x][y – 1] = g_World[x][y];g_World[x][y] = 0;}getimage(&img, 0, 0, WIDTH * UNIT, (HEIGHT – (g_CurBlock.y – i + 1)) * UNIT);putimage(0, UNIT, &img);}}}// 产生新方块NewBlock();}
大家赶紧去动手试试吧!# include & ltstdio.h & gt# include & ltgraphics.h & gt# include & ltconio.h & gt# include & lttime.h & gt//////////////////////////////////////////定义常量、枚举器、结构、全局变量。游戏区高度#defineUNIT20//每个游戏区单元的实际像素//定义操作类型enum CMD{CMD_ROTATE,//旋转盒子CMD_LEFT,CMD_RIGHT,CMD_DOWN,//移动盒子CMD_SINK,//左右下,//退出游戏};//定义绘制一个框的方法enum DRAW{SHOW,//显示框清除,//擦除框修复//修复框};//定义七种俄罗斯方块结构块{ WORD dir[4];//正方形COLORREF颜色的四个旋转状态;//框的颜色};Block g _ blocks [7] = {{0x0f00,0x4444,0x0f00,0x4444,red},//i {0x0060,0x0060,0x 060,蓝色},//port {0x4460,0x02e0,0x。//L {0x2260,0x0E20,0x0644,0x0470,黄色},//R L {0x0C60,0x2640,0x0C60,0x2640,青色},//Z {0x0360,0x4620,0x0360,0x440。// T//定义当前块和下一块的信息{ byteid//box IDchar x,y;//盒子在游戏区的坐标是byte dir:2;//direction }g_CurBlock,g _ NextBlock//定义游戏区域字节g _ World[WIDTH][HEIGHT]= { 0 };/////////////////////////////////////////////////////////函数声明。//初始化游戏void Quit();//退出游戏void new game();//开始新游戏void game over();//结束游戏CMD get CMD();//获取控制命令void dispatch CMD(CMD _ CMD);//分发控制命令void new block();//生成新的块bool check block(block info _ block);//检测void draw单元(int x,int y,colorref c,draw _ draw)是否能在指定的框中放下;//绘制一个单元框void draw block (block info _ block,draw _ draw = show);//在Rotate()上画一个方形的void//旋转方形void on left();//将void OnRight()框向左移动;//将void OnDown()框向右移动;//下移框void OnSink();//沉箱/////////////////////////////////////////////////////CMD c;while(true){ c = get cmd();dispatch cmd(c);//按Exit时会显示一个对话框,询问用户是否退出if(c = = cmd _ quit){ hwnd wnd = gethwnd();if (MessageBox(wnd,_ T(& # 34;你想退出游戏吗?")、_ T(& # 34;提醒& # 34;),MB _ ok cancel | MB _ icon question)= = IDOK)Quit();} } }//初始化游戏void Init(){initgraph(640,480);srand((无符号)时间(空));setbkmode(透明);//将影线的背景色设置为透明//显示操作指令settextstyle(14,0,_ T(& # 34;宋体& # 34;));outtextxy(20,330,_ T(& # 34;操作说明& # 34;));outtextxy(20,350,_ T(& # 34;顶部:旋转& # 34;));outtextxy(20,370,_ T(& # 34;左:向左移动& # 34;));outtextxy(20,390,_ T(& # 34;右:向右移动& # 34;));outtextxy(20,410,_ T(& # 34;向下:向下移动& # 34;));outtextxy(20,430,_ T(& # 34;空网格:水槽底部& # 34;));outtextxy(20,450,_ T(& # 34;ESC:退出& # 34;));//设置坐标原点setorigin(220,20);//绘制游戏区域的矩形(-1,-1,宽度*单位,高度*单位);矩形((宽度+ 1) *单位- 1,-1,(宽度+ 5) *单位,4 *单位);//启动一个new game new game();}//退出游戏void Quit(){ closegraph();退出(0);}//开始新游戏void NewGame(){// Clear 空游戏区setfillcolor(黑色);solidrectangle(0,0,宽度*单位- 1,高度*单位-1);ZeroMemory(g_World,WIDTH * HEIGHT);//生成下一个块g _ next block . id = rand()% 7;g _ next block . dir = rand()% 4;g_NextBlock.x =宽度+1;g _ next block . y = HEIGHT-1;//获取new block new block();}//结束游戏void game over(){ HWND wnd = GetHWnd();if (MessageBox(wnd,_ T(& # 34;游戏结束。\ n您想再玩一次吗?")、_ T(& # 34;游戏结束& # 34;),MB _ yes no | MB _ icon question)= = IDYES)new game();else quit();}//获取控制命令DWORD m _ oldtimeCMD GetCmd(){//获取控件值while(true){//如果超时,自动丢弃一个网格DWORD new time = GetTickCount();if(new time-m _ old time & gt;= 500){ m _ old time = new time;返回CMD _ DOWN}//如果有键,返回函数If(_ kb hit()){ switch(_ getch()){ case & # 39;w & # 39:案例& # 39;W & # 39:返回CMD _ ROTATE案例& # 39;一& # 39;:案例& # 39;一& # 39;:返回CMD _ LEFT案例& # 39;d & # 39:案例& # 39;D & # 39:返回CMD _ RIGHT案例& # 39;s & # 39:案例& # 39;S & # 39:返回CMD _ DOWN案例27:返回CMD _ QUIT案例& # 39;':返回CMD _ SINK案例0:案例0x E0:switch(_ getch()){案例72:return CMD _ ROTATE;案例75:返回CMD _ LEFT案例77:返回CMD _ RIGHT案例80:返回CMD _ DOWN} } }//延迟(降低CPU利用率)睡眠(20);} }//分发控制命令Void dispatch cmd(cmd _ cmd){ switch(_ cmd){ case cmd _ rotate:on rotate();打破;case CMD _ LEFT:on LEFT();打破;case CMD _ RIGHT:on RIGHT();打破;case CMD _ DOWN:on DOWN();打破;case CMD _ SINK:on SINK();打破;case CMD _ QUIT:break;} }//生成一个新的正方形void new block(){ g _ curb lock . id = g _ next block . id = rand()% 7;g_CurBlock.dir = g_NextBlock.dir,g _ next block . dir = rand()% 4;g _ curb lock . x =(WIDTH-4)/2;g _ curb lock . y = HEIGHT+2;//向下移动新框,直到word c = g _ blocks [g _ curblock.id]。dir [g _ curblock.dir]部分显示;while((c & 0xF)= = 0){ g _ curb lock . y-;c & gt& gt= 4;}//绘制一个新的正方形draw block(g _ curb lock);//绘制下一个正方形setfillcolor(黑色);solidrectangle((宽度+ 1) *单位,0,(宽度+ 5) *单位- 1,4 *单位-1);draw block(g _ next block);//设置一个判断自动下降的定时器m _ old time = GetTickCount();}//绘制一个单元格框Void Draw Unit (int x,int y,colorref c,Draw _ Draw){//计算单元格框对应的屏幕坐标int left = x * UNITint top = (HEIGHT – y – 1) *单位;int right =(x+1)* UNIT-1;int bottom =(HEIGHT-y)* UNIT-1;//绘制单位正方形开关(_draw){case SHOW:// Draw普通正方形setline color(0x 006060);roundrect(左+ 1,上+ 1,右- 1,下- 1,5,5);setline color(0x 003030);roundrect(左,上,右,下,8,8);setfillcolor(c);setlinecolor(浅灰色);fillrectangle(左+ 2,上+ 2,右- 2,下-2);打破;Case FIX://绘制一个固定的正方形集合填充颜色(RGB (getRValue (c) * 2/3,getgvalue (c) * 2/3,getb value(c)* 2/3));setlinecolor(深灰色);fillrectangle(左+ 1,上+ 1,右- 1,下-1);打破;case CLEAR://Erase box setfillcolor(黑色);solidrectangle(x *单位,(高度- y – 1) *单位,(x + 1) *单位- 1,(高度- y) *单位-1);打破;} }//画一个框void draw block (block info _ block,Draw _ Draw){ word b = g _ blocks[_ block . id]。dir[_ block . dir];int x,y;for(int I = 0;我& lt16;i++,b & lt& lt= 1)if(b & 0x 8000){ x = _ block . x+I % 4;y = _ block . y-I/4;if(y & lt;HEIGHT)DrawUnit(x,y,g_Blocks[_block.id]。颜色,_ draw);} }//检测bool check block(block info _ block){ word b = g _ blocks[_ block . id]。dir [_ block.dir]可以放在指定的盒子里;int x,y;for(int I = 0;我& lt16;i++,b & lt& lt= 1)if(b & 0x 8000){ x = _ block . x+I % 4;y = _ block . y-I/4;如果((x & lt0)| |(x & gt;= WIDTH)| |(y & lt;0))返回false如果((y & ltHEIGHT) && (g_World[x][y]))返回false}返回true}//旋转正方形void OnRotate(){//获取可以旋转的x偏移量int dxBLOCKINFO tmp = g _ CurBlocktmp . dir++;if(check block(tmp)){ dx = 0;转到旋转;} tmp . x = g _ curb lock . x-1;if(check block(tmp)){ dx =-1;转到旋转;} tmp . x = g _ curb lock . x+1;if(check block(tmp)){ dx = 1;转到旋转;} tmp . x = g _ curb lock . x-2;if(check block(tmp)){ dx =-2;转到旋转;} tmp . x = g _ curb lock . x+2;if(check block(tmp)){ dx = 2;转到旋转;}返回;rotate://rotate draw block(g _ curb lock,CLEAR);g _ curb lock . dir++;g _ curb lock . x+= dx;draw block(g _ curb lock);}//将框向左移动void on left(){ block info tmp = g _ curb lock;tmp . x-;if(check block(tmp)){ draw block(g _ curb lock,CLEAR);g _ curb lock . x-;draw block(g _ curb lock);} }//将框void移到右边(){ block info tmp = g _ curblocktmp . x++;if(check block(tmp)){ draw block(g _ curb lock,CLEAR);g _ curb lock . x++;draw block(g _ curb lock);} }//下移box void on down(){ block info tmp = g _ curb lock;tmp . y-;if(check block(tmp)){ draw block(g _ curb lock,CLEAR);g _ curb lock . y-;draw block(g _ curb lock);} elseOnSink();//如果不能下移,则执行“下沉框”}//void OnSink(){int i,x,y;//连续下移box DrawBlock(g_CurBlock,CLEAR);BLOCKINFO tmp = g _ CurBlocktmp . y-;while(check block(tmp)){ g _ curb lock . y-;tmp . y-;}DrawBlock(g_CurBlock,FIX);//游戏区固定框Word b = g _ blocks [g _ curblock.id]。dir[g _ curb lock . dir];for(I = 0;我& lt16;i++,b & lt& lt= 1)if(b & 0x 8000){ if(g _ curb lock . y-I/4 & gt;= HEIGHT){//如果盒子固定位置超过高度,结束游戏game over();返回;} elseg _ World[g _ curb lock . x+I % 4][g _ curb lock . y-I/4]= 1;}//检查该行是否需要消除,标记BYTE remove = 0;//低四位用来标记盒中涉及的四行是否有for(y = g_CurBlock.y的消去行为;y & gt= max(g_CurBlock.y – 3,0);y-){ I = 0;for(x = 0;x & lt宽度;x++)if(g _ World[x][y]= = 1)i++;if(I = = WIDTH){ remove | =(1 & lt;& lt(g _ curb lock . y-y));setfillcolor(浅绿色);setlinecolor(浅绿色);setfillstyle(BS_HATCHED,HS _ diag cross);fillrectangle(0,(高度- y – 1) *单位+单位/ 2 – 5,宽度*单位- 1,(高度- y – 1) *单位+单位/2+5);setfillstyle(BS _ SOLID);}}if (remove)// If全行消除{//Sleep(300)延时300毫秒;//擦除刚刚标记的线图像imgfor(I = 0;我& lt4;i++,remove & gt& gt= 1){ if(remove & 1){ for(y = g _ curb lock . y-I+1;y & lt身高;y++)for(x = 0;x & lt宽度;x++){ g _ World[x][y-1]= g _ World[x][y];g _ World[x][y]= 0;}getimage(&img,0,0,WIDTH * UNIT,(HEIGHT-(g _ curb lock . y-I+1))* UNIT);putimage(0,UNIT,& img);} } }//生成一个new block new block();}我们去试试吧!
除此之外,我也和大家分享一下我搜集到的其他资源,从零基础开始的教程到C语言的C++项目案例,帮助你在学习C语言的道路上克服困难!
编程学习书籍分享:
编程学习视频共享:
整理分享(源代码,项目实战视频,项目笔记,基础入门教程)。最重要的是可以在群里交流,提问编程问题!
如果你对C/C++感兴趣,可以关注边肖,后台私信我:【编程通信】我们一起学习吧!可以获取一些C/C++项目学习视频资料!关键词自动回复已经设置好了,自动获取就好!