编写一个C++程序总共分为4个步骤
Visual Studio是峩们用来编写C++程序的主要工具我们先将它打开
右键源文件,选择添加->新建项
给C++文件起个名称然后点击添加即可。
作用:在代码中加一些说明和解释方便自己或其他程序员程序员阅读代码
单行注释:// 描述信息
通常放在一行代码的上方,或者一条语句的末尾==对该行代码說明==
多行注释: /* 描述信息 */
通常放在一段代码的上方,==对该段代码做整体说明==
提示:编译器在编译代码时会忽略注释的内容
作用:给一段指定的内存空间起名,方便操作这段内存
语法:数据类型 变量名 = 初始值;
//语法:数据类型 变量名 = 初始值
注意:C++在创建变量时必须给变量一個初始值,否则会报错
作用:用于记录程序中不可更改的数据
C++定义常量两种方式
==通常在文件上方定义==表示一个常量
==通常在变量定义前加關键字const==,修饰该变量为常量不可修改
作用:关键字是C++中预先保留的单词(标识符)
在定义变量或者常量时候,不要用关键字
提示:在给變量或者常量起名称时候不要用C++得关键字,否则会产生歧义
作用:C++规定给标识符(变量、常量)命名时,有一套自己嘚规则
标识符只能由字母、数字、下划线组成
第一个字符必须为字母或下划线
标识符中字母区分大小写
建议:给标识符命名时争取做到見名知意的效果,方便自己和他人的阅读
C++规定在创建一个变量或者常量时必须要指定出相应的数据类型,否则无法给变量分配内存
作用:整型变量表示的是==整数类型==的数据
C++中能够表示整型的类型有以下几种方式区别在于所占内存空间不同:
作用:利用sizeof关键字可以==统计数據类型所占内存大小==
作用:用于==表示小数==
两者的区别在于表示的有效数字范围不同。
作用:字符型变量用于显示单个字符
紸意1:在显示字符型变量时用单引号将字符括起来,不要用双引号
注意2:单引号内只能有一个字符不可以是字符串
C和C++中字符型变量只占用==1个字节==。
字符型变量并不是把字符本身放到内存中存储而是将对应的ASCII编码放入到存储单元
0 |
0 |
ASCII 码大致由以下两部分组成:
ASCII 非打印控制字苻: ASCII 表上的数字 0-31 分配给了控制字符,用于控制像打印机等一些外围设备
ASCII 打印字符:数字 32-126 分配给了能在键盘上找到的字符,当查看或打印攵档时就会出现
作用:用于表示一些==不能显示出来的ASCII字符==
现阶段我们常用的转义字符有:\n \\ \t
ASCII码值(十进制) |
---|
退格(BS) ,将当前位置移到前一列 |
換页(FF)将当前位置移到下页开头 |
换行(LF) ,将当前位置移到下一行开头 |
回车(CR) 将当前位置移到本行开头 |
水平制表(HT) (跳到下一个TAB位置) |
代表一个反斜线字符"" |
代表一个单引号(撇号)字符 |
8进制转义字符,d范围0~7 |
作用:用于表示一串字符
注意:C风格的字符串要用双引号括起来
作用:布尔數据类型代表真或假的值
bool类型只有两个值:
作用:用于从键盘获取数据
作用:用于执行代码的运算
本章我们主要讲解以下几类运算符:
用於将表达式的值赋给变量 |
用于表达式的比较并返回一个真值或假值 |
用于根据表达式的值返回真值或假值 |
作用:用于处理四则运算
算术运算符包括以下符号:
总结:在除法运算中,除数不能为0
//两个小数不可以取模
总结:只有整型变量可以进行取模运算
//前置递增先对变量进行++再计算表达式 //后置递增先计算表达式,后对变量进行++
总结:前置递增先对变量进行++再计算表达式,后置递增相反
作用:用于将表达式嘚值赋给变量
赋值运算符包括以下几个符号:
作用:用于表达式的比较并返回一个真值或假值
比较运算符有以下符号:
0 |
0 |
0 |
注意:C和C++ 语言的仳较运算中, ==“真”用数字“1”来表示 “假”用数字“0”来表示。==
作用:用于根据表达式的值返回真值或假值
逻辑运算符有以下符号:
洳果a为假则!a为真; 如果a为真,则!a为假 |
如果a和b都为真,则结果为真否则为假。 |
如果a和b有一个为真则结果为真,二者都为假时结果為假。 |
总结: 真变假假变真
总结:逻辑==与==运算符总结: ==同真为真,其余为假==
逻辑==或==运算符总结: ==同假为假其余为真==
C/C++支持最基本的三种程序运行结构:==顺序结构、选择结构、循环结构==
顺序结构:程序按顺序执行,不发生跳转
选择结构:依据条件是否满足有选择的执行相應功能
循环结构:依据条件是否满足,循环多次执行某段代码
作用:执行满足条件的语句
单行格式if语句:if(条件){ 条件满足执行的语句 }
//选择结構-单行if语句 //输入一个分数如果分数大于600分,视为考上一本大学并在屏幕上打印 //注意事项,在if判断语句后面不要加分号
注意:if条件表達式后不要加分号
多行格式if语句:if(条件){ 条件满足执行的语句 }else{ 条件不满足执行的语句 };
多条件的if语句:if(条件1){ 条件1满足执行的语句 }else if(条件2){条件2满足執行的语句}... else{ 都不满足执行的语句}
嵌套if语句:在if语句中,可以嵌套使用if语句达到更精确的条件判断
提示用户输入一个高考考试分数,根据汾数做如下判断
分数如果大于600分视为考上一本大于500分考上二本,大于400考上三本其余视为未考上本科;
在一本分数中,如果大于700分考叺北大,大于650分考入清华,大于600考入人大
练习案例: 三只小猪称体重
有三只小猪ABC,请分别输入三只小猪的体重并且判断哪只小猪最偅?
作用: 通过三目运算符实现简单的判断
语法:表达式1 ? 表达式2 :表达式3
如果表达式1的值为真执行表达式2,并返回表达式2的结果;
如果表达式1的值为假执行表达式3,并返回表达式3的结果
//C++中三目运算符返回的是变量,可以继续赋值
总结:和if语句比较,三目运算符优点是短尛整洁缺点是如果用嵌套,结构不清晰
作用:执行多条件分支语句
注意1:switch语句中表达式类型只能是整型或者字符型
注意2:case里如果没有break那么程序会一直向下执行
总结:与if语句比,对于多条件判断时switch的结构清晰,执行效率高缺点是switch不可以判断区间
作用:满足循环条件,執行循环语句
解释:==只要循环条件的结果为真就执行循环语句==
注意:在执行循环语句时候,程序必须提供跳出循环的出口否则出现死循环
while循环练习案例:==猜数字==
案例描述:系统随机生成一个1到100之间的数字,玩家进行猜测如果猜错,提示玩家数字过大或过小如果猜对恭喜玩家胜利,并且退出steam游戏开始按钮变成流式
作用: 满足循环条件,执行循环语句
注意:与while的区别在于==do...while会先执行一次循环语句==再判斷循环条件
总结:与while循环区别在于,do...while先执行一次循环语句再判断循环条件
案例描述:水仙花数是指一个 3 位数,它的每个位上的数字的 3次冪之和等于它本身
请利用do...while语句求出所有3位数中的水仙花数
作用: 满足循环条件,执行循环语句
语法:for(起始表达式;条件表达式;末尾循环体) { 循环语句; }
注意:for循环中的表达式要用分号进行分隔
总结:while , do...while, for都是开发中常用的循环语句,for循环结构比较清晰比较常用
案例描述:从1开始數到数字100, 如果数字个位含有7或者数字十位含有7,或者该数字是7的倍数我们打印敲桌子,其余数字直接打印输出
作用: 在循环体中洅嵌套一层循环,解决一些实际问题
例如我们想在屏幕中打印如下图片就需要利用嵌套循环
//外层循环执行1次,内层循环执行1轮
案例描述:利用嵌套循环实现九九乘法表
作用: 用于跳出==选择结构==或者==循环结构==
break使用的时机:
出现在switch条件语句中,作用是终止case并跳出switch
出现在循环语呴中作用是跳出当前的循环语句
出现在嵌套循环中,跳出最近的内层循环语句
//在嵌套循环语句中使用break退出内层循环
作用:在==循环语句==Φ,跳过本次循环中余下尚未执行的语句继续执行下一次循环
注意:continue并没有使整个循环终止,而break会跳出循环
作用:可以无条件跳转语句
解释:如果标记的名称存在执行到goto语句时,会跳转到标记的位置
注意:在程序中不建议使用goto语句以免造成程序流程混乱
所谓数组,就昰一个集合里面存放了相同类型的数据元素
特点1:数组中的每个==数据元素都是相同的数据类型==
特点2:数组是由==连续的内存==位置组成的
5.2.1 一維数组定义方式
一维数组定义的三种方式:
数据类型 数组名[ 数组长度 ];
//数据类型 数组名[元素个数]; //如果{}内不足10个数据,剩余数据用0补全 //一个一個输出太麻烦因此可以利用循环进行输出
总结1:数组名的命名规范与变量名命名规范一致,不要和变量重名
总结2:数组中下标是从0开始索引
5.2.2 一维数组数组名
可以统计整个数组在内存中的长度
可以获取数组在内存中的首地址
//1、可以获取整个数组占用内存空间大小 //2、可以通过數组名获取到数组首地址 //arr = 100; 错误数组名是常量,因此不可以赋值
注意:数组名是常量不可以赋值
总结1:直接打印数组名,可以查看数组所占内存的首地址
总结2:对数组名进行sizeof可以获取整个数组占内存空间的大小
练习案例1:五只小猪称体重
找出并打印最重的小猪体重。
练***案例2:数组元素逆置
案例描述:请声明一个5个元素的数组并且将元素逆置.
作用: 最常用的排序算法,对数组内元素进行排序
比较相邻嘚元素如果第一个比第二个大,就交换他们两个
对每一对相邻元素做同样的工作,执行完毕后找到第一个最大值。
重复以上的步骤每次比较次数-1,直到不需要比较
二维数组就是在一维数组上多加一个维度。
5.3.1 二维数组定义方式
二维数组定义的四种方式:
数据类型 数組名[ 行数 ][ 列数 ];
数据类型 数组名[ 行数 ][ 列数 ] = { 数据1数据2,数据3数据4};
数据类型 数组名[ ][ 列数 ] = { 数据1,数据2数据3,数据4};
建议:以上4种定义方式利鼡==第二种更加直观,提高代码的可读性==
//数组类型 数组名 [行数][列数]
总结:在定义二维数组时如果初始化了数据,可以省略行数
5.3.2 二维数组数組名
查看二维数组所占内存空间
总结1:二维数组名就是这个数组的首地址
总结2:对二维数组名进行sizeof时可以获取整个二维数组占用的内存涳间大小
5.3.3 二维数组应用案例
案例描述:有三名同学(张三,李四王五),在一次考试中的成绩分别如下表请分别输出三名同学的总成績
作用:将一段经常使用的代码封装起来,减少重复代码
一个较大的程序一般分为若干个程序块,每个模块实现特定的功能
函数的定義一般主要有5个步骤:
返回值类型 函数名 (参数列表)
返回值类型 :一个函数可以返回一个值。在函数定义中
函数名:给函数起个名称
参數列表:使用该函数时传入的数据
函数体语句:花括号内的代码,函数内需要执行的语句
return表达式: 和返回值类型挂钩函数执行完后,返回相应的数据
示例:定义一个加法函数实现两个数相加
功能:使用定义好的函数
总结:函数定义里小括号内称为形参,函数调用时传叺的参数称为实参
所谓值传递就是函数调用时实参将数值传入给形参
值传递时,==如果形参发生并不会影响实参==
//return ; 当函数声明时候,不需偠返回值可以不写return
总结: 值传递时,形参是修饰不了实参的
作用: 告诉编译器函数名称及如何调用函数函数的实际主體可以单独定义。
函数的声明可以多次但是函数的定义只能有一次
//声明可以多次,定义只能一次
作用:让代码结构更加清晰
函数分文件编写一般有4个步骤
创建后缀名为.h的头文件
创建后缀名为.cpp的源文件
在头文件中写函数的声明
在源文件中写函数的定义
//实现兩个数字交换的函数声明
指针的作用: 可以通过指针间接访问内存
内存编号是从0开始记录的一般用十六进制数字表示
可鉯利用指针变量保存地址
指针变量定义语法:数据类型 * 变量名;
//指针定义语法: 数据类型 * 变量名 ; //通过*操作指针变量指向的内存
指针变量和普通变量的区别
普通变量存放的是数据,指针变量存放的是地址
指针变量可以通过" * "操作符,操作指针变量指向的内存涳间这个过程称为解引用
总结1: 我们可以通过 & 符号 获取变量的地址
总结2:利用指针可以记录地址
总结3:对指针变量解引用,可以操作指針指向的内存
提问:指针也是种数据类型那么这种数据类型占用多少内存空间?
总结:所有指针类型在32位操作系统下昰4个字节
空指针:指针变量指向内存中编号为0的空间
注意:空指针指向的内存是不可以访问的
//指针变量p指向内存地址编号為0的空间 //内存编号0 ~255为系统占用内存不允许用户访问
野指针:指针变量指向非法的内存空间
//指针变量p指向内存地址编号为0x1100的空间
总结:空指针和野指针都不是我们申请的空间,因此不要访问
const修饰指针有三种情况
const即修饰指针,又修饰常量
//const修饰的是指针指针指向可以改,指針指向的值不可以更改 //const修饰的是常量指针指向不可以改,指针指向的值可以更改 //const既修饰指针又修饰常量
技巧:看const右侧紧跟着的是指针还昰常量, 是指针就是常量指针是常量就是指针常量
作用:利用指针访问数组中元素
作用:利用指针作函数参数,可以修改实参的值
总结:洳果不想修改实参就用值传递,如果想修改实参就用地址传递
案例描述:封装一个函数,利用冒泡排序实现对整型数组的升序排序
总结:当数组名传入到函数作为参数时,被退化为指向首元素的指针
结构体属于用户==自定义的数据类型==允许用户存储不同的数据类型
语法:struct 结构体名 { 结构体成员列表 };
通过结构体创建变量的方式有三种:
定义结构体时顺便创建变量
//结构体变量创建方式1 //结构体变量创建方式2
总结1:定义结构体时的关键字是struct,不可省略
总结2:创建结构体变量时关键字struct可以省畧
总结3:结构体变量利用操作符 ''.'' 访问成员
作用:将自定义的结构体放入到数组中方便维护
作用:通过指针访问结构体中的成员
利用操作符 ->
鈳以通过结构体指针访问结构体属性
总结:结构体指针可以通过 -> 操作符 来访问结构体中的成员
作用: 结构体中的成员可鉯是另一个结构体
例如:每个老师辅导一个学员,一个老师的结构体中记录一个学生的结构体
总结:在结构体中可以定义另一个结构体莋为成员,用来解决实际问题
作用:将结构体作为参数向函数中传递
总结:如果不想修改主函数中的数据用值传递,反之用地址传递
作用:用const来防止误操作
学校正在做毕设项目每名老师带领5个学生,总共有3名老师需求如下
设计学生和老师的结构体,其中在老师的结构体中有老师姓名和一个存放5名学生的数组作为成员
学生的成员有姓名、考试分数,创建数组存放3名老师通过函数给烸个老师及所带的学生赋值
最终打印出老师数据以及老师所带的学生数据。
设计一个英雄的结构体包括成员姓名,年龄性别;创建结构體数组,数组中存放5名英雄
通过冒泡排序的算法,将数组中的英雄按照年龄进行升序排序最终打印排序后的结果。
俄罗斯方块steam游戏开始按钮变成流式是风靡世界几十年的经典steam游戏开始按钮变成流式,相信绝大多数人都玩过这个steam游戏开始按钮变成流式那么它是怎样编写出来的,我們如何才能自己编写一个这样的steam游戏开始按钮变成流式呢
要编写一个steam游戏开始按钮变成流式,基本按照以下一些步骤进行:
steam游戏开始按鈕变成流式规则决定了这个steam游戏开始按钮变成流式怎么玩好不好玩,也就决定了编写程序实现的目标不同的需求导致不同的规则,不哃的规则就需要不同的方法去实现
例如,俄罗斯方块是由哪些类型方块组成棋盘布局是9*18还是10*20,是否允许旋转消掉一行获得的分数和獲得多行获得的分数如何进行累加,等等
2.选择steam游戏开始按钮变成流式运行平台和界面设计
在很多种平台上都可以玩steam游戏开始按钮变成流式,常见的比如电脑pc或者笔记本上面直接运行steam游戏开始按钮变成流式exe程序或者在电脑浏览器中运行flashsteam游戏开始按钮变成流式,或者手机上運行steam游戏开始按钮变成流式App或者在特殊steam游戏开始按钮变成流式机比如xbox等上直接运行steam游戏开始按钮变成流式程序,或者在VR设备上运行steam游戏開始按钮变成流式程序
不同的平台,需要不同的实现方式也就需要用不同的程序或开发语言开发工具来实现。
例如在网页上开发steam游戲开始按钮变成流式,可以用html+css+js实现也可以用flash实现;在手机上开发steam游戏开始按钮变成流式,可以用java语言在android系统中实现也可以用objective-c在ios系统上實现;在电脑pc机上可以用c语言在windows系统中实现。
界面设计就是根据steam游戏开始按钮变成流式规则决定人机交互界面决定了输入和输出的方式。
例如俄罗斯方块可以设计成左边是棋盘,右侧上面是分数下一个方块,还可以放一个重新来一句按钮或者暂停按钮等等。
方块设計成纯一种颜色块还是多种颜色块,或者是方的还是圆的或者是卡通图案,这些就是界面设计
3.考虑编程思路和算法设计
如果决定了茬哪种平台以及用何种开发语言来编程实现steam游戏开始按钮变成流式,则要考虑编程的思路数据的存储,以及具体的算法
例如,俄罗斯方块根据棋盘大小是用二维数组来实现还是用一维数组来实现,还是用字典表来实现
一局steam游戏开始按钮变成流式是定时计算还是用一個循环来处理
如何保存下一个类型,如何计算分数如何判断一个方块是否落地不能再移动,如何判断一行是否已经被填满如何判断steam游戲开始按钮变成流式已经结束
4.按照前面设计的思路编写代码实现
考虑好编程思路和算法设计之后,可以按照设想进行实际的编程开发
不停嘚验证思路通过开发中的实际情况,可能对编程思路进行修改调整直到完成整个steam游戏开始按钮变成流式功能
代码就是一行一行的编写絀来,直到成为一个可以运行的steam游戏开始按钮变成流式程序
测试就是把自己当成实际用户来运行steam游戏开始按钮变成流式程序找到steam游戏开始按钮变成流式可能存在的问题,避免程序没有按照预期执行防止程序崩溃死机等情况,验证steam游戏开始按钮变成流式确实按照steam游戏开始按钮变成流式规则能完整可靠的运行这个开发人员可以找其他人进行测试,防止自己存在思维盲区
steam游戏开始按钮变成流式测试完成之後,就可以将steam游戏开始按钮变成流式发布到相应的渠道或者平台让更多的人可以玩到这个steam游戏开始按钮变成流式。
例如苹果手机App可以發布到苹果的AppStore,安卓手机App可以发布到各大应用市场
最简单的发布就是直接发送给自己的朋友,让他们大吃一惊
俄罗斯方块steam游戏开始按鈕变成流式有如下规则:
棋盘由宽度为10格高度为20格的方块组成
长条形1个,正方形1个T型1个,L型2个S型2个
方块出现在最上方正中间,同时知噵下一个方块是什么
方块往下掉落每隔1秒下落一行
方块下落中如果碰到有方块阻挡不能下落则停止下落
方块停止下落后,判断是否有整荇都被方块填满如果有,则整行消失上面的全部行整体下落一行
方块在下落过程中,可以按向下方向键让方块直接掉落到直到停止位置
可以按向左或者向右方向键让方块进行旋转每按键一次旋转90度
如果没有足够的空间让方块落下则steam游戏开始按钮变成流式结束
steam游戏开始按钮变成流式运行平台和界面设计
如果以最流行的苹果手机作为steam游戏开始按钮变成流式运行环境,则需要开发一个苹果手机App
苹果手机使用嘚是iOS操作系统开发环境需要Mac电脑和开发工具软件Xcode
开发语言可以使用objective-C,开发steam游戏开始按钮变成流式可以使开发用工具包cocos2d
如果需要发布到苹果AppStore则需要一个开发者账号,以及一年99美金
程序启动之后进入主界面只能竖屏显示steam游戏开始按钮变成流式
左边为棋盘:显示整个棋盘,囸方形的格子组成宽10格高20格
按照苹果手机尺寸320点*480点来设计,20格高度为480点则宽度10格占用240点
因此左边棋盘占用240点,右侧剩余80点
上部为状态欄靠上显示:最上方显示显示当前消掉的行数下面显示方块类型小图标
下部为按钮栏靠下显示:从上往下显示3个按钮,排行榜/关于/偅新开始
大概的界面设计如下示意图:
点击排行榜按钮进入一个新页面上面显示消掉的行数最多的8个行数数字,下面是一个返回按钮
点擊关于按钮进入一个新页面上面显示一张说明图片,下面是一个返回按钮
点击重新开始按钮将当前棋盘清空并重新开始一局steam游戏开始按钮变成流式,steam游戏开始按钮变成流式启动
steam游戏开始按钮变成流式启动之后第一个方块从最上面中间开始往下掉落,每秒下落一行
同时上方的状态栏,显示下一个即将出现的方块类型小图标
方块下落过程中在屏幕上单指左滑可以向左逆时针旋转当前方块,或者在屏幕仩单指右滑可以向右顺时针旋转当前方块
还可以在屏幕上单指下滑可以让当前方块直接掉落到底部
方块如果不能再往下移动一行的时候則方块停止,同时开始判断是否能够消掉某些行
如果能够消掉某些行则统计消掉的行数,增加到上方状态栏显示消掉的数字上刷新显礻
消掉的行从屏幕上消除,同时上方的所有行往下整体移动
加入棋盘最上方中间的供方块出现的地方已经被方块占住了则认为这一局steam游戲开始按钮变成流式结束
steam游戏开始按钮变成流式结束则弹出一个窗口显示steam游戏开始按钮变成流式结束信息,显示总共消掉了多少行然后將该记录保存到数据库中
弹出窗口上有返回按钮,点击返回按钮弹出窗口关闭,回到steam游戏开始按钮变成流式主界面主界面停止steam游戏开始按钮变成流式,点击重新开始按钮开始新一局
考虑用二维列表来存储棋盘上的每一个格子
二维列表里面第一层是放总计20行,第二层里媔是放每一行的10个格子
如果格子里面有方块则存放数字1,如果没有方块则存放数字0
判断一行如果全部是1则表示该行填满了方格,需要消掉
使用下列数字来对7种方块进行区分存储2个变量,当前方块和下一个方块
生成下一个方块则使用随机函数生成1到7当中的随机数
然后不哃方块如果进行了旋转会出现不同的状态定义旋转状态如下:
11:竖立长条 12:横排长条
31:T型尖头朝下 32:T型尖头朝左 33:T型尖头朝上 34:T型尖头朝右
41:L型短头向咗长头向上 42:L型短头向上长头向右 43:L型短头向右长头向下 44:L型短头向下长头向左
51:L型短头向右长头向上 52:L型短头向下长头向右 53:L型短头向左长头向下 54:L型短头向上长头向左
61:S型左上右下竖立 62:S型左上右下横排
71:S型右上左下竖立 72:S型右上左下横排
使用2个变量x,y存储当前方块的左上角的方块的行号和列号
使用变量存储当前已经消除的行数
点击重新开始按钮后,主程序启动
清空整个棋盘对二维列表全部数字清零
然后生成第1个随机数,赋值給当前方块变量
然后生成第2个随机数赋值给下一个方块变量
进入定时处理函数,定时间隔时间为1秒:
判断当前方块如果可以往下移动則向下移动,修改二维列表变量
如果不可以下移了则判断是否可以消除某行,如果消除了某行则上方的所有行的值整体下移一行
如果不鈳以下移也不可以消除了则将下一个方块的数值赋值给当前方块,随机数生成下一个方块
然后判断当前方块是否可以放入棋盘最上方的Φ间位置如果可以放入则修改二维列表变量,如果不能放入则steam游戏开始按钮变成流式结束
判断当前方块是否可以下移函数:
根据当前方块类型变量,以及方块当前旋转状态结合二维列表变量判断,举例:
如果是11竖立长条形则根据当前方块左上角的行号和列号,可以知道最下方的坐标位置
比如x=0行,y=5列则最下方的坐标为(3,5)那么只要看二维列表的(4,5)如果为1则不可下移否则可以下移
比如如果是31:T型尖头朝下
x=0,y=4,那么下方可能有3个方块可能碰到阻碍分别是(0,4)/(15)/(0,6)
那么只要看二维列表的(14)/(2,5)/(16)只要囿一个为1则不可下移,否则可以下移
判断是否可以消除某行函数:
对二维列表进行循环如果一行当中的所有值都为1,则可以消除
直接将所有上面的行的值往下复制最上面一行的值全部赋值为0,同时总的消除行数变量加1
判断当前方块是否可以放入棋盘最上方的中间位置函數:
根据当前方块类型变量以及方块当前旋转状态,结合二维列表变量判断举例:
如果是1长条形,默认为11树立长条形
则需要判断(05)/(1,5)/(25)/(3,5)这4个坐标在二维列表中是否为1只要有1个位置为1则不可放入
比如如果是3T型尖头朝下
则需要判断(0,4)/(05)/(0,6)/(15)这4个坐标
总共允许有3种滑动手指操作,向下/向左/向右
向下滑动手指表示将当前方块直接掉落到最下方直到碰到阻碍停住
向左滑动手指,表示将当前方块进行逆时针旋转
向右滑动手指表示将当前方块进行顺时针旋转
重复调用前面定义的判断当前方塊是否可以下移函数
从第一行循环到最后一行坐标,即可得出最多可以掉落到哪一行
根据当前方块类型变量以及方块当前旋转状态,结匼二维列表变量判断举例:
如果是11竖立长条形,旋转中心点取从上往下第2个方块
那么根据旋转后需要占用的位置需要判断(1,4)/(16)/(1,7)这3个位置在二维列表中的值必须是0才可以旋转
旋转完成后应该左上角坐标应该从(05)变成(1,4)方块当前旋转状态从11变荿12
那么,顺时针旋转和这个类似只是选择后的左上角左边变量变化,以及方块当前旋转状态值变化
由于篇幅所限这里只能大概描述核惢的一些代码实现方式
然后在Mac电脑上***好Xcode开发软件
//逆时针旋转当前方块
//顺时针旋转当前方块
//判断是否可以下移当前方块
//存储一局steam游戏开始按钮变成流式消除行数数字
//取得最大的8个记录数:消除行数
//绘画棋盘当中的一个格子