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

1:

首先是main.c文件:

#include <stdio.h>
#include <stdlib.h>
#include "game.h"int main()
{gameInit();return 0;
}

2:

然后是mywindows.h文件:

#ifndef MYWINDOWS_H_INCLUDED
#define MYWINDOWS_H_INCLUDED// 封装系统函数-系统调用模块
#include <windows.h>// 初始化句柄
extern void initHandle();// 设置颜色
extern void setColor(int color);// 设置光标位置
extern void setPos(int x, int y);// 设置光标是否可见
extern void setCursorVisible(int flag);// 关闭句柄
extern void closeHandle();#endif // MYWINDOWS_H_INCLUDED

3:

接下来是mywindows.c文件:

#include "mywindows.h"HANDLE handle;// 初始化句柄
void initHandle()
{handle = GetStdHandle(STD_OUTPUT_HANDLE);
}// 设置颜色
void setColor(int color)
{SetConsoleTextAttribute(handle, color);
}void setPos(int x, int y)
{//, ,COORD coord = {x*2, y};SetConsoleCursorPosition(handle, coord);
}// 设置光标是否可见
void setCursorVisible(int flag)
{CONSOLE_CURSOR_INFO info;info.bVisible = flag;   //光标是否可见info.dwSize = 100;      //光标宽度1-100SetConsoleCursorInfo(handle, &info);
}// 关闭句柄
void closeHandle()
{CloseHandle(handle);
}

4:

下面是data.h文件,也就是数据库的存储地址:

#ifndef DATA_H_INCLUDED
#define DATA_H_INCLUDED//函数声明\变量声明
// 存储数据-数据模块
//界面数组
extern int windowShape[25][26];extern int block[7][4][4][4];#endif // DATA_H_INCLUDED

5:

数据库内容:data.c

#include "data.h"//函数的定义int windowShape[25][26] =
{{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
};// 边框为1,游戏池长度为14int block[7][4][4][4] =
{{//Z{}{{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}},{{0,1,0,0},{1,1,0,0},{1,0,0,0},{0,0,0,0}}},{//S{{0,1,1,0},{1,1,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}},{{0,1,1,0},{1,1,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}}},{//L{}{{1,0,0,0},{1,0,0,0},{1,1,0,0},{0,0,0,0}},{{1,1,1,0},{1,0,0,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}}},{//J{{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},{1,0,0,0},{1,0,0,0},{0,0,0,0}},{{1,1,1,0},{0,0,1,0},{0,0,0,0},{0,0,0,0}}},{//I{}{{1,1,1,1},{0,0,0,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}},{{1,1,1,1},{0,0,0,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}}},{//T{{1,1,1,0},{0,1,0,0},{0,0,0,0},{0,0,0,0}},{{0,1,0,0},{1,1,0,0},{0,1,0,0},{0,0,0,0}},{{0,1,0,0},{1,1,1,0},{0,0,0,0},{0,0,0,0}},{{1,0,0,0},{1,1,0,0},{1,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}},{{1,1,0,0},{1,1,0,0},{0,0,0,0},{0,0,0,0}}}};

6:

游戏头部:game.h:

#ifndef GAME_H_INCLUDED
#define GAME_H_INCLUDED// 游戏逻辑模块#include <stdio.h>
#include <time.h>typedef struct{int x;int y;int shape;int status;int color;
}BLOCK;// 定义当前正在下落的方块,和下一个方块
BLOCK curBlock;
BLOCK nextBlock;// 绘制游戏池边框
extern void gamePool(int x, int y);// 打印操作说明
extern void printRule();// 打印分数和等级
extern void printGradeLevel(int num);// 游戏计时
extern void gameTime(clock_t startTime);// 打印一个方块
extern void printBlock(int x, int y, int shape, int status, int color);// 删除一个方块
extern void delBlock(int x, int y, int shape, int status);//方块左移
extern void leftBlock();//方块右移
extern void rightBlock();//方块下移
extern int downBlock();//方块变形
extern void changeBlock();//方块直接落底
extern void bottomBlock();//游戏暂停
extern void pause();//随机产生游戏第一个方块
extern void startBlock();//随机产生下一个方块
extern void blockNext();//拷贝方块:把下一个方块变成当前正在下落的方块
extern void copyBlock();//碰撞检测
extern int crash(int x, int y, int shape, int status);//保存方块
extern void saveBlock();//刷新游戏池
extern void updateGamePool();//消行检测
extern void lineClear();//消行下移
extern void lineDown(int line);// 初始化游戏
extern void gameInit();#endif // GAME_H_INCLUDED

7:

最后一部分,游戏内容,game.c文件:

#include "game.h"
#include "mywindows.h"
#include "data.h"
#include <conio.h>int level = 1;
int grade = 100;// 打印游戏池
void gamePool(int x, int y)
{int i, j;for(i=0;i<25;i++){for(j=0;j<26;j++){if(windowShape[i][j] == 1){setColor(0xc0);setPos(x+j,y+i);printf("  ");   // printf("%2s", "");}}}
}// 打印操作说明
void printRule()
{setColor(0x0f);setPos(31, 9);printf("操作规则:");setPos(32, 11);printf("按a或A左移");setPos(32, 12);printf("按d或D右移");setPos(32, 13);printf("按s或S下移");setPos(32, 14);printf("按w或W变形");setPos(32, 15);printf("按空格暂停");setPos(32, 16);printf("按回车直接下落");}void printGradeLevel(int num)
{switch(num){case 0: break;case 1: grade += 10;break;case 2: grade += 25;break;case 3: grade += 50;break;case 4: grade += 70;break;}//等级-->作业setColor(0x09);setPos(3,6);printf("分数:%d", grade);setColor(0x0a);setPos(3,7);printf("等级:%d", level);
}void gameTime(clock_t startTime)
{//clock_t endTime = clock();//clock_t ti = (endTime-startTime)/CLOCKS_PER_SEC;setColor(0x0d);setPos(3,8);printf("本次游戏运行时间:%ld", (clock()-startTime)/CLOCKS_PER_SEC);
}// 打印一个方块
void printBlock(int x, int y, int shape, int status, int color)
{int i,j;setColor(color);for(i=0;i<4;i++){for(j=0;j<4;j++){if(1 == block[shape][status][i][j]){setPos(x+j,y+i);printf("■");}}}
}// 删除一个方块
void delBlock(int x, int y, int shape, int status)
{int i, j;for(i=0;i<4;i++){for(j=0;j<4;j++){if(1 == block[shape][status][i][j]){setPos(x+j,y+i);printf("  ");   //打印两个空格}}}
}//方块左移
void leftBlock()
{//已经显示的方块删除,改变坐标,重新打印if(crash(curBlock.x-1, curBlock.y, curBlock.shape,curBlock.status) == -1){return;}delBlock(curBlock.x,curBlock.y,curBlock.shape,curBlock.status);curBlock.x -= 1;printBlock(curBlock.x,curBlock.y,curBlock.shape,curBlock.status,curBlock.color);
}//方块右移
void rightBlock()
{if(crash(curBlock.x+1, curBlock.y, curBlock.shape,curBlock.status) == -1){return;}delBlock(curBlock.x,curBlock.y,curBlock.shape,curBlock.status);curBlock.x += 1;printBlock(curBlock.x,curBlock.y,curBlock.shape,curBlock.status,curBlock.color);
}//方块下移
int downBlock()
{if(crash(curBlock.x, curBlock.y+1,curBlock.shape,curBlock.status) == -1){//落到游戏池底部,产生新方块saveBlock();lineClear();updateGamePool();copyBlock();return -1;}else if(crash(curBlock.x, curBlock.y+1,curBlock.shape,curBlock.status) == -2){//游戏结束return -2;}else{delBlock(curBlock.x,curBlock.y,curBlock.shape,curBlock.status);curBlock.y += 1;printBlock(curBlock.x,curBlock.y,curBlock.shape,curBlock.status,curBlock.color);return 0;}}//方块变形
void changeBlock()
{if(crash(curBlock.x, curBlock.y, curBlock.shape, (curBlock.status+1)%4) == -1){return;}delBlock(curBlock.x,curBlock.y,curBlock.shape,curBlock.status);curBlock.status = (curBlock.status+1)%4;printBlock(curBlock.x,curBlock.y,curBlock.shape,curBlock.status,curBlock.color);
}//方块直接落底
void bottomBlock()
{while(1){//流程参考方块下落if(downBlock() !=0){return;}}
}//游戏暂停
void pause()
{//
}//随机产生游戏第一个方块
void startBlock()
{//设置时间为随机数种子srand((unsigned)time(NULL));//初始化curBlockcurBlock.x = 22;curBlock.y = 1;//rand取一个随机整数curBlock.shape = rand()%7;    //0-6curBlock.status = rand()%4;   //0-3curBlock.color = rand()%0x10;if(0x00 == curBlock.color){curBlock.color = 0x0f;}printBlock(curBlock.x, curBlock.y, curBlock.shape,curBlock.status, curBlock.color);
}//随机产生下一个方块
void blockNext()
{//初始化nextBlockdelBlock(nextBlock.x,nextBlock.y,nextBlock.shape,nextBlock.status);nextBlock.x = 34;nextBlock.y = 2;nextBlock.shape = rand()%7;nextBlock.status = rand()%4;nextBlock.color = rand()%0x10;if(0x00 == nextBlock.color){nextBlock.color = 0x0f;}printBlock(nextBlock.x,nextBlock.y,nextBlock.shape,nextBlock.status,nextBlock.color);
}//拷贝方块:把下一个方块变成当前正在下落的方块
void copyBlock()
{//当前方块=下一个方块curBlock = nextBlock;curBlock.x = 22;curBlock.y = 1;printBlock(curBlock.x, curBlock.y, curBlock.shape,curBlock.status, curBlock.color);blockNext();
}//碰撞检测
//x,y为方块的下一个位置, status下一种形态
//碰撞返回-1,未碰撞返回0, 游戏结束返回-2
int crash(int x, int y, int shape, int status)
{int i,j;for(i=0;i<4;i++){for(j=0;j<4;j++){if(block[shape][status][i][j] == 1){if(windowShape[i+y][j+x-15] == 1){//方块一产生就发生碰撞if(curBlock.x == 22 && curBlock.y == 1){return -2;}return -1;}}}}return 0;
}//保存方块
void saveBlock()
{int i,j;for(i=0;i<4;i++){for(j=0;j<4;j++){if(block[curBlock.shape][curBlock.status][i][j] == 1){windowShape[i+curBlock.y][j+curBlock.x-15] = 1;}}}
}//刷新游戏池
void updateGamePool()
{int i,j;//从下到上刷新游戏池for(i=23;i>0;i--){for(j=1;j<15;j++){if(windowShape[i][j] == 1){setColor(0x0e);setPos(j+15,i);printf("■");}else{setColor(0x00);setPos(j+15,i);printf("  ");}}}
}//消行检测
//检测满行->这一行所有值都为1
void lineClear()
{int i,j;int num = 0;    //统计一次消行数目for(i=23;i>0;i--){int total = 0;for(j=1;j<15;j++){total += windowShape[i][j];}if(total == 14){//满行lineDown(i);i += 1;num += 1;}}printGradeLevel(num);
}//消行下移
//从满行的这行开始,上面所有行顺序下移
void lineDown(int line)
{int i,j;for(i=line;i>1;i--){for(j=1;j<15;j++){windowShape[i][j] = windowShape[i-1][j];}}
}// 初始化游戏
void gameInit()
{//第一步,必须初始化句柄//clock_t startTime = clock();initHandle();setCursorVisible(FALSE);gamePool(15,0);printRule();printGradeLevel(0);startBlock();blockNext();//定时开始时间,结束时间,通过控制时间差实现定时clock_t start,stop;start = clock();while(1)        //for(;;){//检测是否有按键按下if(kbhit()){switch(getch()){case 'a':case 'A':case 75:leftBlock();break;case 'd':case 'D':case 77:rightBlock();break;case 's':case 'S':case 80:downBlock();break;case 'w':case 'W':case 72:changeBlock();break;case 32:pause();break;case 13:bottomBlock();break;}}//获取时间stop = clock();if(stop-start>0.5*CLOCKS_PER_SEC){downBlock();//重新计时start = stop;}}
}

好,到现在这个游戏也就结束了!

C语言实现俄罗斯方块代码相关推荐

  1. linux下c语言俄罗斯方块,C语言实现俄罗斯方块源代码

    本文实例为大家分享了C语言实现俄罗斯方块的具体代码,供大家参考,具体内容如下 Head.h #ifndef _HEAD_H_ #define _HEAD_H_ #include #include #i ...

  2. C语言游戏: 俄罗斯方块(Tetris)@兼谈程序优化方法 [源码+exe下载]

    消除重复:如何将程序逻辑与数据分开? ----俄罗斯方块(Tetris)@兼谈程序优化方法 背景提示: 1,数据,是程序设计的根本.因为任何程序都可以看作是一组数据,和作用于其上的一组操作,这也是面向 ...

  3. c语言经典案例 俄罗斯方块,C语言实现俄罗斯方块经典游戏课程设计

    C语言实现俄罗斯方块经典游戏课程设计 计算机实习报告 一.功能说明 1.1总体功能说明 本工程用C++语言实现了俄罗斯方块经典游戏. 俄罗斯方块游戏特点:俄罗斯方块的基本规则是通过键盘控制移动.旋转和 ...

  4. 用C语言写俄罗斯方块

    用C语言写俄罗斯方块 目录(需求): 1.  屏幕作图与窗口实现: 2.  方块的构造与产生: 3.  方块的移动与翻转: 4.  中断计时与方块自由下落: 5.  判断方块碰撞与消行: 6.  按键 ...

  5. 用VB6写的一个简单俄罗斯方块代码

    网络上有很多俄罗斯方块代码.它们大都为了视觉效果,程序比较复杂,不利于学习游戏编程.所以我写了个简单俄罗斯方块代码,尽量用VB本身的功能,没有复杂的DirectX. 下载(注意修改下载后的扩展名) m ...

  6. 微软亚研院副院长周明:从语言智能到代码智能

    11月6日上午,在中国中文信息学会和中国计算机学会联合创办的"语言与智能高峰论坛"上,微软亚洲研究院副院长周明,以<从语言智能到代码智能>为题,介绍了智能代码理解和生成 ...

  7. c语言一行代码太长,C语言修改一行代码,运行效率居然提升数倍,这个技巧你知道吗...

    对编译.链接.OS内核.系统调优等技术感兴趣的童鞋,不妨右上角关注一下吧,近期会持续更新相关方面的专题文章!引言 近日,网上看到一篇文章,分析数组访问的性能问题.文章经过一系列"有理有据&q ...

  8. C语言成绩abc,C语言常用经典代码:求三角形的面积、把百分制成绩转换为ABC等级制、其两个自然数的最大公约数和最小公倍数...

    C语言 经典常用代码 C语言常用经典代码 求三角形的面积. 把百分制成绩转换为ABC等级制. 其两个自然数的最大公约数和最小公倍数. 求输入n个数的平均值. 求一个数各个位上的数字之和. 求n个数的阶 ...

  9. 最值得阅读学习的 10 个 C 语言开源项目代码

    本文转载于: 最值得阅读学习的 10 个 C 语言开源项目代码 从扩展思路的角度来说,一个程序员应该好好读过这样一些代码: 一个操作系统内核 一个编译器(如:gcc,lua) 一个解释器(如:pyth ...

  10. 校运动会c语言程序编写,校运动会管理系统报告C语言(含完整代码)

    <校运动会管理系统报告C语言(含完整代码)>由会员分享,可在线阅读,更多相关<校运动会管理系统报告C语言(含完整代码)(20页珍藏版)>请在人人文库网上搜索. 1.目 录陈一. ...

最新文章

  1. OpenAI教GPT-3学会上网,「全知全能」的AI模型上线了
  2. python项目开发案例-Python项目开发案例集锦 PDF 全彩超清版
  3. Python 面向对象(初级篇) 2015/09/04 · 基础知识 · 2 评论 · 面向对象 分享到: 24 原文出处: 武沛齐 cnblog Python 面向对象(初级篇) 概述
  4. Java IdentityHashMap putAll()方法与示例
  5. Objective-C之MRC、ARC模式下,属性修饰关键字strong、retain、assign、weak的区别和联系...
  6. docker 中用docker 启动应用访问docker中的mysql
  7. 微课|中学生可以这样学Python(8.3节):递推算法例题讲解
  8. Hadoop集群下进行集成测试的小策略
  9. tomcat下配置ssl
  10. 计算机木马不会主动传播什么疾病,研究如何制作自动运行的木马病毒以及如何传播...
  11. narwal机器人_Narwal云鲸扫地机器人自清洗加压拖,省心省力省时
  12. 用while输出1到100的偶数python_用while语句,求1到100的偶数之和
  13. spring注解之@PreDestroy的实现原理
  14. Python列表、元组、字典相关练习题记录——第三天
  15. 程序设计之学生宿舍管理系统
  16. Azure虚拟机计费模式
  17. python语言是多模型语言-Python的语言特点
  18. windows DLL 被修改 案例分析
  19. 微信小程序云开发已授权服务商开发,无法使用云服务
  20. 多路复用机制--Redis为什么这么快

热门文章

  1. C++ 常用代码大全
  2. [计算机网络][内容梳理]四、网络层
  3. springboot集成quzytz(简单易使用复制即可)
  4. Ubuntu 18.04安装: failed to load ldlinux.c32
  5. 《Java语言程序设计与数据结构》编程练习答案(第十九章)(一)
  6. 家庭版完全免费,下面的注册码为:avast! 4 pro(专业版)的
  7. 国内常见的14款低代码平台介绍
  8. 纯html 404页面,一款纯css3实现的漂亮的404页面_html/css_WEB-ITnose
  9. 华为荣耀手机指令代码大全_华为手机指令代码大全
  10. Java自学!java题库网站