Tetris game编程过程
经过了一周多的编译和测试,我的第一个游戏 Tetris终于完成了。程序还很幼稚。
首先说一下此程序的设计思路和运行方式,代码会附加在后文。思路上采用分块编写,分块测试,从简单到复杂的填充式方法。首先,把俄罗斯方块要实现的功能分成单独的部分,分别测试,1.游戏启动2.边框3.四格图案4.下降方式 5.旋转6.左右控制7下降悬停8行满总体下移。
游戏启动还是通过传统的enter载入。而边框则运用二维数组赋值的办法,把目标图案加载到数组里面形成边框。而四格图案的控制则成了瓶颈,经过讨论,决定用坐标法来控制四格图案的位置。而这5种四格图案采用分别赋值坐标的方式。接下来下降的方法则采用由1变0和由0变1的方式来处理,通过循环对每一行的处理成功让其下降。关于旋转由于时间太短没能实现,非常遗憾。日后会再加入这个功能。6.7.8依然采用变换0和1的方法变换不加赘述。
运行方式和俄罗斯方块运行方式一样,左右控制略有区别。A和d键分别控制左右。
接下来说一说当中遇到的问题及解决的过程(可略过):
在实现自由下降后发现一个问题,下降之后总会跑出边框外。这点让我很头疼,后来经过讨论,采用“遇1”停止运行的方式成功避免上诉问题,并且得到启发实现了“悬停”功能。编译后期方块下降时还不能“自由”,熟知的getch()函数已经不能解决问题,然后学长教给我kbhit()的用法,经过调整终于实现“自由”下降。
这次项目学到了很多,也体会到合作的重要性.希望今后会有更大的提高.
总结的不好,程序也很幼稚,欢迎审阅人及读者批评指正。下面是运行代码:#include<iostream>
using namespace std;
#include<conio.h>
#include<stdlib.h>
#include<windows.h>
int main()
{
int date[20][20],i,j,fill,slow;
for(i=0;i<20;i++)
{
date[0][i]=1;
date[19][i]=1;
date[i][0]=1;
date[i][19]=1;
}
//边框赋值用的
int choice,ch,a,b,c,d,e,f,g,h,n=6; //一个图形 四个块坐标
step:choice=n%5;
switch(choice)
{
case 1:a=1;b=9;c=1;d=10;e=1;f=11;g=1;h=12;n++;;break;
case 2:a=1;b=10;c=1;d=11;e=2;f=10;g=2;h=11;n++;;break;
case 3:a=1;b=10;c=2;d=10;e=3;f=10;g=3;h=11;n++;break;
case 4:a=1;b=11;c=2;d=10;e=2;f=11;g=2;h=12;n++;break;
case 0: a=1;b=9;c=2;d=9;e=2;f=10;g=3;h=10;n++;break;
default :;
}
char Direct;
date[a][b]=1; //块的真假 真为有块
date[c][d]=1;
date[e][f]=1;
date[g][h]=1;
while(1)
{
if( kbhit() )
{
ch=getch();
if(ch=='a'&&b!=1) //左移
{
date[a][b]=0;
date[c][d]=0; //先消除
date[e][f]=0;
date[g][h]=0;
date[a][--b]=1;
date[c][--d]=1; //再赋值1
date[e][--f]=1;
date[g][--h]=1;
}
if(ch=='d'&&h!=18) //向右移 同理
{
date[a][b]=0;
date[c][d]=0;
date[e][f]=0;
date[g][h]=0;
date[a][++b]=1;
date[c][++d]=1;
date[e][++f]=1;
date[g][++h]=1;
}
}
switch(choice)
{
case 1:if((date[a+1][b]!=1)&&(date[c+1][d]!=1)&&(date[e+1][f]!=1)&&(date[g+1][h]!=1))
{ date[a][b]=0; //自由下降
date[c][d]=0;
date[e][f]=0;
date[g][h]=0;
date[++a][b]=1;
date[++c][d]=1;
date[++e][f]=1;
date[++g][h]=1;
}
break;
case 2:if((date[e+1][f]!=1)&&(date[g+1][h]!=1))
{date[a][b]=0; //自由下降
date[c][d]=0;
date[e][f]=0;
date[g][h]=0;
date[++a][b]=1;
date[++c][d]=1;
date[++e][f]=1;
date[++g][h]=1;
}
break;
case 3:if((date[e+1][f]!=1)&&(date[g+1][h]!=1))
{date[a][b]=0; //自由下降
date[c][d]=0;
date[e][f]=0;
date[g][h]=0;
date[++a][b]=1;
date[++c][d]=1;
date[++e][f]=1;
date[++g][h]=1;
}
break;
case 4:if((date[c+1][d]!=1)&&(date[e+1][f]!=1)&&(date[g+1][h]!=1))
{date[a][b]=0; //自由下降
date[c][d]=0;
date[e][f]=0;
date[g][h]=0;
date[++a][b]=1;
date[++c][d]=1;
date[++e][f]=1;
date[++g][h]=1;
}
break;
case 0:if((date[c+1][d]!=1)&&(date[g+1][h]!=1))
{ date[a][b]=0; //自由下降
date[c][d]=0;
date[e][f]=0;
date[g][h]=0;
date[++a][b]=1;
date[++c][d]=1;
date[++e][f]=1;
date[++g][h]=1;
}
break;
default :;}
switch(choice)
{
case 1:if((date[a+1][b]==1)||(date[c+1][d]==1)||(date[e+1][f]==1)||(date[g+1][h]==1))
goto step;break;
case 2:if((date[e+1][f]==1)||(date[g+1][h]==1))
goto step;break;
case 3:if((date[e+1][f]==1)||(date[g+1][h]==1))
goto step;break;
case 4:if((date[c+1][d]==1)||(date[e+1][f]==1)||(date[g+1][h]==1))
goto step;break;
case 0:if((date[c+1][d]==1)||(date[g+1][h]==1))
goto step;break;
default :;}
system("CLS");
char blank=32; //边框娃娃头
for(i=0;i<20;i++)
{
for(j=0;j<20;j++)
{
if(date[i][j]==1)
cout<<"■";
else
cout<<blank<<" " ;
}
cout<<endl;
}
Sleep(50);
for(i=1;i<=18;i++)
{ if(date[i][1]==1&&date[i][2]==1&&date[i][3]==1&&date[i][4]==1&&date[i][5]==1&&date[i][6]==1&&date[i][7]==1&&date[i][8]==1&&date[i][9]==1&&date[i][10]==1&&date[i][11]==1&&date[i][12]==1&&date[i][13]==1&&date[i][14]==1&&date[i][15]==1&&date[i][16]==1&&date[i][17]==1&&date[i][18]==1)
{slow=1;
date[i][1]=0;date[i][2]=0;date[i][3]=0;date[i][4]=0;date[i][5]=0;date[i][6]=0;date[i][7]=0;date[i][8]=0;date[i][9]=0;date[i][10]=0;date[i][11]=0;date[i][12]=0;date[i][13]=0;date[i][14]=0;date[i][15]=0;date[i][16]=0;date[i][17]=0;date[i][18]=0;
fill=i;
}
else
slow=0;
}
if(slow==1)
{
for(i=fill-1;i>=1;i--)
{
for(j=1;j<=18;j++)
{
date[i+1][j]=date[i][j];
date[i][j]=0;
}
}
}
}
//输出函数 娃娃头
return 0;
}
Tetris game编程过程相关推荐
- python之禅 中文_《Python之禅》中对于Python编程过程中的一些建议
<Python之禅>中对于Python编程过程中的一些建议 来源:中文源码网 浏览: 次 日期:2018年9月2日 [下载文档: <Python之禅>中对于Pyt ...
- 实例——在编程过程中进行单元测试
这是一个真枪实弹的例子,如何在编程过程中进行单元测试. 本文以一个图书馆的书籍管理系统作为例子,讲述一个单元测试--编码的循环过程.这里只讲述一个独立画面的编写.画面的编码分两个部分,业务数据部分和界 ...
- php里面的socket编程,详解PHP Socket 编程过程
详解PHP Socket 编程过程 作者:PHPYuan 时间:2019-03-13 03:41:20 概述 Socket用于进程间通信.进程间通信通常基于客户端-服务端模型.此时,客户端-服务端是可 ...
- 学习编程过程中-->遇到的错误
文章目录 学习编程过程中-->遇到的错误(吕招焕) 1.java.sql.SQLException: Parameter index out of range (2 > number of ...
- UG编程过程中的几个小技巧
UG编程过程中的几个小技巧 [一.UG运用小技巧] 当平移工作坐标系时经过向下按住ALT键,能够履行准确定位. 制图中,能够在线性尺度上用SHIFT-拖动来创立狭窄型尺度. 能够双击在资源条中的导航器 ...
- c语言错误出在花括号上,初学者在学习c语言编程过程中常出现的错误分析
在高校经常中开设的第一科关于程序设计的语言就是C语言,这种语言有很多优势,比如说使用比较灵活,功能比较强大,可以用于编写程序.软件,但是对于初学者来说, 1 0 8 应用方法论 22第霸 0赫 6乱 ...
- Qt的日常编程过程中遇见的问题和使用
Qt的日常编程过程中遇见的问题和注意 Qt的日常编程过程中遇见的问题 1.QString和String的转化的格式问题,中文转化过程中会出现问题. 2.使用qcustomplot的时候出现错误:LIN ...
- AOP编程过程中的JoinPoint接口
在AOP编程过程中需要使用到的一个 JoinPoint 接口,用来获取调用的信息,下面是这个接口的代码 // // Source code recreated from a .class file b ...
- 编程中python怎么读-对Python新手编程过程中如何规避一些常见问题的建议
这篇文章收集了我在Python新手开发者写的代码中所见到的不规范但偶尔又很微妙的问题.本文的目的是为了帮助那些新手开发者渡过写出丑陋的Python代码的阶段.为了照顾目标读者,本文做了一些简化(例如: ...
最新文章
- 深度学习在推荐系统上的应用
- window.showModalDialog
- sftp取代ftp的之后的权限设置
- uwsgi的log日志中出现错误uWSGI listen queue of socket 4 full。
- TCP/IP及内核参数优化调优(转:https://www.cnblogs.com/jking10/p/5472386.html)
- 笨人可以学计算机吗,为什么有的笨人一旦开窍,其人生就像开了挂似的呢?
- Visual Studio 2015 前瞻 属性初始化赋值!
- ikbc机械键盘打字出现重复_超小无线机械键盘,绝佳移动打字体验
- python定时爬虫_python 每天如何定时启动爬虫任务(实现方法分享)
- 解除ASP.net上传文件大小的限制
- rpm 完全卸载mysql
- 双十一报告:服饰企业借助团队管理工具飞项高效协作
- NLP中文句子类型判别和分类实现
- 牛客(基础位运算)起床困难症
- 超声波清洗机对人体有辐射,有伤害吗?
- 小提琴1234567位置图解_1秒找到小提琴上的每个调音阶
- 在设备后台安装CAB而不让用户发觉
- TS基础-----------get新技能
- 【KVM相关】kvm虚拟化部署配置
- Ubuntu设置桌面背景