C语言写俄罗斯方块,可上机运行
当年初学C语言写下的俄罗斯方块,没有华丽的代码,都是一步一步循序渐进写下的。代码绝对唯一!!!(还有会变色的正方形方块噢)
本人思路如下图:
操作方法: 使用英文输入法,字母小写,通过w a s d 四个按键控制。
空格暂停游戏,Esc退出游戏。下面复制代码开始上机运行吧!!!
废话不多说,上代码。同时欢迎有问题的小伙伴在评论区留言。
#include <stdio.h>
#include <windows.h>
#include <time.h>
#include <conio.h>
#include <stdlib.h>#define left 'a'
#define right 'd'
#define down 's'
#define change 'w'int xy[55][25]={0};void shape(); //方块随机形状
void wall(); //游戏边框
void move(); //物块移动
void Change(); //物块改变形状
void Down(); //物块一直做下落运动
void gotoxy(int a, int b); //光标跳转
void gotoprint(int x, int y); //打印物块
void gotodelete(int x, int y); //打印空格来消除物块
void clickcontrol(); // 判断键盘输入
void pause(); //游戏暂停
int color(int c); //颜色
void remove(); //消行
void explation(); //游戏说明
void end(); //游戏结束int i, j, a, b, w_shape, score=0;
char click; //键盘输入的值int main()
{explation();wall();gotoxy(55,3);while (1){ color(6);printf("你的得分是:%d",score);shape();Down();remove();gotoxy(55,3);for(i=12;i<50;i++)if (xy[i][1]==1) {end();break; //只end一个循环}}return 0;
}void explation()
{int i,j = 1;system("cls"); //实现清屏color(13);gotoxy(26,4);printf("按键说明");color(2);for (i = 6; i <= 18; i++) //输出上下边框==={for (j = 15; j <= 60; j++) //输出左右边框||{gotoxy(j-6, i);if (i == 6 || i == 18) printf("=");else if (j == 15 || j == 59) printf("||");}}color(3);gotoxy(12,7);printf("tip1: 玩家可以通过 a,d方向键来移动方块");color(10);gotoxy(12,9);printf("tip2: 通过 w使方块旋转");color(14);gotoxy(12,11);printf("tip3: 通过 s加速方块下落");color(11);gotoxy(12,13);printf("tip4: 按空格键暂停游戏,再按空格键继续");color(4);gotoxy(12,15);printf("tip5: 按ESC退出游戏");color(7);gotoxy(35,17);printf("按任意键进入游戏");getch(); //按任意键返回主界面system("cls");
}
void wall()
{gotoxy(5, 22);color(5);for (i = 10; i < 50; i+=2){gotoxy(i, 22);printf("■");xy[i][22]=1; //有问题xy[i+1][22]=1;gotoxy(50,1);printf("■");}for (i = 1; i < 23; i++){gotoxy(50, i);printf("■");xy[50][i] = 1;xy[51][i] = 1;gotoxy(10,i);printf("■");xy[11][i] = 1;xy[10][i]=1;}
}
void shape()
{srand((unsigned)time(0));w_shape=rand()%7+1;
// w_shape=1;
}
void gotoxy(int x, int y)
{// 更新光标位置 //句柄就好像一个指针?COORD pos; //COORD是一个结构体,表示一个坐标。定义包含在window.s的头文件里HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);//HANDLE就是句柄数据类型。GetStdHandle(STD_OUTPUT_HANDLE)固定格式,获取一个标准输出函数的句柄。pos.X = x;pos.Y = y; //设置坐标SetConsoleCursorPosition(hOutput, pos); //设置控制台光标位置。API中定位光标位置的函数。// 把光标和句柄联系起来?// 隐藏光标CONSOLE_CURSOR_INFO cursor;cursor.bVisible = FALSE;cursor.dwSize = sizeof(cursor);SetConsoleCursorInfo(hOutput, &cursor);
}void Down()
{a = 28;b = 0;for (i = 0; i <= 10; i++){
// clickcontrol();
// for(j=0;j<400000000;j++);b = b + 1;gotoprint(a, b);
// pause();for (j = 0; j < 320000000; j++);if (1){if(w_shape==1){ //形状1if (xy[a-4][b + 1] || xy[a - 2][b + 1] || xy[a ][b + 1] || xy[a + 3][b + 1]){for(i=-4;i<4;i++)xy[a+i][b]= 1;break;}}if (w_shape==2){ //形状2if (xy[a][b + 2] ){for(i=-2;i<2;i++){xy[a][b+i] = 1;xy[a+1][b+i]=1;}break;}}if(w_shape==3){ //形状3if(xy[a][b+2]||xy[a+2][b+2]){for(i=0;i<4;i++){xy[a+i][b]=1;xy[a+i][b+1]=1;}break;}}if(w_shape==4){ //形状4if(xy[a-2][b+2]||xy[a][b+2]||xy[a+2][b+2]){xy[a][b]=1;xy[a+1][b]=1;for(i=0;i<6;i++){xy[a+i-2][b+1]=1;}break;}}if(w_shape==5){ //形状5if(xy[a-2][b+1]||xy[a-1][b+1]||xy[a][b+2]||xy[a+1][b+2]){xy[a-2][b]=1;xy[a-1][b]=1;for(i=-1;i<2;i++){xy[a][b+i]=1;xy[a+1][b+i]=1;}break;}}if(w_shape==6){ //形状6if(xy[a-2][b]||xy[a][b+1]||xy[a+2][b]){xy[a][b]=1;xy[a+1][b]=1;for(i=-2;i<4;i++){xy[a+i][b-1]=1;}break;}}if(w_shape==7){ //形状7if(xy[a+2][b+1]||xy[a+1][b+1]||xy[a][b+2]||xy[a+1][b+2]){xy[a+2][b]=1;xy[a+1][b]=1;for(i=-1;i<2;i++){xy[a][b+i]=1;xy[a+1][b+i]=1;}break;}}}
// clickcontrol();
// pause();gotodelete(a, b);for(j=0;j<10;j++)clickcontrol();}
}void clickcontrol()
{if (_kbhit()){click = _getch();if(click == ' '){gotoprint(a,b+1);pause();}else if (click==27){ //ESC结束游戏end();}elsemove();}
}
void pause()
{char a;while(1){if(_kbhit){a = _getch();if (a==' ')break;}}
}int color(int c)
{SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c); //更改文字颜色return 0;
}void gotoprint(int x, int y)
{int c,b;gotoxy(x, y);color(01);if(w_shape==1){ //形状1 ----gotoxy(x-4,y);for (i = -2; i < 6; i+=2)printf("■");}color(06);if(w_shape==2) //形状2 |for (i = -2; i < 2; i++){gotoxy(x, y + i);printf("■");}color(02);if(w_shape==3) //形状3 田for (i = 0; i < 2; i++){c=rand()%13+1;color(c);gotoxy(x, y + i);printf("■");b=rand()%6+1;color(b);gotoxy(x+2,y+i);printf("■");}color(2);if(w_shape==4){ //形状4 _|_gotoxy(x,y);printf("■");for(i=0;i<6;i+=2){gotoxy(x+i-2,y+1);printf("■");}}color(9);if(w_shape==5){ //形状5 -|gotoxy(x-2,y);printf("■");for(i=-1;i<2;i++){gotoxy(x,y+i);printf("■");}}color(6);if(w_shape==6){ //形状6 -_-gotoxy(x,y);printf("■");for(i=-2;i<4;i+=2){gotoxy(x+i,y-1);printf("■");}}color(4);if(w_shape==7){ //形状7 |-gotoxy(x+2,y);printf("■");for(i=-1;i<2;i++){gotoxy(x,y+i);printf("■");}}
}void gotodelete(int x, int y)
{gotoxy(x, y);if(w_shape==1)for (i = -2; i < 6; i+=2){gotoxy(x-2+i,y);printf(" ");}if(w_shape==2)for (i = -2; i < 2 ; i++){gotoxy(x, y + i);printf(" ");}if(w_shape==3)for (i = 0; i < 2; i++){gotoxy(x, y + i);printf(" ");}if(w_shape==4){gotoxy(x,y);printf(" ");for(i=0;i<6;i+=2){gotoxy(x+i-2,y+1);printf(" ");}}if(w_shape==5){gotoxy(x-2,y);printf(" ");for(i=-1;i<2;i++){gotoxy(x,y+i);printf(" ");}}if(w_shape==6){gotoxy(x,y);printf(" ");for(i=-2;i<4;i+=2){gotoxy(x+i,y-1);printf(" ");}}if(w_shape==7){gotoxy(x+2,y);printf(" ");for(i=-1;i<2;i++){gotoxy(x,y+i);printf(" ");}}}
//要改
void move()
{if (w_shape==1)switch (click){case left:if (!xy[a - 5][b + 1] && !xy[a - 6][b + 1])a -= 2;break;case right:if (!xy[a + 4][b + 1] && !xy[a + 5][b + 1])a += 2;break;case down:if(!xy[a-4][b+2]&&!xy[a-2][b+2]&&!xy[a][b+2]&&!xy[a+2][b+2])b += 1;break;case change:if(!xy[a][b+1] && !xy[a][b+2])Change();break;}else if (w_shape==2)switch (click){case left:if (!xy[a - 2][b + 2] && !xy[a - 1][b + 2])a -= 2;break;case right:if (!xy[a + 2][b + 2] && !xy[a + 1][b + 2])a += 2;break;case down:if(!xy[a][b+3])b += 1;break;case change:if(a>=14&&(!xy[a-4][b+1]&&!xy[a-2][b+1])&&!xy[a][b+1]&&!xy[a+2][b])Change();break;}else if (w_shape==3)switch (click){case left:if (!xy[a - 2][b + 2] && !xy[a - 1][b + 2])a -= 2;break;case right:if (!xy[a + 3][b + 2] && !xy[a + 4][b + 2])a += 2;break;case down:if (!xy[a][b+3]&&!xy[a+1][b+3])b += 1;break;case change:Change();break;}else if(w_shape==4)switch (click){case left:if (!xy[a - 4][b + 2] && !xy[a - 3][b + 2])a -= 2;break;case right:if (!xy[a + 4][b + 2] && !xy[a + 5][b + 2])a += 2;break;case down:if (!xy[a-2][b+3] &&!xy[a][b+3]&&!xy[a+2][b+3])b += 1;break;case change:Change();break;}else if(w_shape== 5)switch (click){case left:if (!xy[a - 3][b + 1] && !xy[a - 4][b + 1] &&!xy[a-1][b+2]&&!xy[a - 1][b + 1])a -= 2;break;case right:if ( !xy[a + 2][b + 1] && !xy[a+2][b+2] &&!xy[a+2][b])a += 2;break;case down:if (!xy[a-2][b+2] &&!xy[a][b+3])b += 1;break;case change:Change();break;}else if(w_shape== 6)switch (click){case left:if (!xy[a - 4][b] && !xy[a - 3][b] &&!xy[a - 1][b + 1] && !xy[a][b + 1])a -= 2;break;case right:if ( !xy[a + 2][b + 1] && !xy[a+2][b+2] &&!xy[a+2][b])a += 2;break;case down:if (!xy[a-2][b+2] &&!xy[a][b+3]&&!xy[a+2][b+2])b += 1;break;case change:Change();break;}else if(w_shape== 7)switch (click){case left:if (!xy[a - 2][b ] && !xy[a - 2][b + 1] &&!xy[a-2][b+2])a -= 2;break;case right:if ( !xy[a + 4][b + 1] && !xy[a+2][b+2] &&!xy[a+2][b])a += 2;break;case down:if (!xy[a+2][b+2] &&!xy[a][b+3])b += 1;break;case change:Change();break;}
}void Change()
{if (w_shape == 1)w_shape = 2;else if (w_shape == 2)w_shape = 1;else if (w_shape == 3)w_shape = 3;else if (w_shape == 4)w_shape = 5;else if (w_shape == 5)w_shape = 6;else if (w_shape == 6)w_shape = 7;else if (w_shape == 7)w_shape = 4;
}void remove()
{int store[55][25]; //point!!!int _i=0;int count=0;for(i=10;i<22;i++){count=0;for(j=12;j<50;j++)if(xy[j][i])count+=1;if(count>=38){_i=i;i=22;break;}}if(count>=38){score+=100;for(j=12;j<50;j++)for(i=0;i<22;i++){store[j][i]=xy[j][i]; //point 因为赋值是单个进行而非一段进行(动态) eg.a[][]={0,1,0}; a[j+1][i]=a[j][i]的结果为a[][]={0,0,0}gotoxy(j,i);
// if(j!=49)printf(" ");}for(j=12;j<50;j++)for(i=0;i<_i;i++){gotoxy(j,i);xy[j][i+1]=store[j][i];
// printf("%d",xy[j][i]);}for(j=12;j<50;j+=2)for(i=2;i<22;i++)if(xy[j][i]==1){ color(j%5+1);gotoxy(j,i);printf("■");}}
}void end()
{color(8);gotoxy(12,4); printf(" ");gotoxy(12,5); printf(" ■■■■ ■ ■ ■■ ");gotoxy(12,6); printf(" ■ ■■ ■ ■ ■ ");gotoxy(12,7); printf(" ■■■ ■ ■ ■ ■ ■ ");gotoxy(12,8); printf(" ■ ■ ■■ ■ ■ ");gotoxy(12,9); printf(" ■■■■ ■ ■ ■■ ");gotoxy(12,10); printf(" ");gotoxy(0,24);while(1);
}
运行结果:
三人行,则必有我师。欢迎小伙伴们一起交流学习。
制作不易,小伙伴们记得给个关注+三连噢!
C语言写俄罗斯方块,可上机运行相关推荐
- 用C语言写俄罗斯方块
用C语言写俄罗斯方块 目录(需求): 1. 屏幕作图与窗口实现: 2. 方块的构造与产生: 3. 方块的移动与翻转: 4. 中断计时与方块自由下落: 5. 判断方块碰撞与消行: 6. 按键 ...
- 在纸上写好一个c语言程序后,上机运行的基本步骤为,c基本概念(选择题).docx
PAGE / NUMPAGES 一.单选题 1.下面叙述中正确的是: (A) 在C语言程序中,main()函数必须放在程序的开始位置 (B) 在C语言程序中,要调用的函数必须在main()函数中定义 ...
- c语言俄罗斯方块视频,c语言自己写俄罗斯方块(完整版)
还记得大笨兔以前在博客发的几篇关于如何使用C语言写俄罗斯方块游戏的文章吗? 当时大笨兔已经将基本的逻辑写完了,但还有两个功能没有加进去:游戏结束和游戏暂停. 所以这次大笨兔抽空就将这两个功能加进去了. ...
- c语言大作业俄罗斯方块,C语言自己写俄罗斯方块(完整版)
还记得大笨兔以前在博客发的几篇关于如何使用C语言写俄罗斯方块游戏的文章吗? 当时大笨兔已经将基本的逻辑写完了,但还有两个功能没有加进去:游戏结束和游戏暂停. 所以这次大笨兔抽空就将这两个功能加进去了. ...
- C语言写的俄罗斯方块
源:C语言写的俄罗斯方块 2014年最后一天, 任天堂将风靡全球30年的经典游戏<<俄罗斯方块>>下架. 作为全球最畅销的游戏, 其移植版本遍布各个平台. 下面这个是我去年在5 ...
- linux c语言俄罗斯方块 头文件,C语言写的俄罗斯方块程序
大概在最近两天之内编码完成,但此前一天开始构思.第一天晚上主要完成了方块旋转算法,第二天也就是今天加了消方块的处理算法.但是可能还有一些考虑不周的地方,比如,没有采用定时中断,而是图方便采用了和cpu ...
- c语言程序字体放大,C语言写的俄罗斯方块程序减小字体 增大字体 作者.docx
C语言写的俄罗斯方块程序减小字体 增大字体 作者 C语言写的俄罗斯方块程序减小字体增大字体作者:佚名来源:不详发布时间:2009-9-21 1:11:22收藏到网摘:合作洽谈大概在最近两天之内编码完成 ...
- C语言在VS2017环境下写俄罗斯方块的感悟
C语言给几乎所有人的印象就是语法太严格.使用太拘谨,错误特别多,纠结太细致.很难提起兴趣来.同时还有如下的巨大弱势: 1:C语言写了很久还是只开发黑窗口程序,看不到实际应用在哪里,严重打击兴趣: 2: ...
- 手把手教你如下在Linux下如何写一个C语言代码,编译并运行
文章目录 手把手教你如下在Linux下如何写一个C语言代码,编译并运行 打开Ubuntu终端 创建 helloworld.c 编译C文件 手把手教你如下在Linux下如何写一个C语言代码,编译并运行 ...
- c语言中 程序各步作用,c程序的上机执行过程_上机运行C程序的步骤与方法
描述 C语言是在国内外广泛使用的一种计算机语言.C语言功能丰富.表达能力强.使用灵活方便.应用面广.目标程序效率高.可移植性好,既具有高级语言的优点,又具有低级语言的许多特点,因此特别适合于编写软件. ...
最新文章
- 云计算介绍 、TCP/IP协议及配置
- OpenCV BRIEF角点检测
- 守护线程与非守护线程的区别
- python-------装饰器
- csv文件导入sqlite
- myeclipse 没有任何问题,可偏偏还报这错。
- webgl 基础渲染demo_游戏引擎养成《二》 引入跨平台渲染库
- Android 自己定义View须要重写ondraw()等方法
- python neo4j嵌入_Neo4j推出基于Python的嵌入式图数据存储
- 服务员就结账了的p8u8
- requirejs 定义模块中含有prototype
- 游戏服务器维护启动需要多久,游戏服务器开机需要多长时间
- 《C++程序设计语言(特别版)》——忠告
- 一个发人深省的经典理财故事
- java jvm参数获取_在java代码中获取JVM参数
- 扇贝离线 android,扇贝单词离线
- LintCode-颜色分类
- 机器学习中的数学——结构化概率模型/图模型
- Android 吸顶布局的写法
- “统计套利”是怎么玩的?可以稳定获利吗?