俄罗斯方块—C语言

article/2025/10/29 20:51:50

思路:
1.初始化界面,用一个矩阵来保存界面的每一个位置,包括颜色跟数值,数值用来区分是墙还是方块还是空格,便于运行时的判断。

2.初始化方块,用4*4矩阵保存,1表示方块,0表示空格。初始7个方块,再利用矩阵旋转,得到剩下的21个方块。

3.运行时先判断再运行,可以保证不会越过墙。每一步判断4*4的方块矩阵下一格是否是方块,是方块就落在上面。

4.一个方块落到底便判断是否满一行,满一行减掉,在判断是否满一行,未满则生成下一个方块。

5.判断游戏结束:即判断最顶上一行是否有方块。

游戏图片:

游戏运行时

游戏结束时

代码:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>
#include<conio.h>
#define SPACE 32
#define LEFT  75
#define RIGHT 77
#define DOWN 80
#define ESC 27
#define Wall 2
#define Box 1
#define Kong 0
#define FACE_X 29
#define FACE_Y 20   //界面尺寸
void gotoxy(int x,int y);  //移动光标
int color(int c);   //颜色
void hidden_cursor();  //隐藏光标
void inter_face();  //初始化界面
void init_dia();   //初始化方块信息
void draw_dia(int base,int space_c,int x,int y);   //覆盖方块
void draw_kong(int base,int space_c,int x,int y); //画方块
int pd(int n,int space_c,int x,int y);  //判断是否到底
void start_game();   //开始游戏
int xc();//消除
void read_file();   //读写最高记录
void write_file();  //写最高纪录
int grade=0;//当前分数
int max=0;//最高记录
int nn=0;
struct Face
{int data[FACE_X][FACE_Y+10];    //数值,为1是方块,为0是空格int color[FACE_X][FACE_Y+10];   //对应方块的颜色
}face;
typedef struct Diamonds
{   int space[4][4];        //4*4矩阵,为1为方块,为0 为空
}Dia;
Dia dia[7][4];  //一维基础7个方块,二维表示旋转次数
int main()
{   system("cls");system("title 俄罗斯方块");color(7);system("mode con cols=60 lines=30");  //窗口宽度高度 hidden_cursor();srand(time(NULL));read_file();grade=0;inter_face();init_dia();nn=rand()%7;while(1){start_game();}return 0;
}
/////////////////////////////////////////////////
void start_game()
{   int n,ch,t=0,x=0,y=FACE_Y/2-2,i,j;int space_c=0;//旋转次数draw_kong(nn,space_c,4,FACE_Y+3);n=nn;   nn=rand()%7;    //随机生成下一块color(nn);draw_dia(nn,space_c,4,FACE_Y+3);while(1){   color(n);draw_dia(n,space_c,x,y);//画出图形if(t==0)t=15000;while(--t){   if(kbhit()!=0)//有输入就跳出break;  }if(t==0){if(pd(n,space_c,x+1,y)==1){   draw_kong(n,space_c,x,y);x++;            //向下降落}else{for(i=0;i<4;i++){for(j=0;j<4;j++){ if(dia[n][space_c].space[i][j]==1){   face.data[x+i][y+j]=Box;face.color[x+i][y+j]=n;while(xc());}}}return;}}else{ch=getch();switch(ch)     //移动{case LEFT: if(pd(n,space_c,x,y-1)==1)   //判断是否可以移动{   draw_kong(n,space_c,x,y);y--;}break;case RIGHT: if(pd(n,space_c,x,y+1)==1){   draw_kong(n,space_c,x,y);y++;}break;case DOWN: if(pd(n,space_c,x+1,y)==1){   draw_kong(n,space_c,x,y);x++;}break;case SPACE: if(pd(n,(space_c+1)%4,x+1,y)==1){   draw_kong(n,space_c,x,y);space_c=(space_c+1)%4;}break;case ESC  : system("cls");gotoxy(FACE_X/2,FACE_Y);printf("---游戏结束!---\n\n");gotoxy(FACE_X/2+2,FACE_Y);printf("---按任意键退出!---\n");getch();exit(0);break;case  'R':case  'r':  main();exit(0);case  'S':case  's':  while(1){   if(kbhit()!=0)//有输入就跳出break;  }break;}}}
}
int xc()
{int i,j,k,sum;for(i=FACE_X-2;i>4;i--){sum=0;for(j=1;j<FACE_Y-1;j++){sum+=face.data[i][j];   }if(sum==0)break;if(sum==FACE_Y-2)   //满一行,减掉{   grade+=100;color(7);gotoxy(FACE_X-4,2*FACE_Y+2);printf("分数:%d",grade);for(j=1;j<FACE_Y-1;j++){face.data[i][j]=Kong;gotoxy(i,2*j);printf(" ");}for(j=i;j>1;j--){   sum=0;for(k=1;k<FACE_Y-1;k++){sum+=face.data[j-1][k]+face.data[j][k];face.data[j][k]=face.data[j-1][k];if(face.data[j][k]==Kong){gotoxy(j,2*k);printf(" ");}else{gotoxy(j,2*k);color(face.color[j][k]);printf("■");}}if(sum==0)return 1;}}}for(i=1;i<FACE_Y-1;i++){if(face.data[1][i]==Box){char n;Sleep(2000); //延时system("cls");color(7);gotoxy(FACE_X/2-2,2*(FACE_Y/3));if(grade>max){printf("恭喜您打破记录,目前最高纪录为:%d",grade);write_file();}else if(grade==max)printf("与纪录持平,请突破你的极限!");elseprintf("请继续努力,你与最高记录只差:%d",max-grade);gotoxy(FACE_X/2,2*(FACE_Y/3));printf("GAME OVER!\n");do{gotoxy(FACE_X/2+2,2*(FACE_Y/3));printf("是否重新开始游戏(y/n): ");scanf("%c",&n);gotoxy(FACE_X/2+4,2*(FACE_Y/3));if(n!='n' && n!='N' && n!='y' && n!='Y')printf("输入错误,请重新输入!");elsebreak;}while(1);if(n=='n' || n=='N'){gotoxy(FACE_X/2+4,2*(FACE_Y/3));printf("按任意键退出游戏!");exit(0);}else if(n=='y' || n=='Y')main();}       }return 0;
}
//////////////////////////////////////////////
void read_file()    //读取最高记录
{FILE *fp;fp=fopen("俄罗斯方块记录.txt","r+");if(fp==NULL){fp=fopen("俄罗斯方块记录.txt","w+");fwrite(&max,sizeof(int),1,fp);}fseek(fp,0,0);fread(&max,sizeof(int),1,fp);fclose(fp);
}
void write_file()   //保存最高记录
{FILE *fp;fp=fopen("俄罗斯方块记录.txt","r+");fwrite(&grade,sizeof(int),1,fp);fclose(fp);
}
///////////////////////////////////////////////
int pd(int n,int space_c,int x,int y)   //判断是否到底
{int i,j;for(i=0;i<4;i++){for(j=0;j<4;j++){if(dia[n][space_c].space[i][j]==0)continue;else if(face.data[x+i][y+j]==Wall || face.data[x+i][y+j]==Box)return 0;}}return 1;
}
void draw_kong(int base,int space_c,int x,int y)
{int i,j;for(i=0;i<4;i++){for(j=0;j<4;j++){gotoxy(x+i,2*(y+j));if(dia[base][space_c].space[i][j]==1)printf("  ");}}}
void draw_dia(int base,int space_c,int x,int y)
{int i,j;for(i=0;i<4;i++){for(j=0;j<4;j++){gotoxy(x+i,2*(y+j));if(dia[base][space_c].space[i][j]==1)printf("■");}}
}
void init_dia()
{int i,j,k,z;int tmp[4][4];for(i=0;i<3;i++)dia[0][0].space[1][i]=1;dia[0][0].space[2][1]=1;     //土形for(i=1;i<4;i++)dia[1][0].space[i][1]=1;dia[1][0].space[1][2]=1;    //L形--1for(i=1;i<4;i++)dia[2][0].space[i][2]=1;dia[2][0].space[1][1]=1;    //L形--2for(i=0;i<2;i++){   dia[3][0].space[1][i]=1;dia[3][0].space[2][i+1]=1; //Z形--1dia[4][0].space[1][i+1]=1;dia[4][0].space[2][i]=1;//Z形--2dia[5][0].space[1][i+1]=1;dia[5][0].space[2][i+1]=1;//田字形}for(i=0;i<4;i++)dia[6][0].space[i][2]=1;//1形 //////////////////////////////////基础7个形状for(i=0;i<7;i++){for(z=0;z<3;z++){for(j=0;j<4;j++){for(k=0;k<4;k++){tmp[j][k]=dia[i][z].space[j][k];}   }for(j=0;j<4;j++){for(k=0;k<4;k++){dia[i][z+1].space[j][k]=tmp[4-k-1][j];}   }}}///////////////////////////////////旋转后的21个形状
}
//////////////////////////////////////
void inter_face()//界面
{   int i,j;for(i=0;i<FACE_X;i++){   for(j=0;j<FACE_Y+10;j++){   if(j==0 || j==FACE_Y-1 || j==FACE_Y+9){   face.data[i][j]=Wall;gotoxy(i,2*j);printf("■");}else if(i==FACE_X-1){   face.data[i][j]=Box;gotoxy(i,2*j);printf("■");}elseface.data[i][j]=Kong;}}gotoxy(FACE_X-18,2*FACE_Y+2);printf("左移:←");gotoxy(FACE_X-16,2*FACE_Y+2);printf("右移:→");gotoxy(FACE_X-14,2*FACE_Y+2);printf("旋转:space");gotoxy(FACE_X-12,2*FACE_Y+2);printf("暂停: S");gotoxy(FACE_X-10,2*FACE_Y+2);printf("退出: ESC");gotoxy(FACE_X-8,2*FACE_Y+2);printf("重新开始:R");gotoxy(FACE_X-6,2*FACE_Y+2);printf("最高纪录:%d",max);gotoxy(FACE_X-4,2*FACE_Y+2);printf("分数:%d",grade);}
//////////////////////////////////////////////////
void gotoxy(int x,int y) //移动坐标
{COORD coord;coord.X=y;coord.Y=x;SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), coord );
}
//////////////////////////////////////////////////
void hidden_cursor()//隐藏光标
{HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);CONSOLE_CURSOR_INFO cci;GetConsoleCursorInfo(hOut,&cci);cci.bVisible=0;//赋1为显示,赋0为隐藏SetConsoleCursorInfo(hOut,&cci);
}
int color(int c)
{switch(c){case 0: c=9;break;case 1:case 2: c=12;break;case 3:case 4: c=14;break;case 5: c=10;break;case 6: c=13;break;default: c=7;break;}SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c);        //更改文字颜色return 0;
}

http://chatgpt.dhexx.cn/article/JKZlly2W.shtml

相关文章

俄罗斯方块c语言代码及注释,C语言代码实现俄罗斯方块

这里为大家敲写一段怎样用C语言实现俄罗斯方块: 首先推荐大家使用CodeBlocks这个软件,方便添加不同的工程。 代码中有很多注释便于理解! 下面是效果图和全部的代码以及注释,大家可以观看并自己新增内容! 1、首先是main.c文件: #include #include #include "game.h…

【C语言】百行代码实现—俄罗斯方块

文章目录 自述整体框架和流程开始游戏页面设计游戏设计流程介绍 注意可执行源码-全部 自述 这个代码是19年的末尾写的&#xff0c;最近就想着想把这个用博客分享出来&#xff0c;一方面是为了巩固自己的知识&#xff0c;另一方面也希望同学们能够因为这篇文章有所收获&#xf…

两张图片告诉你 载波聚合为4G加速的原因

描述 2015年被业界认为是LTE-A的规模商用元年&#xff0c;说到底&#xff0c;是载波聚合的规模商用。载波聚合作为LTE-A的关键技术之一&#xff0c;通过将两个或两个以上的载波&#xff08;Component Carrier&#xff0c;CC&#xff09;汇聚在一起&#xff0c;从而将分散的频谱…

LTE-A载波聚合技术(3)---L1/L2映射方案

1.5 L1/L2映射 1.5.1 NTT DOCOMO和Panasonic方案 DOCOMO和Panasonic提出的建议基本上是一样的&#xff0c;大体上可以分为3种&#xff1a; Option 1&#xff1a;每个CC一个TB和一个HARQ实体&#xff1b; Option 2&#xff1a;所有聚合的CC一个TB和一个HARQ实体&#xff1b; O…

LTE、NR载波聚合(CA)-- 等级划分

LTE、NR载波聚合(CA)-- 等级划分 一、LTE载波聚合等级划分:LTE根据载波对应的RB数命名 LTE CA信道参考3GPP TS 36.508 举个例子,“DC_3C-n78A”这个组合,就代表B3和n78这两个频段间的聚合,其中B3的频段内聚合等级为C,就表示2个LTE B3的带内聚合,且RB数量在100到200…

4G时代 载波聚合——用户、网络双受益

1、序言 2013下半年以来&#xff0c;载波聚合成为为先行LTE运营商网络演进的重点方向。进入2014年&#xff0c;随着爱立信与澳洲电讯宣布完成20MHz 20MHz载波聚合演示&#xff0c;韩国SK电信宣布年内商用20MHz 10MHz 10MHz三频段载波聚合&#xff0c;可以期待LTE商用网络的下…

[4G5G专题-12]:功能-LTE载波聚合CA对空口协议栈的影响概述

目录 1. LTE空口协议栈 2. 载波聚合对空口协议栈影响 2.1 载波聚合对空口协议栈影响的总体架构 2.2 L3 RRC层影响 2.3 L2 PDCP层影响 2.4 L2 RLC层影响 2.5 L2 MAC层影响 2.6 L1 PHY层影响 2.7 L0 Radio层影响 1. LTE空口协议栈 L0 RF: 负责模数转换、射频调制、无线…

【移动通信】4G载波聚合

载波聚合 Carrier Aggregation&#xff08;CA&#xff09; 根据香农定理&#xff0c;网速受限于带宽&#xff0c;载波聚合最早在3GPP R10版本提出。因为运营商的频谱比较碎&#xff0c;在低频段难以找到合适的大带宽&#xff0c;因此通过载波聚合将多个载波聚合成一个更宽的频…

4G+、VoLTE、载波聚合到底是啥?

原文地址&#xff1a;http://news.zol.com.cn/561/5613290.html 2016年来到了&#xff0c;运营商将普遍进入到4G时代&#xff0c;4G就是比4G还快的意思&#xff0c;下载速率可达300M。这个“”的帽子并不能乱戴&#xff0c;必须得应用了两个新技术才可称为4G&#xff0c;这两个…

基于MATLAB的LTEA载波聚合算法仿真

目录 一、理论基础 二、案例背景 1.问题描述 2.思路流程 三、部分MATLAB仿真 四、仿真结论分析 五、参考文献 一、理论基础 在非连续载波聚合( 高频低频) 场景下&#xff0c;载波衰减特性不同&#xff0c;聚合的载波有不同的覆盖范围&#xff0c;使得不同用户可调度的载…

LTE-A载波聚合技术(1)---载波聚合的技术特征、分类、仿真场景

1 技术特征 1.1 Carrier Aggregation概述 为了支持LTE-A达到100MHz的系统带宽的要求&#xff0c;3GPP在#53bis会议上提出了载波聚合。所谓载波聚合&#xff0c;就是LTE-A为了支持下行传输带宽超过20MHz聚合两个或者更多的成分载波&#xff08;component carrier&#xff09;。…

载波聚合CA

为什么需要载波聚合&#xff1f; 一般来说&#xff0c;要提升网速或者容量&#xff0c;有下面几个思路&#xff1a; 建更多的基站&#xff1a;这样一来同一个基站下抢资源的人就少了&#xff0c;网速自然就上去了。但缺点是投入太大了&#xff0c;运营商肯定不会做亏本的买卖…

CA(载波聚合)

文章目录 CA基本概念1. CA分类2. Pcell、Scell以及Serving CellPcell&#xff08;Primary Cell&#xff09;Scell&#xff08;Secondary Cell&#xff09; 3. Pcell、Scell部署场景场景1场景2场景3场景4 4. CA的协议控制4.1 Camping/Connetion Establishment:4.2 CC Management…

通俗说法+专业解释,载波聚合

通俗说法专业解释&#xff0c;载波聚合那些事全明白 发布时间&#xff1a;2016-05-19 13:36:30 来源&#xff1a;RF技术社区 (http://rf.eefocus.com) 标签&#xff1a;传输带宽载波聚合&#xff08;CA&#xff09;LTE频段 导读&#xff1a;随着LTE深入发展&#xff0c;用户…

载波聚合

一.为什么要进行载波聚合&#xff1f; lte中最大带宽是20M&#xff08;100个PRB&#xff09;,该小区下ue能获得速率是有限的&#xff08;LTE_FDD上行理想状态下75Mbps左右&#xff0c;而下行理想状态在175Mbps&#xff08;注&#xff1a;后面我会专门一篇文章计算LTE_TDD&#…

载波聚合(CA)

载波聚合(CA) 1. 载波聚合目的 为了满足LTE-A下行峰速1 Gbps&#xff0c;上行峰速500 Mbps的要求&#xff0c;需要提供最大100 MHz的传输带宽&#xff0c;但由于这么大带宽的连续频谱的稀缺&#xff0c;LTE-A提出了载波聚合&#xff08;Carrier Aggregation&#xff0c;CA&…

载波聚合(CA)-carrier aggregation

1 为什么需要载波聚合&#xff1f; 一般来说&#xff0c;要提升网速或者容量&#xff0c;有下面几个思路&#xff1a; 建更多的基站&#xff1a;这样一来同一个基站下抢资源的人就少了&#xff0c;网速自然就上去了。但缺点是投入太大了&#xff0c;运营商肯定不会做亏本的买…

到底什么是载波聚合(CA)?

1 为什么需要载波聚合&#xff1f; 一般来说&#xff0c;要提升网速或者容量&#xff0c;有下面几个思路&#xff1a; 建更多的基站&#xff1a;这样一来同一个基站下抢资源的人就少了&#xff0c;网速自然就上去了。但缺点是投入太大了&#xff0c;运营商肯定不会做亏本的买卖…

ntpdate同步时间出现:no server suitable for synchronization found 最终解决方案!

搭建zabbix服务器时&#xff0c;用ntpdate同步时间出错 ntpdate[2685]: no server suitable for synchronization found 百度查阅资料&#xff0c;尝试了以下数种方法&#xff1a; 换别的时间服务器 ping 域名得到IP&#xff0c;在linux和windows上都ping&#xff0c;根据得到…

内网安装ntpdate时间同步工具

查询是否安装NTP服务 # rpm -qa | grep ntp 根据系统版本寻找合适的RPM安装包。 RPM下载网站&#xff1a;​​https://pkgs.org/download/ntp​​(几乎涵盖了所有RPM包) 下载安装ntpdate wget http://mirror.centos.org/centos/7/os/x86_64/Packages/ntpdate-4.2.6p5-29.el7.ce…