c语言之 俄罗斯方块源程序代码

本文将详细探讨如何使用C语言编写经典的俄罗斯方块游戏,包括游戏的基本逻辑、方块生成与旋转、屏幕碰撞检测等关键代码实现。
摘要由CSDN通过智能技术生成
#include <stdio.h>
#include <windows.h>
#include <conio.h>
#include <time.h>

//游戏窗口
#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分别表示该位置为游戏边框、方块、无图案;初始化为无图案
int b[4];     //标记4个"口"方块:1表示有方块,0表示无方块
  
//声明俄罗斯方块的结构体
struct Tetris
{
 int x;     //中心方块的x轴坐标
 int y;     //中心方块的y轴坐标
 int flag;    //标记方块类型的序号
 int next;    //下一个俄罗斯方块类型的序号
 int speed;    //俄罗斯方块移动的速度
 int count;    //产生俄罗斯方块的个数
 int score;    //游戏的分数
 int level;    //游戏的等级
};

//函数原型声明
//光标移到指定位置
void gotoxy(HANDLE hOut, int x, int y);
//制作游戏窗口
void 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 Tetris *);
//判断是否满行,并删除满行的俄罗斯方块
void del_full(HANDLE hOut,struct Tetris *);
//开始游戏
void start_game();


void main()
{ 
 //制作游戏窗口
 make_frame();      
 //开始游戏
 start_game();
}

/******光标移到指定位置**************************************************************/
void gotoxy(HANDLE hOut, int x, int y)
{
 COORD pos;
 pos.X = x;  //横坐标
 pos.Y = y;  //纵坐标
 SetConsoleCursorPosition(hOut, pos);
}

/******制作游戏窗口******************************************************************/
void 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;i<2*Frame_width-2;i+=2)
 {
  gotoxy(hOut,FrameX+i,FrameY);
  printf("═");         //打印上横框
 }
 for(i=2;i<2*Frame_width-2;i+=2)
 {
  gotoxy(hOut,FrameX+i,FrameY+Frame_height);
  printf("═");         //打印下横框
  a[FrameX+i][FrameY+Frame_height]=2;    //记住下横框有图案
 }
 for(i=1;i<Frame_height;i++)
 {
  gotoxy(hOut,FrameX,FrameY+i); 
  printf("║");         //打印左竖框
  a[FrameX][FrameY+i]=2;       //记住左竖框有图案
 }
 for(i=1;i<Frame_height;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[tetris->x][tetris->y]=b[0];    //中心方块位置的图形状态:1-有,0-无
 switch(tetris->flag)      //共6大类,19种类型
 {
  case 1:         //田字方块
   {  
    a[tetris->x][tetris->y-1]=b[1];
    a[tetris->x+2][tetris->y-1]=b[2];
    a[tetris->x+2][tetris->y]=b[3];
    bre
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值