1.1javascript基础
Js:javascript的缩写
他和我们以往学习的计算机语言不同。比如java c c++等。这些语言叫做编译语言,而javascript是脚本语言,他直接在浏览器上翻译,不需要翻译。就像我们生活中翻译一样,有两种。一种是文本翻译,一种是实时翻译。
1.2数据类型和变量
数据类型:常见的类型数据有三种
字符串型:用双引号引起来的就是字符串型。string
数值型:js不同于其他语言,只有数值型没有整型和浮点型。Number
布尔型:true or false 用boolean
为什么要用数据类型?
计算机是帮助我们人类解决实际问题的,而我们在生活当中是有数据类型的,只是我们原来没有去区分。计算机要和我们的生活中类型产生映射,这样他才能解决我们的问题。
变量:
生活中有各种各样的名字,他们代表的意义不同,同一个名字也会有不同的值。比如日期。今天日期是17号而明天就变成了18号,同样都是日期。这个就是变量。
在javascript当中使用var去声明一个变量。Js会自动去识别变量的类型。
var name= "潘超琼"
alert(typeof(name));
var age = 22
alert(typeof(age));
var sex =false
alert(typeof(sex));
变量的命名规则:
变量是由字符组成(字母 数字 和特殊字符),变量的开头必须是字母,下划线和¥符。必须遵守的。
见名思意。写代码不是一个人的工作,我们需要和别人合作,所以命名必须要别人看得懂。并且我们写的代码可能别人会直接引用,所以命名也要遵守这个规则。
注:js当中变量可以直接使用,不用声明。但是不建议这样去用。这样不严格,不规范,不安全。
name = "潘超琼"
alert(name);
js当中变量的类型是可以变化的,根据他的值能自动转化。
var age = 18
alert(typeof(age));
age =age+"";
alert(typeof(age));
常用的类型还有对象类型。
用面向对象的思维来说,一切事物皆对象。
在js当中定义对象有两种方式:
第一种:用{}
var person = {
"name":"施婷婷",
"age":18,
"sex":"女"
};
alert(person.name);
第二种:new Object();
var watch = new Objet();
watch.price = 100;
watch.color = "brown";
alert(watch.price);
变量的本质:
变量的本质就是内存单元,内存单元可以存放数据,读取数据。
a = b+3;的含义是将存储在内存单元b中的数据取出,和3相加得到和,再将和存储到内存单元a中。
a= a+1; 的含义是将存储在内存单元a中的数据取出,和1相加得到和,再将和存回到内存单元a中。
内存单元的两个属性:
(1)地址:内存单元的编号
(2)值
指针:地址
1.3 运算符
算数运算符:+ - * / %
+ - * /和生活中的是一样的,但是+有字符串出现就变成了拼接。当一个字符串型值是数字时,+不会改变变量的类型,而其他的运算符会改变变量的类型为数值型再进行运算。
取余运算:就是获取两个数的余数。使用技巧
1. 可以去分解一个数值型的各个位数。
2. 循环控制。
逻辑运算符:
与或非
&& || !
与:两者同时成立。
或:只要有一个成立就可以。
非:成立变成不成立,不成立变成成立。
关系运算符:大于 大于等于 小于 小于等于 等于 和不等于。
等于和生活中的等于是不一样的,js当中等于用==而生活用=(注意养成好习惯)如果是一个常量和一个变量作比较。那么把常量放在前面 可以避免我们犯少写一个=号的错误。
绝对相等和绝对不等:
===(绝对相等) !==(绝对不等)
绝对相等既比较值相等也比较类型相等而相等只比较值相等
赋值运算符:=就叫做赋值运算符
复合赋值运算符:+= -= *= /= %=
var num= 1;
num = num+1;
num +=1;
复合赋值运算符存在的意义就是简捷。
两者在运算上没有任何区别。如果你是不理解num+=1 不要用 就用num=num+1;
var num= 1;
num ++;
num = num+1;
num +=1;
alert(num);
num++和num=num+1原则上也没有区别,同样的也是为了简洁。
位运算符:
程序设计方法
1 基本概念
程序:解决某个问题的步骤
生活中的程序:新生入学报到、做红烧肉
用自然语言来描述
计算机中的程序:重组一个三位数得到最大值
用计算机语言描述的
计算机程序和生活中的程序本质上一样的,只不过描述的语言不同
程序设计:编制解决问题的步骤,要求精通业务,能准确表达
对程序员的要求
(1)自己有解决这个问题的思路
(2)能把自己的思路准确的描述成计算机可执行的程序
那么对于程序员来讲,需要学的也就是两点:
(1) 分析、解决问题的能力
(2) 熟悉某个计算机语言,以便能翻译成计算机代码【学语法】
(3) 重点是(1)
态度、方法、知识
2 程序设计方法
“三步法”
(1) 形成解决问题的思路(换位思考,站在计算机的角度来思考,最为关键)
(2) 用自然语言描述思路
(3) 翻译成某种计算机语言的代码
案例:重组三位数,得到最大值
(1) 提示并接收输入一个三位数
(2) 分别得到百位、十位和个位
(2.1)百位:除以100
(2.2)十位:先对100取余,再除以10
(2.3)个位:对10取余
(3) 找到最大的、最小的和中间的数
用百位、十位、个位的和减去最大的和最小的,就是中间的
(4) 组合出最大值:最大的作为百位,最小的作为个位,中间的作为十位
(5) 输出结果
翻译成代码
var num= Number(prompt("请输入一个三位数"));
var b100 = Math.floor(num/100);
var b10 =Math.floor((num%100)/10);
var b1 =num%10;
var max =Math.max(b100,b10,b1);
var min =Math.min(b100,b10,b1);
var middle = (b100+b10+b1)-(max+min);
var n =max*100+middle*10+min;
alert(n);
心得体会:在解决问题时首先要有一个明确的思路,按照思路一步一步去解决问题,用代码翻译成计算机语言。
海伦公式求三角形面积:(1)定义三角形的三条边
(2)判断这三条边是否能组成三角形
(3) 然后用海伦公式计算三角形的面积
计算三角形面积思路:(1)接收用户输入的三个边长
(2)计算三角形的半周长
(3)利用海伦公式计算面积
(4)打印三角形面积
var a = Number(prompt("请输入第一条边长")) ;
var b =Number(prompt("请输入第二条边长")) ;
var c =Number(prompt("请输入第三条边长")) ;
if(a+b>c &&b+c>a &&a+c>b && a>0 && b>0&&c>0){
var s = (a +b + c) / 2;
var area = Math.sqrt((s -a) * (s - b)* (s - c) * s);
alert(area);
}
else {
("对不起,您输入的三边长不能构成三角形");
}
2 选择结构
2.1if else
一个条件两个分支
水仙花数的判断:一个三位数,如果他的个位十位百位的立方和等于这三个数,那么这个数就是水仙花数。
思路:(1) 首先接收一个三位数
(2)求出这个三位数的个位十位百位
(3)再判断这三位数的立方和加起来是否等于这个三位数
代码:
var num = Number(prompt("请输入一个三位数"));
var b100 =Math.floor(num/100);
var b10 =Math.floor((num%100)/10);
var b1 =num%10;
if(b1*b1*b1 +b10*b10*b10 + b100*b100*b100 ==num){
alert("这个数是水仙花数");
}
else{
alert("这个数不是水仙花数");
}
2.2switch
Switch(){
case:
case:
case: }
Switch优点:1.他的结构清晰。if else是类似于二叉树的结构而switch是平行的结构
3. switch的运行速度较快。他的执行逻辑:从switch()中变量与case中相等的地方开始,一次执行后面的case.并且case不参与运算。不起条件判断作用。他只起到标号的作用。程序会将case预存在内存当中,case就是指那条指令的地址。我们常常将break和switch一起用。用来跳出选择结构。
4. 将百分制转化成5等级制
90分以上为A 80-90为B 70-80为C 60-70为D 60分以下为E
思路:
1. 接收用户输入的分数
2. 将分数的十位或百位分离出来
3. 使用switch对这个分离出来的数进行判断。
可能的情况有 10 9 8 7 6 5 4 3 2 1 0
4. 分别打印出对应的等级。
代码:
var num = Number(prompt("请输入一个分数"));
var num10 =Math.floor(num/10);
var res ='';
switch(num10){
case 10:
res= "A";
break;
case9:
res = "A";
break;
case 8:
res= "B";
break;
case 7:
res= "C";
break;
case 6:
res= "D";
break;
default :
res= "E";
}
alert(num+"对应的等级是"+res);
判断某天是当年的第几天。
用switch语句时,不一定要用break;要根据实际需要去使用break;
var year = Number(prompt("请输入年份"))
var month=Number(prompt("请输入月份"));
var day =Number(prompt ("请输入日期"));
var res =0;
switch (month - 1){
case 11:
res += 30;
case 10:
res += 31;
case 9:
res += 30;
case 8:
res += 31;
case 7:
res += 31;
case 6:
res += 30;
case 5:
res += 31;
case 4:
res += 31;
case 3:
res += 31;
case 2:
if(year%4==0 && year%100!=0 || year%400==0) {
res += 29;}
else{
res += 28;}
case 1:
res += 31;
}
res +=day;
alert(year+"年"+month+"月"+day+"日是今年的第"+res+"天");
2.3 调试:
Js本身没有调试,需要在网页中进行调试。使用f12快捷键或者右击后选择检查进入开发者模式。语法错误会在console窗口下面显示
如何调试?
在进入开发者模式后,可以为js代码设置断点,刷新页面,程序执行到你的断点位置会暂停。然后可以选择单步调试。一步一步往下执行。我们可以在watch添加监听,查看变量值得变化。当这个值没有达到我们的预期,说明那段代码有问题。
调试工具不仅仅是定位错误的工具,也是一个重要的学习工具。因为调试工具可以让我们直观的看到计算机程序的运行轨迹,将抽像化的东西实体化。
3 循环结构
3.1
生活中常常出现这样的场景:
上课:早上起床然后洗漱然后吃早饭然后坐公交然后到达学校上课一直到下午下课回到寝室。这个事情一直到实训结束。
听歌:从歌单里面的第一首歌开始播放,然后播放下一首。一直到最后一首播放完毕。循环结束。
这些场景都有一个共同的特点:有条件的重复做一件事。这件事不同但是类似。
计算机是为了我们解决实际问题。生活中重复的事情,计算机也要有对应的描述。就叫做循环。
while循环当满足什么条件时就做一些事情
也就是条件一直重复的做一件事。
打印所有的水仙花数:
思路:
将100-999的每个数
var i = 100;
var res ="";
while(i<1000) {
var i0 = i %10;
var i10 = Math.floor(i /10) % 10;
var i100 = Math.floor(i /100);
if (i == i0 *i0 * i0 + i10* i10 * i10 + i100* i100 * i100) {
res+= i +" ";
}
i++;
}
alert(res);
2009年美国的GDP总值是142562.75 中国GDP总值是49089.92
美国的增长速率时2% 中国的增长的速率是8% 请问哪一年中国的GDP超过美国。
Var i = 142562.75;
var j =49089.82;
var year =2009;
while(j>i){
i *=1+0.02;
j *=1+0.08;
year++;
}
alert(year);
套路:
初始条件
循环条件
循环体(需要重复做的事情)
为下次循环做准备。
当我们拿到循环问题时,就回答4个问题
出事条件什么样子的
重复做的条件是什么
要重复做什么
如何过度到下一次循环
|
水仙花数 |
GDP问题 |
初始问题 |
var num = 100
|
var i = 142562.75;
|
循环条件是什么 |
Num = 999 |
i>j
|
要重复做的事情 |
判断num是不是水仙花花束 |
a=a(1+2%); year ++ |
为下次循环做准备 |
Num++ |
a=a(1+2%); |
计算圆周率:π = (1-1/3+1/5-1/7.........)计算打算到最后一项的最小值小于0.000001
初始条件:分子是1,分母是1,符号是正
循环条件:当前这个分数于0.000001
循环体:将这个分数加到和里面,
为下次循环做准备:分子不变分母加2 符号变为相反数。
var fenzi= 1;
var fenmu= 1;
var sign = 1;
var pi = 0;
while(fenzi/fenmu>0.000001){}
pi += fenzi /fenmu*sign;
fenmu +=2;
sign += -1;
}
alert("圆周率为:"+pi*4);
for循环
套路和while,循环是一样的,所有的for循能用while来改写。For循环更擅长解决知道具体循环次数的问题。For循环的执行效率要比while高一点。
For(初始条件;循环的条件;为下次循环做准备){
循环体
}
改写水仙花数
var b= 100;
for(var b=100;b<1000;b++){
var b0 =b/10;
var b10 = Math.floor((b/10)%10;
var b100 =Math.floor(b/100);
if(b0*b0*b0+b10*b10*b10+b100*b100*b100){
res+= b + "";
}
alert(res)
判断一个数是否为素数
var num = Number(prompt("请输入一个数"));
var flag =true ;
for(var i=2;i<100;i++){
if(num % i==0){
flag= false;
break;
}
}
if(flag){
alert("这个数是素数");
}else{
alert("这个数不是素数");
}
break是跳出循环结构。
输出100以内的素数
方法一:
var res =" ";
for( var a =2;a<100;a++) {
var flag = true;
for (var i =2; i <a; i++) {
if (a % i ==0) {
flag = false;
break;
}
}
if (flag) {
res+= a+" ";
}
}
alert(res);
第一种方法使用了循环的嵌套,比较复杂。
方法二:
var res = " ";
for(var i=2;i<100;i++){
if(isPrime(i)){
res+=i +" ";
}
}
alert(res);
//函数的功能,【判断一个数是否为素数
函数的名字:isPrime
函数的参数:n
函数的返回值 true/false
function isPrime(n){
for(var j = 2;j<n;j++){
if(n%j == 0){
returnfalse;
}
}
returntrue;
}
方法二将这个问题拆开成了两个简单的问题,看起来会更加清晰。
4 函数和数组
为什么要有函数?
函数就是为了将复杂的问题简单化。将规模较大的问题变成规模较小难度较低的问题。一直按照这个思路拆分下去,直到你认为最后分解的问题足够简单。
函数的定义和调用
Function isPrinme(n){
………
}
Function 函数的声明
isPrime 函数名(命名规则和原则与变量相同)
n 形参
return false 返回值。
isPrime(10) 函数的调用
10 就叫做实参
函数三要素:
函数名:参数:返回值。
用函数解决哥德巴赫猜想(验证10000以内):
代码:
var flag= true;
for(var i=6;i<10000;i+=2){
if(!isGDBH(i)){
flag= false;
break;
}
}
if(flag){
alert("哥德巴赫猜想成立");
}else{
alert("哥德巴赫猜想不成立");
}
/*
*函数的功能:验证一个数是否满足哥德巴赫猜想
* 函数名:isGDBH()
* 函数的参数:一个数
* 返回值:true/false
*
*/
function isGDBH(n){
for(var i=2;i<n;i++){
if(isPrime(i)&&Prime(n-i)){
returntrue;
}
}
returnfalse;
}
function isPrime(n) {
for (var j = 2; j < n; j++) {
if (n% j == 0) {
returnfalse;
}
}
returntrue;
}
函数名名 |
输入参数(数据)à函数 à输出结果
设计一个将一个4位数重新排列得到最大的数的函数。
1. 接收用户输入的一个四位数
2. 得到这个四位数的个位、十位、百位、千位
3. 设计一个从四个数当中获得最大数的函数
设计一个从四个数当中获得第二大的函数
设计一个从四个数当中获得第三大的函数
设计一个从四个数当中获得最小数的函数
分别调用,将最大数*1000 第二大*100 第三大数*10 最小数求和就是排列之后的结果。
算法:
1. 累加和累积
一个小球从100米的高空落下,每次弹起到原来的一半高度。问第十次落地时的小球走过的距离是多少?
100 50 25
代码:
var h= 100;
var s = 100 ;
for( var i =1;i<10;i++)
{
h =h / 2;
s +=h*2;
}
alert(s);
累加的要点:
1. 找到初始条件。
Sum :0;
初始项: e;
2. 确定循环的次数(有时是固定的次数,有的时候是条件)
3. 确定项数的变化。
将每一项加到sum里面得到累加和。
求这个数前20项的累加和(1/2,2/3,3/5,5/8……)
初始条件:sum = 0;
初始项: fenzi = 1; fenmu = 2;
循环20次
项数的变化:下一项的分子为前一项的分母,下一项的分母为前一项的分母和分子之和
var fenzi = 1;
var fenmu = 2;
var s = 0;
for( var i =0;i<20;i++)
{
s +=fenzi/fenmu;
var flag = fenzi;
fenzi = fenmu;
fenmu = fenmu +flag;
}
alert(s);
求两个数的最大公约数;
48 14
48 % 14
14 6
6 2 ==0 2
思路:1.接收用户输入的两个数
当第一个数对第二个数取余为0时,第二个数就是最大公约数
当不为0 时,第一个数的值变为第二个数的值,第二个数值变为之前的余数
一直到两个数取余数为0
辗转法也叫迭代法:
1. 找到要迭代的变量(旧的值 除数和被除数)
2. 迭代的条件(除数和被除数的余数不为0)
3. 迭代的关系(将除数的值赋给被除数,将余数赋值赋给除数)
递推:
兔子产子的问题。
一般而言,兔子出生2个月之后就有了繁殖能力。
假设一对兔子每个月能生出一对小兔子,兔子不死那么问一年后会有多少个兔子
第一个月:1
第二个月:1
第三个月:2
第四个月:3
第五个月:5
第六个月:8
第七个月:13
第八个月:21
第九个月:34
第十个月:55
第十一个月:89
第十二个月:144
月份 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
幼崽 |
1 |
1 |
1 |
2 |
3 |
5 |
8 |
13 |
21 |
成兔 |
0 |
0 |
1 |
1 |
2 |
3 |
5 |
8 |
13 |
总和 |
1 |
1 |
2 |
3 |
5 |
8 |
13 |
21 |
34 |
var rabbit0 =1;
var rabbit1 = 1;
var month= 12;
var s = 0;
for(var i = 2;i<=month;i++){
s =rabbit0+rabbit1;
rabbit0 = rabbit1;
rabbit1 = s;
}
alert(s*2);
一只猴子,第一天摘了若干个桃子,当即吃了一半,觉得不过瘾又多吃了一个。第二天早上又吃掉了一半,又多吃了两个,知道n天早上醒来发现只剩下了一个桃子。问第一天摘了多少个桃子。
假设第五天早上发现只有一个桃子
天数 |
1 |
2 |
3 |
4 |
5 |
桃子的个数 |
120 |
58 |
26 |
10 |
1 |
var days = Number(prompt("请输入天数"));
var s =1;
for(var i=days -1;i>0;i--){
s= (s + i)*2;
}
alert(s);
一个富豪,给了儿子一笔钱。够四年的生活费,他的儿子每个月从里面取3000.年利率是1.71%。问这个富豪一次性存了多少钱。
|
|
|
|
|
|
47 |
48 |
|
|
|
|
|
|
(x-3000)*(1+1.71%/12)=3000 |
3000 |
前一个月的钱数 = 当前的钱数/(1+1.71%/12)+3000
var money = 3000;
var rate= 0.0171/12;
var mongth= 48;
for(var i=mongth - 1;i>0;i--){
money= money/(1+rate)+3000;
}
alert(money);
递推问题:当遇到递推问题时,要找到他的数学规律。比如兔子产子问题。当前项 = 前两项的和。有的时候回到逆推。知道结果去推开始的值。这个时候最好也使用顺着的公式来做然后反推出公式。
确定循环的次数。
鸡翁一值钱5,鸡母一值钱3,鸡雏3值钱一
一百块钱买一百只鸡。请问这三种鸡分别买多少只
方法一:
for(var i=0;i<=20;i++){
for(var j=0;j<=33;j++){
var k=100-i-j;//表示鸡仔的数量
if((100-i-j)%3==0 && (5*i+3*j+(100-i-j)/3)==100){
alert("鸡翁"+i+",鸡母"+j+",鸡仔"+k);
break;
}
}
}
方法二:
for(var gj= 0;gj<=20;gj++){
for(var mj =0;mj<33;mj++){
var xj = 100-gj-mj;
if(gj*5 +mj *3 +xj/3 ==100){
alert("公鸡买" +gj+"母鸡买"+mj+"小鸡买"+xj);
}
}
}
alert(a,b,c);
这就叫做穷举法。当我们遇到问题之后找不到更好的解决方式(数学公式),这个时候我们可以利用计算机速度快的特点将所有的可能全部列出来。在其中找到满足条件的结果。
一个三位数,个位数字比百位大,百位又比十位大,且各个位的数字之和等于各个位数字之和,求着三个数。
for(var gw= 0;gw<10;gw++){
for(var sw=0;sw<10;sw++){
for(var bw=1;bw<10;bw++){
if(gw > bw && bw>sw&& gw+bw+sw ==gw*bw*sw ){
alert(bw*100 +sw*10 + gw);
}
}
}
}
蜘蛛有8条腿,蜻蜓有6条腿和2对翅膀,蝉有6条腿和一对翅膀。三种虫子共有18只,118条腿和20对翅膀请问每种虫子各有多少。
for(var zz=0;zz<14;zz++){
for(var qt=0;qt<10;qt++){
for(var ch =0;ch<19;ch++){
if(zz*8 + qt*6 +ch*6 ==118 && qt*2+ch*1==20 && zz+qt+ch==18){
alert("蜘蛛有: "+zz+ "蜻蜓有:"+qt+ "蝉有:"+ch);
}
}
}
}
递归:
啥叫递归:就是函数本身调用本身
比如求n得阶乘
var steps = 0;
function move(n){
if(1==n){
steps++;
return;
}
else{
move(n-1);
steps++;
move(n-1);
}
}
var num =Number(prompt("请输入盘子的个数"));
move(num);
alert("移动"+num+"个盘子需要的步数为: "+steps);
对待递归:不推荐使用递归,因为他的执行效率太慢。但是对待一些问题,递归能够意想不到的结果。
Canvas;
原素必须写在body中间;
样式要用style标签包围起来并且放在head中间
var canvas= document.getElementById("canvas");
var context=canvas.getContext("2d");
context.beginPath();
context.fillStyle = "yellow";
context.fillRect(0,0,20,20);
document.getElementById();//DOM通过js去获取html中的原素,byId是通过id名去获取。
context=canvas.getContext("2d");//添加一个2d的画笔
context.beginPath();//起笔
context.fillStyle = "yellow";//画笔的样式
context.fillRect(0,0,20,20);//填充一个矩形 第一个参数是他的x轴坐标,第二个参数是他的y轴坐标,第三个参数是他的宽度,第四个参数是他的高度。
事件:
为html添加一个键盘的按下
document.addEventListener("keydown",function(e){
switch(e.keyCode){
case 37:
alert("按下了向左的方向键");
break;
case 39:
alert("按下了向右的方向键");
break;
}
})
document.addEventListener是添加一个事件,第一个参数是事件的名字,第二个参数是回调函数,当这个事件发生时就会执行函数里面的代码
实现小方块移动
把原来的方块清楚掉,然后再画一个新方块
清除画布的方法:
context.clearRect(0,0,200,200);
要掌握举一反三的能力:比如学会了监听键盘的事件,那么同理监听鼠标滚轮得事件也要掌握。这个时候baidu等方式
5贪食蛇游戏
游戏里面有蛇还有事物还有框还有一个游戏的总控
(1) 分析食物对象
食物 |
|||
属性 |
颜色 |
|
color |
行数 |
|
row |
|
列数 |
|
cl |
|
画 |
|
draw |
|
方法 |
初始化 |
随机出现。首先在框内并且不在蛇身上 |
init |
(2) 分析蛇对象
蛇 |
|||
l
属性 |
蛇头颜色 |
|
headcolor |
长度 |
|
length |
|
行数 |
|
Row |
|
列数 |
|
cl |
|
改变方向 |
|
Change direction |
|
蛇身颜色 |
|
Body color |
|
蛇身 |
用一个数组来存储蛇下标为0的位置就是蛇头 蛇身由节点组成,每一个节点有他的横纵坐标 |
body |
|
方法 |
撞墙 |
|
touchGrid |
吃自己 |
|
Eat self |
|
移动 |
|
move |
|
生长 |
本身的长度 |
grow |
|
吃食物 |
蛇头的位置和食物的位置相同就吃到了食物 |
Eat food |
|
初始化 |
|
init |
|
画 |
|
draw |
(3) 分析框对象
框 |
|||
属性 |
大小(格子) |
|
size |
|
行数 |
|
row |
|
列数 |
|
cl |
|
背景颜色 |
|
color |
方法 |
绘制 |
重新画这个框 |
draw |
(4) 分析游戏总控对象
游戏 |
||
方法 |
暂停游戏 |
parse |
开始游戏 |
start |
|
结束游戏 |
end |
|
重新开始游戏 |
restart |
|
设置能否穿墙 |
throughGrid |
|
初始化 |
init |
|
画 |
将这个游戏的所有东西绘制出来 |
|
属性 |
积分 |
score |
速度 |
speed |