C语言实现俄罗斯方块小游戏
发布时间 - 2026-01-11 02:33:34 点击率:次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
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
教你用AI将一段旋律扩展成一首完整的曲子
宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程
如何登录建站主机?访问步骤全解析
Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】
Laravel路由怎么定义_Laravel核心路由系统完全入门指南
详解Huffman编码算法之Java实现
Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲
浅谈Javascript中的Label语句
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
微信推文制作网站有哪些,怎么做微信推文,急?
Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制
Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置
php增删改查怎么学_零基础入门php数据库操作必知基础【教程】
php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】
如何快速搭建高效服务器建站系统?
JavaScript如何实现错误处理_try...catch如何捕获异常?
如何续费美橙建站之星域名及服务?
黑客入侵网站服务器的常见手法有哪些?
Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理
详解Oracle修改字段类型方法总结
三星、SK海力士获美批准:可向中国出口芯片制造设备
Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程
EditPlus中的正则表达式 实战(4)
laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法
Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册
网站建设保证美观性,需要考虑的几点问题!
Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出
DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解
Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制
Laravel如何与Pusher实现实时通信?(WebSocket示例)
如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环
如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程
javascript基于原型链的继承及call和apply函数用法分析
Android实现代码画虚线边框背景效果
Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决
千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】
HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】
佛山企业网站制作公司有哪些,沟通100网上服务官网?
WEB开发之注册页面验证码倒计时代码的实现
如何用PHP快速搭建CMS系统?
b2c电商网站制作流程,b2c水平综合的电商平台?
Laravel如何创建自定义中间件?(Middleware代码示例)
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
Angular 表单中正确绑定输入值以确保提交与验证正常工作
如何自定义建站之星模板颜色并下载新样式?
香港网站服务器数量如何影响SEO优化效果?
进行网站优化必须要坚持的四大原则
JavaScript中的标签模板是什么_它如何扩展字符串功能
Bootstrap整体框架之CSS12栅格系统
如何用AWS免费套餐快速搭建高效网站?

