C/C++编程基础系列:俄罗斯方块小游戏制作,源码直接分享
大家好,关于C/C++编程基础系列:俄罗斯方块小游戏制作,源码直接分享很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!
2. 初始化窗口:initgraph(x, y);这是一个函数,首先创建一个窗口,左上角为(0,0),x轴向右,y轴向下,其中x表示x单位长度,y表示y单位宽度。
3. 关闭图像窗口:closegraph();用于在最后关闭。
4. 按任意键继续:getch();这与getchar(); 类似。为了防止它运行后关闭,以便可以暂停一段时间,它的头文件是:conio.h。
5. 画一条线:line(x1, y1, x2, y2);在您创建的窗口中以(x1, y1) 和(x2, y2) 作为两个端点画一条线。
6. 绘制矩形:矩形(x1,y1,x2,y2);以(x1,y1) 和(x2,y2) 为对角线绘制一个矩形。
7. 画圆:circle(x,y,r);以(x,y) 为点,r 为半径画一个圆。
8、颜色:setcolor(x);用于设置颜色,其中x是你要设置的颜色,可以填写这16种: BLACK, BLUE, GREEN, CYAN, RED, MAGENTA, BROWN , 浅灰色LIGHTGRAY, 深灰色DARKGRAY, 亮蓝色LIGHTBLUE,亮绿色LIGHTGREEN、亮青色LIGHTCYAN、亮红色LIGHTRED、亮紫色LIGHTMAGENTA、黄色YELLOW、白色WHITE;当然,你也可以根据光的三基色调整自己喜欢的颜色,方法是:setcolor(RGB(x,y,z));其中RGB分别。。红、绿、蓝,对应的x、y、z是你选择的颜色,范围是[0,255]。
包括
包括
包括
包括
//游戏窗口
#define FrameX 4 //游戏窗口左上角X轴坐标
#define FrameY 4 //游戏窗口左上角Y轴坐标
#define Frame_height 20 //游戏窗口的高度
#define Frame_width 18 //游戏窗口的宽度
//定义全局变量
int i,j,temp,temp1,temp2; //temp,temp1,temp2用于记忆和转换块变量的值
int a[80][80]={0}; //标记游戏画面的图案:2、1、0分别表示该位置为游戏边框、正方形、或无图案;初始化为无模式
整数b[4]; //标记4个‘口’块:1表示有块,0表示无块
俄罗斯方块结构体
{
整数x; //中心方块的x轴坐标
整数y; //中心方块的Y轴坐标
int 标志; //标记块类型的序号
整数下一个; //下一个俄罗斯方块类型的序号
内部速度; //俄罗斯方块移动的速度
整数计数; //生成的俄罗斯方块数量
分数; //游戏得分
整数级别; //游戏等级
};
//移动光标到指定位置
void Gotoxy(HANDLE hOut, int x, int y);
//创建游戏窗口
无效make_frame();
//随机生成块类型的序号
void get_flag(struct Tetris *);
//制作俄罗斯方块
void make_tetris(struct Tetris *);
//打印俄罗斯方块
void print_tetris(HANDLE hOut,struct Tetris *);
//清除俄罗斯方块的痕迹
void clear_tetris(HANDLE hOut,struct Tetris *);
//判断是否可以移动。返回值为1,表示可以移动。否则,它就不会动。
int if_moveable(struct 俄罗斯方块*);
//判断该行是否已满,删除整行俄罗斯方块
void del_full(HANDLE hOut,struct Tetris *);
//开始游戏
无效start_game();
无效主()
{
//创建游戏窗口
make_frame();
//开始游戏
开始游戏();
}
/*****移动光标到指定位置**************************************** ****** **********************/
void Gotoxy(HANDLE hOut, int x, int y)
{
坐标位置;
pos.X=x; //横坐标
pos.Y=y; //垂直坐标
SetConsoleCursorPosition(hOut, pos);
}
/*****创建游戏窗口**************************************** **************************/
无效make_frame()
{
HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE); //定义显示句柄变量
Gotoxy(hOut,FrameX+Frame_width-5,FrameY-2); //打印游戏名称
printf('俄罗斯方块');
Gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+7); //打印选择菜单
printf('************下一个块:');
Gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+13);
printf('************');
Gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+17);
printf(' 键:变体');
Gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+19);
printf('空格:暂停游戏');
Gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+15);
printf('Esc: 退出游戏');
Gotoxy(hOut,FrameX,FrameY); //打印框架角并记住那里有一个图案
printf('');
Gotoxy(hOut,FrameX+2*Frame_width-2,FrameY);
printf('');
Gotoxy(hOut,FrameX,FrameY+Frame_height);
printf('');
Gotoxy(hOut,FrameX+2*Frame_width-2,FrameY+Frame_height);
printf('');
a[FrameX][FrameY+Frame_height]=2;
a[FrameX+2*Frame_width-2][FrameY+Frame_height]=2;
for(i=2;i2*Frame_width-2;i+=2)
{
Gotoxy(hOut,FrameX+i,FrameY);
printf(''); //打印上方水平框
}
for(i=2;i2*Frame_width-2;i+=2)
{
Gotoxy(hOut,FrameX+i,FrameY+Frame_height);
printf(''); //打印下方水平框
a[FrameX+i][FrameY+Frame_height]=2; //记住下面的横框里有一个图案
}
对于(i=1;i
{
Gotoxy(hOut,FrameX,FrameY+i);
printf(''); //打印左竖框
a[FrameX][FrameY+i]=2; //记住左边的竖框有一个图案
}
对于(i=1;i
{
Gotoxy(hOut,FrameX+2*Frame_width-2,FrameY+i);
printf(''); //打印右竖框
a[FrameX+2*Frame_width-2][FrameY+i]=2; //记住右边的竖框有一个图案
}
}
/*****制作俄罗斯方块**************************************** * **************************/
void make_tetris(struct Tetris *tetris)
{
a[俄罗斯方块-x][俄罗斯方块-y]=b[0]; //图形状态中心方块位置:1-是,0-否
switch(tetris-flag) //共6类,19种
{
case 1: //田字坊
{
a[俄罗斯方块-x][俄罗斯方块-y-1]=b[1];
a[俄罗斯方块-x+2][俄罗斯方块-y-1]=b[2];
a[俄罗斯方块-x+2][俄罗斯方块-y]=b[3];
休息;
}
case 2: //直线块:----
{
a[俄罗斯方块-x-2][俄罗斯方块-y]=b[1];
a[俄罗斯方块-x+2][俄罗斯方块-y]=b[2];
a[俄罗斯方块-x+4][俄罗斯方块-y]=b[3];
休息;
}
case 3: //直线块: |
{
a[俄罗斯方块-x][俄罗斯方块-y-1]=b[1];
a[俄罗斯方块-x][俄罗斯方块-y-2]=b[2];
a[俄罗斯方块-x][俄罗斯方块-y+1]=b[3];
休息;
}
case 4: //T形方形
{
a[俄罗斯方块-x-2][俄罗斯方块-y]=b[1];
a[俄罗斯方块-x+2][俄罗斯方块-y]=b[2];
a[俄罗斯方块-x][俄罗斯方块-y+1]=b[3];
休息;
}
case 5: //T字符顺时针旋转90度到正方形
{
a[俄罗斯方块-x][俄罗斯方块-y-1]=b[1];
a[俄罗斯方块-x][俄罗斯方块-y+1]=b[2];
a[俄罗斯方块-x-2][俄罗斯方块-y]=b[3];
休息;
}
case 6: //T字符顺时针旋转180度
{
a[俄罗斯方块-x][俄罗斯方块-y-1]=b[1];
a[俄罗斯方块-x-2][俄罗斯方块-y]=b[2];
a[俄罗斯方块-x+2][俄罗斯方块-y]=b[3];
休息;
}
case 7: //T形顺时针旋转270度
{
a[俄罗斯方块-x][俄罗斯方块-y-1]=b[1];
a[俄罗斯方块-x][俄罗斯方块-y+1]=b[2];
a[俄罗斯方块-x+2][俄罗斯方块-y]=b[3];
休息;
}
case 8: //Z形正方形
{
a[俄罗斯方块-x][俄罗斯方块-y+1]=b[1];
a[俄罗斯方块-x-2][俄罗斯方块-y]=b[2];
a[俄罗斯方块-x+2][俄罗斯方块-y+1]=b[3];
休息;
}
case 9: //Z字符将正方形顺时针旋转90度
{
a[俄罗斯方块-x][俄罗斯方块-y-1]=b[1];
a[俄罗斯方块-x-2][俄罗斯方块-y]=b[2];
a[俄罗斯方块-x-2][俄罗斯方块-y+1]=b[3];
休息;
}
case 10: //Z字符将正方形顺时针旋转180度
{
a[俄罗斯方块-x][俄罗斯方块-y-1]=b[1];
a[俄罗斯方块-x-2][俄罗斯方块-y-1]=b[2];
a[俄罗斯方块-x+2][俄罗斯方块-y]=b[3];
休息;
}
case 11: //Z形将正方形顺时针旋转270度
{
a[俄罗斯方块-x][俄罗斯方块-y+1]=b[1];
a[俄罗斯方块-x+2][俄罗斯方块-y-1]=b[2];
a[俄罗斯方块-x+2][俄罗斯方块-y]=b[3];
休息;
}
case 12: //7个字符的方块
{
a[俄罗斯方块-x][俄罗斯方块-y-1]=b[1];
a[俄罗斯方块-x][俄罗斯方块-y+1]=b[2];
a[俄罗斯方块-x-2][俄罗斯方块-y-1]=b[3];
休息;
}
case 13: //7个字符将正方形顺时针旋转90度
{
a[俄罗斯方块-x-2][俄罗斯方块-y]=b[1];
a[俄罗斯方块-x-2][俄罗斯方块-y+1]=b[2];
a[俄罗斯方块-x+2][俄罗斯方块-y]=b[3];
休息;
}
case 14: //7个字符将正方形顺时针旋转180度
{
a[俄罗斯方块-x][俄罗斯方块-y-1]=b[1];
a[俄罗斯方块-x][俄罗斯方块-y+1]=b[2];
a[俄罗斯方块-x+2][俄罗斯方块-y+1]=b[3];
休息;
}
case 15: //7个字符顺时针旋转270度正方形
{
a[俄罗斯方块-x-2][俄罗斯方块-y]=b[1];
a[俄罗斯方块-x+2][俄罗斯方块-y-1]=b[2];
a[俄罗斯方块-x+2][俄罗斯方块-y]=b[3];
休息;
}
case 16: //倒7字方块
{
a[俄罗斯方块-x][俄罗斯方块-y+1]=b[1];
a[俄罗斯方块-x][俄罗斯方块-y-1]=b[2];
a[俄罗斯方块-x+2][俄罗斯方块-y-1]=b[3];
休息;
}
case 17: //反转7个字符并将正方形顺时针旋转90度
{
a[俄罗斯方块-x-2][俄罗斯方块-y]=b[1];
a[俄罗斯方块-x-2][俄罗斯方块-y-1]=b[2];
a[俄罗斯方块-x+2][俄罗斯方块-y]=b[3];
休息;
}
case 18: //将7数字反转,将正方形顺时针旋转180度
{
a[俄罗斯方块-x][俄罗斯方块-y-1]=b[1];
a[俄罗斯方块-x][俄罗斯方块-y+1]=b[2];
a[俄罗斯方块-x-2][俄罗斯方块-y+1]=b[3];
休息;
}
case 19: //将7数字反转,将正方形顺时针旋转270度
{
a[俄罗斯方块-x-2][俄罗斯方块-y]=b[1];
a[俄罗斯方块-x+2][俄罗斯方块-y+1]=b[2];
a[俄罗斯方块-x+2][俄罗斯方块-y]=b[3];
休息;
}
}
}
//*****判断是否可移动**************************************** ***** *****************************************/
int if_moveable(struct 俄罗斯方块*俄罗斯方块)
{
if(a[tetris-x][tetris-y]!=0)//当中心方块上有图案时,返回值为0,即不能移动
{
返回0;
}
别的
{
if( //当是田形方块且口形方块上除中心方块外没有图案时,返回值为1,可以移动。
(俄罗斯方块标志==1 (a[俄罗斯方块-x][俄罗斯方块-y-1]==0
a[俄罗斯方块-x+2][俄罗斯方块-y-1]==0 a[俄罗斯方块-x+2][俄罗斯方块-y]==0 ) ) ||
//或者如果是直块,除了中心块位置以外,其他“口”块位置上没有图案,则返回值为1,可以移动。
(俄罗斯方块标志==2 (a[俄罗斯方块-x-2][俄罗斯方块-y]==0
a[俄罗斯方块-x+2][俄罗斯方块-y]==0 a[俄罗斯方块-x+4][俄罗斯方块-y]==0 ) ) ||
(俄罗斯方块标志==3 (a[俄罗斯方块-x][俄罗斯方块-y-1]==0
a[俄罗斯方块-x][俄罗斯方块-y-2]==0 a[俄罗斯方块-x][俄罗斯方块-y+1]==0 ) ) ||
(俄罗斯方块标志==4 (a[俄罗斯方块-x-2][俄罗斯方块-y]==0
a[俄罗斯方块-x+2][俄罗斯方块-y]==0 a[俄罗斯方块-x][俄罗斯方块-y+1]==0 ) ) ||
(俄罗斯方块标志==5 (a[俄罗斯方块-x][俄罗斯方块-y-1]==0
a[俄罗斯方块-x][俄罗斯方块-y+1]==0 a[俄罗斯方块-x-2][俄罗斯方块-y]==0 ) ) ||
(俄罗斯方块标志==6(a[俄罗斯方块-x][俄罗斯方块-y-1]==0
a[俄罗斯方块-x-2][俄罗斯方块-y]==0 a[俄罗斯方块-x+2][俄罗斯方块-y]==0 ) ) ||
(俄罗斯方块标志==7 (a[俄罗斯方块-x][俄罗斯方块-y-1]==0
a[俄罗斯方块-x][俄罗斯方块-y+1]==0 a[俄罗斯方块-x+2][俄罗斯方块-y]==0 ) ) ||
(俄罗斯方块标志==8 (a[俄罗斯方块-x][俄罗斯方块-y+1]==0
a[俄罗斯方块-x-2][俄罗斯方块-y]==0 a[俄罗斯方块-x+2][俄罗斯方块-y+1]==0 ) ) ||
(俄罗斯方块标志==9(a[俄罗斯方块-x][俄罗斯方块-y-1]==0
a[俄罗斯方块-x-2][俄罗斯方块-y]==0 a[俄罗斯方块-x-2][俄罗斯方块-y+1]==0 ) ) ||
(俄罗斯方块标志==10(a[俄罗斯方块-x][俄罗斯方块-y-1]==0
a[俄罗斯方块-x-2][俄罗斯方块-y-1]==0 a[俄罗斯方块-x+2][俄罗斯方块-y]==0 ) ) ||
(俄罗斯方块标志==11 (a[俄罗斯方块-x][俄罗斯方块-y+1]==0
a[俄罗斯方块-x+2][俄罗斯方块-y-1]==0 a[俄罗斯方块-x+2][俄罗斯方块-y]==0 ) ) ||
(俄罗斯方块标志==12(a[俄罗斯方块-x][俄罗斯方块-y-1]==0
a[俄罗斯方块-x][俄罗斯方块-y+1]==0 a[俄罗斯方块-x-2][俄罗斯方块-y-1]==0 ) ) ||
(俄罗斯方块标志==13(a[俄罗斯方块-x-2][俄罗斯方块-y]==0
a[俄罗斯方块-x-2][俄罗斯方块-y+1]==0 a[俄罗斯方块-x+2][俄罗斯方块-y]==0 ) ) ||
(俄罗斯方块标志==14(a[俄罗斯方块-x][俄罗斯方块-y-1]==0
a[俄罗斯方块-x][俄罗斯方块-y+1]==0 a[俄罗斯方块-x+2][俄罗斯方块-y+1]==0 ) ) ||
(俄罗斯方块标志==15(a[俄罗斯方块-x-2][俄罗斯方块-y]==0
a[俄罗斯方块-x+2][俄罗斯方块-y-1]==0 a[俄罗斯方块-x+2][俄罗斯方块-y]==0 ) ) ||
(俄罗斯方块标志==16(a[俄罗斯方块-x][俄罗斯方块-y+1]==0
a[俄罗斯方块-x][俄罗斯方块-y-1]==0 a[俄罗斯方块-x+2][俄罗斯方块-y-1]==0 ) ) ||
(俄罗斯方块标志==17(a[俄罗斯方块-x-2][俄罗斯方块-y]==0
a[俄罗斯方块-x-2][俄罗斯方块-y-1]==0 a[俄罗斯方块-x+2][俄罗斯方块-y]==0 ) ) ||
(俄罗斯方块标志==18(a[俄罗斯方块-x][俄罗斯方块-y-1]==0
a[俄罗斯方块-x][俄罗斯方块-y+1]==0 a[俄罗斯方块-x-2][俄罗斯方块-y+1]==0 ) ) ||
(俄罗斯方块标志==19(a[俄罗斯方块-x-2][俄罗斯方块-y]==0
a[俄罗斯方块-x+2][俄罗斯方块-y+1]==0 a[俄罗斯方块-x+2][俄罗斯方块-y]==0 ) ) )
{
返回1;
}
}
返回0;
}
/*****随机生成俄罗斯方块类型序列号**************************************** * **********************/
void get_flag(struct 俄罗斯方块*俄罗斯方块)
{
俄罗斯方块计数++; //记住生成的区块数量
srand((无符号)时间(NULL)); //初始化随机数
if(俄罗斯方块数量==1)
{
俄罗斯方块标志=rand()%19+1; //记住第一个块的序号
}
俄罗斯方块下一个=rand()%19+1; //记住下一个块的序号
}
/*****打印俄罗斯方块******************************************** * ******************************/
void print_tetris(HANDLE hOut,struct Tetris *tetris)
{
for(i=0;i4;i++)
{
b[i]=1; //数组b[4]每个元素的值为1
}
make_tetris(俄罗斯方块); //制作俄罗斯方块
for( i=俄罗斯方块-x-2; i=俄罗斯方块-x+4; i+=2 )
{
for(j=俄罗斯方块-y-2;j=俄罗斯方块-y+1;j++)
{
if( a[i][j]==1 jFrameY )
{
Gotoxy(hOut,i,j);
printf(''); //打印边框内的正方形
}
}
}
//打印菜单信息
Gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+1);
printf('级别: %d',俄罗斯方块级别);
Gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+3);
printf('分数: %d',俄罗斯方块分数);
Gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+5);
printf('速度: %dms',俄罗斯方块速度);
}
用户评论
感觉这个标题很有诱惑力,想学C/C++可以做个俄罗斯方块,很上手!
有17位网友表示赞同!
终于找到什么东西学习C++的动力了,俄罗斯方块我玩得太多!
有13位网友表示赞同!
直接源代码分享是不是太方便了吗?完全不需要从零开始弄代码啊。
有6位网友表示赞同!
对于编程入门小白来说,这可是个很好的选择!游戏有趣又简单易懂,更容易学习编程语言。
有13位网友表示赞同!
终于能自己实现一下经典的俄罗斯方块了,想想就 exciting!
有12位网友表示赞同!
C/C++好像难度比较高,做一个小游戏是不是可以轻松入门?
有15位网友表示赞同!
这种直观的学习方法很适合我,我喜欢实践操作型的学习方式!
有11位网友表示赞同!
我已经好久没尝试玩俄罗斯方块了,顺便学点技术,真是两全其美。
有16位网友表示赞同!
标题说的“入门基础系列”,应该适合没有任何编程经验的人吧?
有17位网友表示赞同!
这套课程包含源代码分享的话,应该还能学习到具体的代码细节和技巧吧?
有15位网友表示赞同!
想找一个简单的项目练练C++手 Feel good!
有17位网友表示赞同!
我以前就想过自己做一个俄罗斯方块游戏,现在有机会了!
有18位网友表示赞同!
这套课程适合想要从入门基础开始学习C/C++的人吗?
有11位网友表示赞同!
看名字就知道是俄罗斯方块啦! 应该还是挺有趣的!
有17位网友表示赞同!
我对做游戏的热情已经很久没有被唤醒,这个标题就特别吸引我。
有5位网友表示赞同!
如果代码简单易懂的话,那就一定会吸引我去下载学习的!
有11位网友表示赞同!
希望这个游戏能够帮助我学习C/C++的基础知识
有15位网友表示赞同!
学习新事物总是一件让人兴奋的事情!期待这个课程能够带来新的挑战和收获!
有10位网友表示赞同!
这种类型的教程一直比较受欢迎,肯定有很多人都想跟着学做俄罗斯方块的游戏!
有6位网友表示赞同!