C语言实现俄罗斯方块小游戏的制作代码,具体内容如下
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define TTY_PATH "/dev/tty"
#define STTY_ON "stty raw -echo -F"
#define STTY_OFF "stty -raw echo -F"
int map[21][14];
char direct;
int node[7][4][16]={
{{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},
{0,1,0,0,0,1,0,0,0,1,0,0,0,1,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,0,0,0,0,0}},
{{0,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0},//3边加一中点
{0,1,0,0,0,1,1,0,0,1,0,0,0,0,0,0},
{0,0,0,0,1,1,1,0,0,1,0,0,0,0,0,0},
{0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0}},
{{0,1,1,0,0,1,0,0,0,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,0,0,0,1,0,0,1,1,0,0,0,0,0,0},
{1,0,0,0,1,1,1,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},
{0,1,0,0,0,1,0,0,0,1,1,0,0,0,0,0},
{0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0}},
{{0,1,0,0,0,1,1,0,0,0,1,0,0,0,0,0},//右曲折型
{0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0},
{0,1,0,0,0,1,1,0,0,0,1,0,0,0,0,0},
{0,1,1,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},//左曲折型
{1,1,0,0,0,1,1,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},
{1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0}}
};
typedef struct block
{
int x;
int y;
int blockType;
int blockDirect;
}Block;
Block bl;
void init_map()//初始化边框
{
int i,j;
for(i=0; i<21; i++)
for(j=0; j<14; j++)
{
if(j==0 || j==13)
map[i][j] = 200;
else if(i==20)
map[i][j] = 201;
else
map[i][j] = 0;
}
}
void new_block()//生成随机的俄罗斯方块
{
int blockType = rand()%7;
int blockDirect = rand()%4;
int x = 1;
int y = 5;
bl.x = x;
bl.y = y;
bl.blockType = blockType;
bl.blockDirect = blockDirect;
}
void input()//将移动后的俄罗斯方块,导入地图中作标记
{
int i, j;
for(i=0; i<4; i++)
for(j=0; j<4; j++)
if(node[bl.blockType][bl.blockDirect][i*4+j]==1)
{
map[bl.x+i][bl.y+j] = 1;
}
}
void output()//移动时,将之前俄罗斯方块在地图信息清空。
{
int i, j;
for(i=0; i<4; i++)
for(j=0; j<4; j++)
if(node[bl.blockType][bl.blockDirect][i*4+j]==1)
{
map[bl.x+i][bl.y+j] = 0;
}
}
void change()//俄罗斯方格在碰撞后融入,固定
{
int i, j;
for(i=0; i<4; i++)
for(j=0; j<4; j++)
if(node[bl.blockType][bl.blockDirect][i*4+j]==1)
{
map[bl.x+i][bl.y+j] = 10;
}
for(j=1; j<13; j++)
if(map[5][j] == 10)
{
system("clear");
printf("game over !!!!!!!!!\n");
exit(1);
}
}
void print_map()//打印地图,显示信息
{
int i,j;
for(i=5; i<21; i++)
{
for(j=0; j<14; j++)
{
if(map[i][j]==200)//左右边界
printf("#");
else if(map[i][j]==201)//下边界
printf(" # ");
else if(map[i][j]==0)//空白地
printf(" ");
else if(map[i][j]==1)//移动的俄罗斯方块
printf(" * ");
else if(map[i][j]==10)//固定的俄罗斯方块
printf(" @ ");
}
printf("\n");
}
}
void delLine(int n)//消行
{
int i,j;
for(j = 1; j<13; j++)
map[n][j] = 0;
for(i = n; i>5 ; i--)
for(j = 1; j<13; j++)
if(map[i-1][j] != 1)
map[i][j] = map[i-1][j];
}
void isFillLine()//是否满足消行条件
{
int i,j;
int fals;
for(i=19; i>5; i--)
{
fals = 1;
for(j=1; j<13; j++)
{
if(map[i][j] != 10)
{
fals = 0;
continue;
}
}
if(fals)
{
delLine(i);
}
}
}
void down()//下移
{
int i, j;
int fale = 1;
for(i=3; i>=0; i--)
for(j=0; j<4; j++)
if(node[bl.blockType][bl.blockDirect][i*4+j] == 1)
if(map[bl.x+i+1][bl.y+j] == 10 || map[bl.x+i+1][bl.y+j] == 201)
{
change();
fale = 0;
new_block();
isFillLine();
return;
}
if(fale)
{
output();
bl.x += 1;
input();
}
}
void right()//右移
{
int i, j;
int fale = 1;
for(i=3; i>=0; i--)
for(j=0; j<4; j++)
if(node[bl.blockType][bl.blockDirect][i*4+j] == 1)
if(map[bl.x+i][bl.y+j+1] == 10 || map[bl.x+i][bl.y+j+1] == 200)
{
fale = 0;
return;
}
if(fale)
{
output();
bl.y += 1;
input();
}
}
void left()//左移
{
int i, j;
int fale = 1;
for(i=3; i>=0; i--)
for(j=0; j<4; j++)
if(node[bl.blockType][bl.blockDirect][i*4+j] == 1)
if(map[bl.x+i][bl.y+j-1] == 10 || map[bl.x+i][bl.y+j-1] == 200)
{
fale = 0;
return;
}
if(fale)
{
output();
bl.y -= 1;
input();
}
}
void change_block()//俄罗斯方块变形
{
int i,j;
output();
int fals = 1;
bl.blockDirect += 1;
bl.blockDirect %= 4;
for(i=0; i<4; i++)
for(j=0; j<4; j++)
if(node[bl.blockType][bl.blockDirect][i*4+j]==1)
if(map[bl.x+i][bl.y+j] != 0 )
{
fals = 0;
break;
}
if(fals)
{
input();
}else
{
bl.blockDirect -= 1;
input();
}
}
char in_direct()//非堵塞输入
{
fd_set fd;
struct timeval tv;
char ch;
FD_ZERO(&fd);
FD_SET(0, &fd);
tv.tv_sec = 0;
tv.tv_usec = 10;
if(select(1, &fd ,NULL, NULL, &tv) > 0)
{
ch = getchar();
}
return ch;
}
int main()//q 退出游戏,a,d 左右移动,空格变形
{
srand(time(NULL));
init_map();
new_block();
input();
char ch;
int num = 0;
while(1)
{
usleep(500000);
system(STTY_ON TTY_PATH);
ch = in_direct();
system(STTY_OFF TTY_PATH);
system("clear");
if(ch == 'a' && num <= 1)
{
left();
print_map();
num++;
continue;
}else if(ch == 'd' && num <= 1)
{
right();
print_map();
num++;
continue;
}else if(ch == ' ' && num <= 1 )
{
change_block();
print_map();
num++;
continue;
}else if(ch == 'q')
{
system("clear");
printf("gave over!!!!!\n");
exit(0);
}
down();
print_map();
num = 0;
}
return 0;
}
更多俄罗斯方块精彩文章请点击专题:俄罗斯方块游戏集合 进行学习。
更多有趣的经典小游戏实现专题,分享给大家:
C++经典小游戏汇总
python经典小游戏汇总
JavaScript经典游戏 玩不停
java经典小游戏汇总
javascript经典小游戏汇总
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# C语言
# 俄罗斯方块
# C语言源码实现俄罗斯方块
# C语言实现俄罗斯方块源代码
# C语言实现俄罗斯方块
# C语言代码实现俄罗斯方块
# C语言实现俄罗斯方块课程设计
# C语言俄罗斯方块游戏课程设计
# 如何用c语言完成俄罗斯方块小游戏
# 经典小游戏
# 请点击
# 俄罗斯
# 给大家
# 图中
# 具体内容
# 大家多多
# 清空
# 经典游戏
# 边加一
# struct
# typedef
# block
# char
# node
# direct
# blockType
# new_block
相关文章:
建站之星导航配置指南:自助建站与SEO优化全解析
如何通过二级域名建站提升品牌影响力?
小程序网站制作需要准备什么资料,如何制作小程序?
制作网站外包平台,自动化接单网站有哪些?
c++ stringstream用法详解_c++字符串与数字转换利器
杭州银行网站设计制作流程,杭州银行怎么开通认证方式?
建站之星安全性能如何?防护体系能否抵御黑客入侵?
济南企业网站制作公司,济南社保单位网上缴费步骤?
已有域名和空间,如何快速搭建网站?
高性能网站服务器配置指南:安全稳定与高效建站核心方案
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
如何用y主机助手快速搭建网站?
制作宣传网站的软件,小红书可以宣传网站吗?
建站主机解析:虚拟主机配置与服务器选择指南
潍坊网站制作公司有哪些,潍坊哪家招聘网站好?
北京的网站制作公司有哪些,哪个视频网站最好?
网站制作软件有哪些,制图软件有哪些?
移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?
javascript中的try catch异常捕获机制用法分析
小型网站建站如何选择虚拟主机?
成都品牌网站制作公司,成都营业执照年报网上怎么办理?
建站主机选购指南与交易推荐:核心配置解析
学校免费自助建站系统:智能生成+拖拽设计+多端适配
建站之星安装需要哪些步骤及注意事项?
可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?
深圳 网站制作,深圳招聘网站哪个比较好一点啊?
网站设计制作公司地址,网站建设比较好的公司都有哪些?
如何通过主机屋免费建站教程十分钟搭建网站?
C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?
,购物网站怎么盈利呢?
岳西云建站教程与模板下载_一站式快速建站系统操作指南
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
建站之星如何助力网站排名飙升?揭秘高效技巧
C#如何使用XPathNavigator高效查询XML
,怎么在广州志愿者网站注册?
深圳网站制作培训,深圳哪些招聘网站比较好?
相亲简历制作网站推荐大全,新相亲大会主持人小萍萍资料?
唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?
如何选择高效便捷的WAP商城建站系统?
如何快速配置高效服务器建站软件?
建站之星3.0如何解决常见操作问题?
武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?
Android滚轮选择时间控件使用详解
如何通过IIS搭建网站并配置访问权限?
如何通过远程VPS快速搭建个人网站?
如何在阿里云高效完成企业建站全流程?
如何通过虚拟主机空间快速建站?
微网站制作教程,我微信里的网站怎么才能复制到浏览器里?
如何制作网站标识牌,动态网站如何制作(教程)?
*请认真填写需求信息,我们会在24小时内与您取得联系。