上接第二部分,下面要说的是最重要的CreateFlag和Gameplay函数
先是CreateFlag

void CreateFlag()
{if(contact==0)//分了两种情况,1和0,为什么分一会就知道了{srand(time(NULL));//srand参数设为time,根据每次打开文件的时间来制定随机数,保证不唯一性pa_tetris=(asd*)malloc(sizeof(asd));//工具指针分配内存pz_tetris=(asd*)malloc(sizeof(asd));//尾指针分配内存pa_tetris->flag=rand()%19+1;//随机并赋值pa_tetris->pnext=NULL;//链表标准,创造了第一个节点pHead_tetris=pa_tetris;pz_tetris=pa_tetris;pa_tetris=(asd*)malloc(sizeof(asd));//重新申请内存,因为要在创出一个节点pa_tetris->flag=rand()%19+1;//随机数,%19+1是为了保证值在1-19之间,因为有19个flagpa_tetris->pnext=NULL;//链表标准,非头节点的创建pz_tetris->pnext=pa_tetris;pz_tetris=pa_tetris;pTemp_tetris=(asd*)malloc(sizeof(asd));//现在创建了2个节点,pTemp代替头节点,指向第一个节点pTemp_tetris=pHead_tetris;}else //else 指定的是一般情况下,即已经在游戏中时,方块链表衔接情况{pTemp_tetris=pz_tetris;pa_tetris=(asd*)malloc(sizeof(asd));pa_tetris->flag=rand()%19+1;pa_tetris->pnext=NULL;pz_tetris->pnext=pa_tetris;pz_tetris=pa_tetris;}
}


因为用链表格式来制作俄罗斯方块,所以一开始不能只创建一个节点就不管了
因为俄罗斯方块,每次游戏界面都会有两个方块,一个是已经在下落的方块,还有一个是画面右侧即将落下的方块作为提示,如果只有一个节点的数据,是没有办法全部表示出来的在Gameplay里会有详细的代码来解释

上图是else 的一般情况链表的情况,也就是说,正在下落的方块是pTemp指针指向的方块,而pz尾指针,每次都会指向屏幕右侧用来提示的方块, 每次有新方块进入游戏的时候,pTemp会代替pz,而pz会指向一个新创建的方块,并将其图像显示在屏幕右侧,这是整个游戏最根本的结构。

也许,不,是肯定有人会问为什么没有看见free()函数来清理掉pa的内存,这样如果方块太多,浪费的内存不也是很多么?这是因为pa和pz进行交互的时候,如果pa内存被消除,pz也被消除了,这样pz尾指针的数据也被消除,所以屏幕右侧的方块也会显示异常,而且没有正确定义的xy坐标,游戏也会瞬间结束。
free()函数的缺点也证明了,其实用链表来写俄罗斯方块是很有缺陷的,内存会一直浪费,其实可以单纯用一个方块结构体,或者循环用两个节点来代表正在下落和即将下落的方块即可。

下面介绍最关键的函数Gameplay()

void Gameplay()
{int n;char ch;//用于接受键盘输入的上下左右contact=0;//运行的条件变量每当运行Gameplay时,代表着游戏重新开始,初始值为0CreateFlag();//用于创建头结点和第二个节点,contact=0的情况speed=300;//初始延迟速度为300msnumber=1;//方块数量初始化score=0;//游戏分数初始化level=1;//游戏等级初始化goto first;//到达first标签下while(1){contact=1;//while循环在游戏中不断循环,Createflag也将运行contact=1的情况CreateFlag();//contact=1first:    pz_tetris->x=FrameX+2*Frame_width+6;//将即将下落方块定位pz_tetris->y=FrameY+10;PrintTetris(pz_tetris);//打印即将落下的方块pTemp_tetris->x=FrameX+Frame_width;//下落方块的定位pTemp_tetris->y=FrameY-1;while(1)//此while用于针对下落方块的一系列操作{label:PrintTetris(pTemp_tetris);      //标记:打印pTemp所指下落方块Sleep(speed);                   //Sleep是延迟函数括号后面单位是msCleanTetris(pTemp_tetris);      //每次都需清理痕迹Temp1=pTemp_tetris->x;          //暂存,如果ifMove为0,重新由Temp12赋值Temp2=pTemp_tetris->flag;  if(kbhit())//conio.h的作用{ch=getch();//接受if(ch==75){pTemp_tetris->x-=2;//方向键左}if(ch==77){pTemp_tetris->x+=2;//方向键右}if(ch==80)//加速向下降落{if(ifMove(pTemp_tetris)!=0){pTemp_tetris->y+2;//y坐标向下两个单位}if(ifMove(pTemp_tetris)==0){pTemp_tetris->y=FrameY+Frame_height-2;//针对已经到游戏下边框的情况}}if(ch==72)//方向键上键变形{if(pTemp_tetris->flag>=2&&pTemp_tetris->flag<=3)//2-3为一种方块的不同形态,同理其他,flag=1是田字格,不用变形{pTemp_tetris->flag++;pTemp_tetris->flag%=2;//保证++之后仍然在2-3之间,其余同理pTemp_tetris->flag+=2;}if(pTemp_tetris->flag>=4&&pTemp_tetris->flag<=7){pTemp_tetris->flag++;pTemp_tetris->flag%=4;pTemp_tetris->flag+=4;}if(pTemp_tetris->flag>=8&&pTemp_tetris->flag<=11){pTemp_tetris->flag++;pTemp_tetris->flag%=4;pTemp_tetris->flag+=8;}if(pTemp_tetris->flag>=12&&pTemp_tetris->flag<=15){pTemp_tetris->flag++;pTemp_tetris->flag%=4;pTemp_tetris->flag+=12;}if(pTemp_tetris->flag>=16&&pTemp_tetris->flag<=19){pTemp_tetris->flag++;pTemp_tetris->flag%=4;pTemp_tetris->flag+=16;}}if(ch==32)//游戏暂停{PrintTetris(pTemp_tetris);while(1){if(kbhit()){ch=getch();if(ch==32){goto label;}}}}if(ch==27)//ESC退出游戏{system("cls");memset(a,0,6400*sizeof(int));welcome();}if(ifMove(pTemp_tetris)==0)//Temp1 和Temp2的作用{pTemp_tetris->x=Temp1;pTemp_tetris->flag=Temp2;}else{goto label;//如果ifMove=1,继续下落过程}} pTemp_tetris->y++;//自然y坐标增加1if(ifMove(pTemp_tetris)==0){pTemp_tetris->y--;//如果不能下落了,消除++PrintTetris(pTemp_tetris);Del_Fullline(pTemp_tetris);//每次下落到不能下落,判断是否已经满行break;}}for(i=pTemp_tetris->y-2;i<pTemp_tetris->y+2;i++)//打印游戏界面是个END{if(i==FrameY){system("cls");gotoxy(29,7);printf("  \n");color(12);printf("\t\t\t▇▇▇▇   ▇    ▇   ▇▇     \n");▇▇▇▇▇▇▇▇printf("\t\t\t▇           ▇▇   ▇  ▇   ▇\n");  ▇▇▇▇printf("\t\t\t▇▇▇   ▇  ▇  ▇  ▇  ▇\n");      ▇▇▇▇printf("\t\t\t▇              ▇  ▇ ▇   ▇  ▇\n");printf("\t\t\t▇▇▇▇   ▇     ▇     ▇▇\n");gotoxy(17,18);color(14);printf("重新玩一局------------1");gotoxy(44,16);printf("不玩了,退出----------2\n");int n;gotoxy(32,20);printf("选择【1/2】:");color(11);scanf("%d",&n);switch(n){case 1:system("cls");Replay();break;case 2:exit(0);break;}}}pTemp_tetris->flag = pz_tetris->flag;//pa和pz的交互pTemp_tetris->x=FrameX+2*Frame_width+6;pTemp_tetris->y=FrameY+10;CleanTetris(pTemp_tetris);//提示框内方块的痕迹}
}

完成了,将代码全部结合在一起就是俄罗斯方块。

如何制作俄罗斯方块(作业第三部分)相关推荐

  1. 如何制作俄罗斯方块(作业第一部分)

    这是用链表结构制作俄罗斯方块的作业.这种结构并不是最适合来做这个游戏的,但是用链表来做,可以提高对链表的理解和对链表的运用能力,自己做的还是比较粗糙,希望大家来学习交流指出意见和建议,一共有三个部分. ...

  2. 标准化作业指导书的作用是什么?如何制作标准化作业指导书?

    如今,市场竞争日益激烈,很多企业为了增强竞争力,制定了生产作业指导书,但是由于这些指导书是凭人为经验制作而成,会出现层次低.质量差,对加工.生产的指导作用不明显的缺陷.而想要在行业中提高竞争力,制定标 ...

  3. 工序作业指导书怎么做?如何制作工序作业指导书?

    随着同类企业数量的增多,行业竞争也在不断加剧,为了更好适应发展,一些企业想到了从数字化管理.降低人力成本等方面去提升企业竞争力.其中工序作业指导书就成为降低人力成本,数字化管理的重要方式,是众多制造企 ...

  4. 如何在 Lightly 用 JavaScript 制作俄罗斯方块游戏

    在之前的两篇文章中,我们通过介绍 Web 语言的编程软件与简易的网页编程实例来说明 HTML/CSS 和 JavaScript 的概况及关系. 如果还未了解过 Web 编程的小伙伴可以先参考前两个文章 ...

  5. ArcEngine C# GIS开发入门作业 (三)Ex04——实现地图的简单渲染和唯一值渲染

    文章评论 写评论 sinat_37432938: 可以说非常有参考的意义,谢谢分享 4周前 #2楼 举报回复查看回复(1) domen_dragon 回复 sinat_37432938: 哈哈,谢谢夸 ...

  6. HTML网页设计制作大作业(div+css) ~中华美德6页面带音乐 ~ 学生网页设计作业源码(中华文化)

    HTML网页设计制作大作业(div+css) ~ 中华美德6页面带音乐 ~ 学生网页设计作业源码(中华文化) 临近期末, 你还在为HTML网页设计结课作业,老师的作业要求感到头大?HTML网页作业无从 ...

  7. HTML网页设计期末课程大作业~旅游住宿酒店的HTML网页设计(14页) ~学生网页设计作业源码 旅游网页代码 学生网页设计与制作期末作业下载 DW旅游网页作业代码下载

    旅游住宿酒店的HTML网页设计14页 ~ 学生网页设计与制作期末作业下载~ 大学生网页设计与制作成品下载 ~DW旅游网页作业代码下载 临近期末, 你还在为HTML网页设计结课作业,老师的作业要求感到头 ...

  8. latex三线表_SAST Weekly | 什么?在实验报告中制作SCI级别的三线表?

    SAST weekly 是由电子工程系学生科协推出的科技系列推送,内容涵盖信息领域技术科普.研究前沿热点介绍.科技新闻跟进探索等多个方面,帮助同学们增长姿势,开拓眼界,每周更新,欢迎关注!欢迎愿意分享 ...

  9. 学生网页作业 榆林子州网站设计—榆林子州-含论文(6页) 榆林子州旅游网页HTML代码 学生网页设计与制作期末作业下载 大学生网页设计与制作成品下载 DW旅行网页作业

    HTML5期末大作业:榆林子州网站设计--榆林子州-含论文(6页) 榆林子州旅游网页HTML代码 学生网页设计与制作期末作业下载 大学生网页设计与制作成品下载 DW旅行网页作业 常见网页设计作业题材有 ...

最新文章

  1. 《大话数据结构》第9章 排序 9.3 冒泡排序(上)
  2. zabbix中mysql连不上的排错_zabbix 安装及简单排错
  3. ASP.NET2.0学习8--WebPart部件
  4. 如何构建一个流量无损的在线应用架构 | 专题尾篇
  5. 中国最大照明企业贱卖给外资 创始人遭下狱 刘强东怒斥:有些人没有道德底线!...
  6. 随想录(对比着c学java)
  7. 【连载】人类唯一的出路:变成人工智能(二)脑机接口
  8. lisp封装成vla函数_[良心教程]分享最新最实用的按键精灵封装函数
  9. mysql表空间自增_Oracle 默认表空间问题及自增变量设置
  10. VBA实现数据库中的字段处理(下划线去掉,后面的字母变大写)之版本1.0。
  11. 理解list和vector的区别
  12. 结构体Sqlist L与Sqlist L的区别
  13. 10个超实用的微信小程序 | 值得推荐的微信小程序
  14. CSS W3C 统一验证工具
  15. 头孢是什么?什么是双硫仑反应?//2021-2-11
  16. fst 共享后缀_trie、FSA、FST(转)
  17. xcode 项目 was compiled with optimization -stepping may behave oddly ;variable may not be available
  18. 使用 springboot 轻松实现网站微信扫码支付以及支付回调逻辑处理(javaJDK实现)
  19. MP4学习(九)ts-mp4源码阅读(7)mdia box的解析
  20. 蓝牙耳机哪款打游戏最好用?值得入手的四款低延迟游戏蓝牙耳机

热门文章

  1. 24小时改变你的人生(16)
  2. 两位数四则混合运算考试题
  3. android 读取短信 彩信,Android 短信转换成彩信的消息数量(实例代码)
  4. 4 路由策略与策略路由
  5. 推荐个无盘服务器,网吧无盘服务器推荐
  6. Android资源目录分模块(基于gradle)
  7. xctfcommand_execution
  8. [数字信号处理]单位冲击响应与频响以及FIR实现代码(C语言)
  9. mysql数据库签到记录表_mysql数据库中表记录的玩法
  10. 面向对象编程是计算机科学的最大错误