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免费套餐快速搭建高效网站?