俄罗斯方块相信大家一定都不陌生,接下来我们就用C语言来复刻一下:

用到以下的头函数:

#include <stdio.h>
#include <Windows.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>

首先我们先定义一些全局变量和结构体:


#define ROW 29 //游戏区行数
#define COL 20 //游戏区列数#define DOWN 80 //方向键:下
#define LEFT 75 //方向键:左
#define RIGHT 77 //方向键:右#define SPACE 32 //空格键
#define ESC 27 //Esc键struct Face
{int data[ROW][COL + 10]; //用于标记指定位置是否有方块(1为有,0为无)int color[ROW][COL + 10]; //用于记录指定位置的方块颜色编码
}face;struct Block
{int space[4][4];
}block[7][4]; //用于存储7种基本形状方块的各自的4种形态的信息,共28种
int max, grade; //全局变量

仍然是用模块的思想去解决问题:

//隐藏光标
void HideCursor();
//光标跳转
void CursorJump(int x, int y);
//初始化界面
void InitInterface();
//初始化方块信息
void InitBlockInfo();
//颜色设置
void color(int num);
//画出方块
void DrawBlock(int shape, int form, int x, int y);
//空格覆盖
void DrawSpace(int shape, int form, int x, int y);
//合法性判断
int IsLegal(int shape, int form, int x, int y);
//判断得分与结束
int JudeFunc();
//游戏主体逻辑函数
void StartGame();
//从文件读取最高分
void ReadGrade();
//更新最高分到文件
void WriteGrade();

接下来就是各个模块的内容:

首先是隐藏光标

//隐藏光标
void HideCursor()
{CONSOLE_CURSOR_INFO curInfo; //定义光标信息的结构体变量curInfo.dwSize = 1;  //如果没赋值的话,隐藏光标无效curInfo.bVisible = FALSE; //将光标设置为不可见HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); //获取控制台句柄SetConsoleCursorInfo(handle, &curInfo); //设置光标信息
}

接下来是对光标跳转的操作

//光标跳转
void CursorJump(int x, int y)
{COORD pos; //定义光标位置的结构体变量pos.X = x; //横坐标设置pos.Y = y; //纵坐标设置HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); //获取控制台句柄SetConsoleCursorPosition(handle, pos); //设置光标位置
}

然后是初始化页面:

//初始化界面
void InitInterface()
{color(7); //颜色设置为白色int i,j;for(i=0;i< ROW;i++){int j;for ( j = 0; j < COL + 10; j++){if (j == 0 || j == COL - 1 || j == COL + 9){face.data[i][j] = 1; //标记该位置有方块CursorJump(2 * j, i);printf("■");}else if (i == ROW - 1){face.data[i][j] = 1; //标记该位置有方块printf("■");}elseface.data[i][j] = 0; //标记该位置无方块}}for (i = COL; i < COL + 10; i++){face.data[8][i] = 1; //标记该位置有方块CursorJump(2 * i, 8);printf("■");}CursorJump(2 * COL, 1);printf("下一个方块:");CursorJump(2 * COL + 4, ROW - 19);printf("左移:←");CursorJump(2 * COL + 4, ROW - 17);printf("右移:→");CursorJump(2 * COL + 4, ROW - 15);printf("加速:↓");CursorJump(2 * COL + 4, ROW - 13);printf("旋转:空格");CursorJump(2 * COL + 4, ROW - 11);printf("暂停: S");CursorJump(2 * COL + 4, ROW - 9);printf("退出: Esc");CursorJump(2 * COL + 4, ROW - 7);printf("重新开始:R");CursorJump(2 * COL + 4, ROW - 5);printf("最高纪录:%d", max);CursorJump(2 * COL + 4, ROW - 3);printf("当前分数:%d", grade);
}

然后是初始化方块信息:

//初始化方块信息
void InitBlockInfo()
{int i,j,shape,form;//“T”形for ( i = 0; i <= 2; i++)block[0][0].space[1][i] = 1;block[0][0].space[2][1] = 1;//“L”形for ( i = 1; i <= 3; i++)block[1][0].space[i][1] = 1;block[1][0].space[3][2] = 1;//“J”形for ( i = 1; i <= 3; i++)block[2][0].space[i][2] = 1;block[2][0].space[3][1] = 1;for ( i = 0; i <= 1; i++){//“Z”形block[3][0].space[1][i] = 1;block[3][0].space[2][i + 1] = 1;//“S”形block[4][0].space[1][i + 1] = 1;block[4][0].space[2][i] = 1;//“O”形block[5][0].space[1][i + 1] = 1;block[5][0].space[2][i + 1] = 1;}//“I”形for ( i = 0; i <= 3; i++)block[6][0].space[i][1] = 1;int temp[4][4];for ( shape = 0; shape < 7; shape++) //7种形状{for ( form = 0; form < 3; form++) //4种形态(已经有了一种,这里每个还需增加3种){//获取第form种形态for ( i = 0; i < 4; i++){for ( j = 0; j < 4; j++){temp[i][j] = block[shape][form].space[i][j];}}//将第form种形态顺时针旋转,得到第form+1种形态for ( i = 0; i < 4; i++){for ( j = 0; j < 4; j++){block[shape][form + 1].space[i][j] = temp[3 - j][i];}}}}
}

然后就是方块的颜色设置:

//颜色设置
void color(int c)
{switch (c){case 0:c = 13; //“T”形方块设置为紫色break;case 1:case 2:c = 12; //“L”形和“J”形方块设置为红色break;case 3:case 4:c = 10; //“Z”形和“S”形方块设置为绿色break;case 5:c = 14; //“O”形方块设置为黄色break;case 6:c = 11; //“I”形方块设置为浅蓝色break;default:c = 7; //其他默认设置为白色break;}SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c); //颜色设置//注:SetConsoleTextAttribute是一个API(应用程序编程接口)
}

颜色大家可以从百度上找到,在这里就不做过多对的叙述。

画出方块部分的内容:

//画出方块
void DrawBlock(int shape, int form, int x, int y)
{int i,j;for ( i = 0; i < 4; i++){for ( j = 0; j < 4; j++){if (block[shape][form].space[i][j] == 1) //如果该位置有方块{CursorJump(2 * (x + j), y + i); //光标跳转到指定位置printf("■"); //输出方块}}}
}

空格覆盖部分的内容:

//空格覆盖
void DrawSpace(int shape, int form, int x, int y)
{int i,j;for ( i = 0; i < 4; i++){for ( j = 0; j < 4; j++){if (block[shape][form].space[i][j] == 1) //如果该位置有方块{CursorJump(2 * (x + j), y + i); //光标跳转到指定位置printf("  "); //打印空格覆盖(两个空格)}}}
}

合法性判断的部分内容:

//合法性判断
int IsLegal(int shape, int form, int x, int y)
{int i,j;for ( i = 0; i < 4; i++){for ( j = 0; j < 4; j++){//如果方块落下的位置本来就已经有方块了,则不合法if ((block[shape][form].space[i][j] == 1) && (face.data[y + i][x + j] == 1))return 0; //不合法}}return 1; //合法

这是今天的最后一部分内容:判断得分与结束:

//判断得分与结束
int JudeFunc()
{//判断是否得分int i,j,m,n;for ( i = ROW - 2; i > 4; i--){int sum = 0; //记录第i行的方块个数for ( j = 1; j < COL - 1; j++){sum += face.data[i][j]; //统计第i行的方块个数}if (sum == 0) //该行没有方块,无需再判断其上的层次(无需再继续判断是否得分)break; //跳出循环if (sum == COL - 2) //该行全是方块,可得分{grade += 10; //满一行加10分color(7); //颜色设置为白色CursorJump(2 * COL + 4, ROW - 3); //光标跳转到显示当前分数的位置printf("当前分数:%d", grade); //更新当前分数for ( j = 1; j < COL - 1; j++) //清除得分行的方块信息{face.data[i][j] = 0; //该位置得分后被清除,标记为无方块CursorJump(2 * j, i); //光标跳转到该位置printf("  "); //打印空格覆盖(两个空格)}//把被清除行上面的行整体向下挪一格for (m = i; m >1; m--){sum = 0; //记录上一行的方块个数for ( n = 1; n < COL - 1; n++){sum += face.data[m - 1][n]; //统计上一行的方块个数face.data[m][n] = face.data[m - 1][n]; //将上一行方块的标识移到下一行face.color[m][n] = face.color[m - 1][n]; //将上一行方块的颜色编号移到下一行if (face.data[m][n] == 1) //上一行移下来的是方块,打印方块{CursorJump(2 * n, m); //光标跳转到该位置color(face.color[m][n]); //颜色设置为还方块的颜色printf("■"); //打印方块}else //上一行移下来的是空格,打印空格{CursorJump(2 * n, m); //光标跳转到该位置printf("  "); //打印空格(两个空格)}}if (sum == 0) //上一行移下来的全是空格,无需再将上层的方块向下移动(移动结束)return 1; //返回1,表示还需调用该函数进行判断(移动下来的可能还有满行)}}}

这是目前所复现的内容,下次会把其他的内容补充完整,并且将全部代码写出来。

(大部分的注释里面也详细的说明了)

C语言课设--俄罗斯方块(上)相关推荐

  1. c语言学生成绩查询课设报告,C语言课设报告(学生考试成绩查询程序)【荐】.doc...

    C语言课设报告(学生考试成绩查询程序)[荐].doc 学生考试成绩查询程序 学号:******** 姓名:***** 完成日期:****年月 通过键盘输入学生的考试信息,包括:学号.姓名.课程名称.学 ...

  2. C语言课设物资管理系统,C语言课设之物资管理系统.doc

    C语言课设之物资管理系统 C语言课程设计 目 录 1.需求分析: 2.系统总框图: 3.每个模块的设计分析: 4.列出所有定义的函数及说明: 5.举例说明1.2个比较有特点的算法: 6.数据分析.完备 ...

  3. 电影院选票系统(C语言课设)

    这里给到大家介绍一个自己写的C语言课设的代码,代码功能不是很完善,只有很基础的增删改查 题目 :电影院选票系统 功能 :放映厅 ,电影信息的 增删改查,以及排序 系统要求实现以下功能: 1.输入功能: ...

  4. c语言售票系统主要函数,c语言课设电影院售票系统.docx

    struct inf { char rate[20]; char name[20]; int time_hour; int time_min; int seat; int sell; }inf[10] ...

  5. c语言打印五角星图案设计报告,C语言课设绘制态五角星.doc

    C语言课设绘制态五角星 目 录 一.设计题目-----------------------2 二.题目内容的描述--------------------应用程序功能的详细说明------------- ...

  6. 北京工业大学 C语言课设

    C语言课设94,使用环境是easyx 做了些拓展,记不清有哪些具体的了,可以看报告或者演示视频. https://download.csdn.net/download/Tainya_/87345807 ...

  7. 网吧管理系统------C语言课设

    网吧管理系统------C语言课设 1.课程设计报告的要求 2.实现管理员注册和登录模块的代码 3.实现管理员对用户的管理功能及简介如下,包括上下机,余额积分加减等功能. 4.主函数 5.存在的不足 ...

  8. c语言课设报告仓库管理系统,c语言课设仓库管理系统.doc

    c语言课设仓库管理系统.doc 高级语言程序设计课程设计小型仓库管理系统题 目班 级学生学号学生姓名 同组成员 指导老师 提交时间 成 绩华南农业大学 信息学院一. 需求分析1 系统概述本系统用于小型 ...

  9. C语言课设心得之倒计时和暂停的实现

    C语言课设心得之倒计时和暂停的实现 前言: 本教程适用的C语言课设游戏类型:需要倒计时和暂停的游戏. 本文章不会耽误任何人做生意! 本人学艺不精,教程可能会有不严谨和错误的地方,希望大家多多批评,在评 ...

最新文章

  1. 缺少 mcrypt 扩展。请检查 PHP 配置。(phpmyadmin)
  2. python class属性
  3. python标准库time_Python 标准库之时间篇
  4. unity3d 可视化编程_R编程系列:R中的3D可视化
  5. windows怎么将图片变为单色图片_印刷丨单色黑与四色黑
  6. 华为cipher解密工具_Android、iPhone和Java三个平台一致的加密工具
  7. 半解TextBox灵异事件背后神秘的深度灵异事件
  8. android 代码混淆配置
  9. MySQL数据类型 int(M) 表示什么意思?详解mysql int类型的长度值问题
  10. eclipse主题颜色的下载与设置
  11. k3 审核流程图_金蝶K3操作流程图详解(doc 64页)
  12. 信息安全管理体系--文件的等级划分
  13. 微信lbs开发java_微信LBS获取
  14. ddos攻击服务器的几种方式
  15. 一文了解肠-器官轴,肠好身体好
  16. Android多窗口分屏(原生方法)
  17. 深耕边缘计算 揭秘阿里云边缘云网一体化的技术实践
  18. 120.阿克曼(Ackmann)函数A(m,n)中,m,n定义域是非负整数(m<=3,n<=10),计算如下函数值
  19. 网站开发进阶(七十):CSS 实现圆角有立体感的 DIV 边框
  20. js身份证号码带*号处理

热门文章

  1. 华为上市被拒:中国有没有高科技公司
  2. jedate日期控件的图标乱码
  3. elementUI的时间选择器-选择日期范围,选择时间后获取时间的格式问题
  4. ESD静电问题终极解决方案
  5. python神经网络,女生颜值打分器(二)
  6. linux yum iso镜像文件,linux yum配置本地iso镜像
  7. openni linux arm,Ubuntu下安装配置OpenNI实战笔记
  8. Neovim开发Golang示例
  9. php扩展Imagick
  10. 手把手教你写stm32f103智能风扇