俄罗斯彩蛋图案,俄罗斯方块爱心图片
在的第一篇博文中
@ TOC
前言主要说明游戏逻辑代码的实现,直接复制粘贴代码是无法直接运行的。直接跑的话可以在下面的入口下载(0分下载)。下载后只需点击解决方案运行即可(需要按要求安装easyx),也可以去gitee查看源代码。传送门在下面。
更新时间:2022,5,18,16: 11
视频门户:门户
查看源代码:
Gitee:门户
0分可直接下载:门户
图为游戏开始界面。
游戏介绍页面:
游戏倒计时:
游戏界面
游戏失败:
鸡蛋:星星会动。
游戏BGM:
难过(拍手)
在线收听
鸡蛋BGM:迷雾
在线收听
游戏过程的所有BGM都在资源里,包括倒计时,消除,彩蛋音乐,游戏音乐。
俄罗斯方块游戏逻辑俄罗斯方块是在特定的矩形区域内运行的游戏,同时还有一个显示下一个方块的区域。获得的分数可以存储在一个变量中,然后在窗口中打印出来。所以这个时候,要完成这些基本的游戏逻辑,就需要选择一个好的图形工具,可以画方块,游戏区域和下一个方块提示。我们选择C开发的easyx图形开发库在这里实现。整个游戏开发最难的部分就是如何在地图上动态标注方块,以及
-第一步难度:1。用一个函数画出需要的窗口,设置好每一步的像素(还有一种方法是用电脑画图的方式画出来,然后直接加载到游戏里。注意加载像素和窗口的像素是一样的,这样游戏区才能显示的很漂亮:对比两张图).)这是最关键的一步,因为这里没有配置好,所有的改动都要在后面做,所以这里不花时间。
2.
1.游戏窗口
//窗口长度
#定义接口X 500
//窗口宽度
#定义接口Y 620
//游戏区域起点的横坐标
#定义GameViewX_1 10
//游戏区域起点的纵坐标
#定义游戏视图_1 10
//游戏区域终点的横坐标
#定义GameViewX_2 310
//游戏区域终点的纵坐标
#定义GameViewY_2 610
//分数显示起点横坐标。
#定义GameScoreX_1 320
//分数显示起点的纵坐标。
#定义GameScoreY_1 220
//分数显示终点的横坐标。
#定义GameScoreX_2 490
//分数显示终点的纵坐标。
#定义GameScoreY_2 380
//提示框起点横坐标
#定义GameRemindX_1 320
//提示框起点的纵坐标
#定义GameRemindY_1 10
//提示框结束横坐标
#定义GameRemindX_2 490
//提示框结束纵坐标
#定义GameRemindY _ 2 210
//操作介绍框起点横坐标
#定义GameOperaX_1 320
//操作介绍框起点的纵坐标
#定义游戏操作性_1 390
//操作介绍框的最终横坐标
#定义GameOperaX_2 490
//操作介绍框结束纵坐标
#定义游戏操作性_2 610
也可以用画图很漂亮。同图见文章开发经验。
2.游戏的欢迎界面(这里比较简单,主要是利用递归函数保持页面存在,按下按钮接受)
/*函数名:UI_WelcomeView
功能:游戏欢迎界面
参数:无
返回值:无
*/
void UI_WelcomeView()
{
initgraph(700,500);
setbkmode(透明);
putimage(0,0,begin image);
setcolor(黑色);
Settextstyle(45,0,_T(斜体));
outtextxy(150,150,欢迎游戏);
Settextstyle(18,0,_T(仿宋));
setcolor(RGB(20,20,120));
OutXXY (230,460,-按空格键开始游戏-);
Settextstyle(12,0,_T(仿宋));
setcolor(RGB(20,20,200));
Outtextxy(250,450,查看游戏描述按ESC );
while (1)
{
_ getch();
if (GetAsyncKeyState(VK空间))
{
打破;
}
else if(getaasynckeystate(vk _ escape))//游戏介绍
{
clear device();
putimage(0,0,explain image);
settextcolor(RGB(15,10,204));
Settextstyle(23,0,_T(仿宋));
OutXXY (150,70,游戏入门);
Outtextxy(50,100,俄罗斯方块是一款老少皆宜的咸宜小游戏,已经实现了);
OutXXY (50,120,由四个正方形色块组成,然后存储在一个数中);
OutXXY (50,140,在组的四个元素中,计算机随机生成七种不同的类型);
OutXXY (50,160,平方,根据电脑时钟控制在某个时间);
OutXXY (50,180,不断生成,用户根据键盘的四个方向键移动);
Textxy (50,200,左,右,下,翻转操作,暂停。);
setcolor(RGB(20,20,120));
Outtextxy(450,230,操作说明:);
OutXXY (450,260,:左移);
Outtextxy(450,290,:下移);
OutXXY (450,320,:右移);
Outtextxy(450,350,:平方旋转);
OutXXY (450,380, ESC:暂停游戏);
Settextstyle(18,0,_T(仿宋));
setcolor(RGB(20,20,120));
OutXXY (230,460,-按Tab返回主页面-);
While (1) //不按键窗口不会消失。
{
_ getch();
if (GetAsyncKeyState(VK_TAB))
{
打破;
}
}
UI _ welcome view();
}
}
}3.倒计时页面
/*函数名:UI_StartView
功能:游戏开始倒计时功能
参数:无
返回值:无
*/
void UI_StartView()
{
closegraph();
//存储num个转换字符,并保留一个“/0”,这样str[2]长度为2
char str[2]={ 0 };
//创建游戏窗口特别注意:这里的控制台窗口因为printf的第三个参数而不显示。
//而是用这个函数创建窗口时可以选择是否显示控制台initgraph(界面x,界面y,显示控制台);
initgraph(InterfaceX,InterfaceY);
//字体大小和样式
Settextstyle(30,0,_T t(仿宋));
//文本输出
Outtextxy(110,180,俄罗斯方块开始倒计时);
//加载音乐倒计时
UI _ load musct();
mciSendString(close gamerun ,NULL,0,0);
for(int num=3;num 0;数字-)
{
//整数
_itoa_s(num,str,10);
//sprintf(str, %c ,num);
outtextxy(240,480,str);
//从时间点设置播放的起点或者重复播放。
//延迟
睡眠(1000);//1-1毫秒
}
}-第二步难度:实现游戏的逻辑(按难度顺序)
1.广场实现了下降功能,
2.触边判断(包括触底,触左触右,实现最重要的触底,触右触左可以举一反三),
3.随机生成方块,并显示下一个出现的方块,
4.用什么样的数据结构来存储方块?
5.线消除的实现
1.块实现逻辑:每个块存储在一个4 * 4的数组中,总共有七种基本类型。如果每种类型需要旋转四次,那么总共有28个块,所以要构建一个三维数组。
Int Block[BLOCKTYPE][4][4](注:BLOCKTYPE宏定义为28)
其中BLOCKTYPE由rand()函数随机生成,种子为系统时间srand(time(NULL));实现了方块的存储和第一个方块的随机生成。
特别说明:可能有朋友会问,为什么有些方形的模型旋转起来都是一样的?例如,字段形状的正方形只能存储在一个数组中。为什么要做四个一模一样的?这是因为在实现块旋转逻辑时,BLOCKTYPE加1,要保持相同的BLOCKTYPE,需要在block type加1变成4的倍数时减去4,才能回到原来的block type。
代码实现:
int Block[BLOCKTYPE][4][4]=
{
//工字形正方形
{
0,1,0,0,
0,1,0,0,
0,1,0,0,
0,1,0,0,
},
{
0,0,0,0,
1,1,1,1,
0,0,0,0,
0,0,0,0,
},
{
0,1,0,0,
0,1,0,0,
0,1,0,0,
0,1,0,0,
},
{
0,0,0,0,
1,1,1,1,
0,0,0,0,
0,0,0,0,
},
//L形正方形
{
1,0,0,0,
1,0,0,0,
1,1,0,0,
0,0,0,0,
},
{
1,1,1,0,
1,0,0,0,
0,0,0,0,
0,0,0,0,
},
{
1,1,0,0,
0,1,0,0,
0,1,0,0,
0,0,0,0,
},
{
0,0,1,0,
1,1,1,0,
0,0,0,0,
0,0,0,0,
},
//T类型
{
0,0,0,0,
1,1,1,0,
0,1,0,0,
0,0,0,0,
},
{
1,0,0,0,
1,1,0,0,
1,0,0,0,
0,0,0,0,
},
{
0,1,0,0,
1,1,1,0,
0,0,0,0,
0,0,0,0,
},
{
0,1,0,0,
1,1,0,0,
0,1,0,0,
0,0,0,0,
},
//田形
{
0,0,0,0,
0,1,1,0,
0,1,1,0,
0,0,0,0,
},
{
0,0,0,0,
0,1,1,0,
0,1,1,0,
0,0,0,0,
},
{
0,0,0,0,
0,1,1,0,
0,1,1,0,
0,0,0,0,
},
{
0,0,0,0,
0,1,1,0,
0,1,1,0,
0,0,0,0,
},
//反L型
{
0,1,0,0,
0,1,0,0,
1,1,0,0,
0,0,0,0,
},
{
0,0,0,0,
1,1,1,0,
0,0,1,0,
0,0,0,0,
},
{
0,1,1,0,
0,1,0,0,
0,1,0,0,
0,0,0,0,
},
{
1,0,0,0,
1,1,1,0,
0,0,0,0,
0,0,0,0,
},
//错位类型
{
0,0,0,0,
1,1,0,0,
0,1,1,0,
0,0,0,0,
},
{
0,1,0,0,
1,1,0,0,
1,0,0,0,
0,0,0,0,
},
{
1,1,0,0,
0,1,1,0,
0,0,0,0,
0,0,0,0,
},
{
0,0,1,0,
0,1,1,0,
0,1,0,0,
0,0,0,0,
},
//防错位型
{
0,0,0,0,
0,1,1,0,
1,1,0,0,
0,0,0,0,
},
{
0,1,0,0,
0,1,1,0,
0,0,1,0,
0,0,0,0,
},
{
0,0,0,0,
0,1,1,0,
1,1,0,0,
0,0,0,0,
},
{
0,1,0,0,
0,1,1,0,
0,0,1,0,
0,0,0,0,
},
};2.正方形绘图
因为我们将游戏区域设置为20行10列(像素为600 x 300),每个正方形有30个像素,所以我们将文本大小设置为30个像素。
代码实现:
/*函数名:App_Show_Block
功能:展示盒
参数:方形类型,坐标X,Y
返回值:无
*/
void App_Show_Block(int type,int X,int Y)
{
Settextstyle(30,0,_ T( bold ));
setcolor(RGB(200,130,40));
for(int x=0;x 4;x)
for(int y=0;y 4;y)
{
if (Block[type][x][y]==1)
{
outtextxy(X y * 30,Y x * 30,);
}
}3.清空广场。
实现正方形的下降功能就是设置延时每0.3s纵坐标增加30个像素,然后正方形清除功能再画一个和背景色一样白的正方形,相当于把原来画的正方形像用脏漆刷墙一样擦掉。
/*函数名:App_Clear_Block
功能:透明方形
参数:方形类型,坐标X,Y
返回值:无
*/
void App_Clear_Block(int type,int X,int Y)
{
//与背景颜色一致
setcolor(白色);
Settextstyle(30,0,_ T( bold ));
for(int x=0;x 4;x)
for(int y=0;y 4;y)
{
if (Block[type][x][y]==1)
{
outtextxy(X y * 30,Y x * 30,);
}
}
}-第三步难度:1。实现声音消除,2。开始游戏的音效,3。在游戏暂停的同时停止音效(这里有一个难点就是重播不会从最初暂停的地方重播。如果我的想法是弄个定时器)4。保存游戏最高分的记录。
-代码优化建议1。封装函数,可以分成几个头文件,比如实现页面窗口绘制的函数声明的UI.h头文件,实现游戏逻辑函数声明的APP.h头文件,然后分别实现UI.cpp和APP.cpp中的函数,再将UI.h和APP.h文件引入主函数main.cpp运行主函数。
更新————
电脑魔术师原创作品,
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。