一个方块Z破解版一个T在一个Z怎么打一个桥?

2013年年底的时候,我看到了网上流传的一个叫做《Java面试题大全》的东西,认真的阅读了以后发现里面的很多题目是重复且没有价值的题目,还有不少的参考答案也是错误的,于是我花了半个月时间对这个所谓的《Java面试大全》进行了全面的修订并重新发布在我的CSDN博客。在修订的过程中,参照了当时JDK最新版本(Java 7)给出了题目的答案和相关代码,去掉了EJB

 * 排序器接口(策略模式: 将算法封装到具有共同接口的独立的类中使得它们可以相互替换)

95、用Java写一个折半查找。
答:折半查找,也称二分查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组已经为空,则表示找不到指定的元素。这种搜索算法每一次比较都使搜索范围缩小一半,其时间复杂度是O(logN)。

说明:上面的代码中给出了折半查找的两个版本,一个用递归实现,一个用循环实现。需要注意的是计算中间位置时不应该使用(high+low) / 2的方式,因为加法运算可能导致整数越界,这里应该使用以下三种方式之一:low + (high -low) / 2或low + (high – low) >> 1或(low + high)

北京市东方爱婴咨询面试题

6.阐述所用到的框架的优缺点?

7.打印自然数N以内的所有质数?

8.阐述你对单点登录的理解?

创原天地Java笔试题目

Throwable的子类,用于指示一种合理的程序想去catch的条件。即它仅仅是一种程序运行条件,而非严重错误,并且鼓励用户程序去catch它。

ParseException等。检查了的异常发生在编译阶段,必须要使用try…catch(或者throws)否则编译不通过。
unchecked exceptions: 
通常是如果一切正常的话本不该发生的异常,但是的确发生了。发生在运行期,具有不确定性,主要是由于程序的逻辑问题所引起的。比如ArrayIndexOutOfBoundException, ClassCastException等。从语言本身的角度讲,程序不该去catch这类异常,虽然能够从诸如RuntimeException这样的异常中catch并恢复,但是并不鼓励终端程序员这么做,因为完全没要必要。因为这类错误本身就是bug,应该被修复,出现此类错误时程序就应该立即停止执行。因此,面对Errorsunchecked exceptions应该让程序自动终止执行,程序员不该做诸如try/catch这样的事情,而是应该查明原因,修改代码逻辑。

处理RuntimeException的原则是:如果出现RuntimeException,那么一定是程序员的错误。例如,可以通过检查数组下标和数组边界来避免数组越界访问异常。其他(IOException等等)checked异常一般是外部错误,例如试图从文件尾后读取数据等,这并不是程序本身的错误,而是在应用环境中出现的外部错误。 

3. 下面程序的运行结果是()

解析:因为str2中的llo是新申请的内存块,而==判断的是对象的地址而非值,所以不一样。如果是String str2

4.下列说法正确的有()

解析:这里可能会有误区,其实普通的类方法是可以和类名同名的,和构造方法唯一的区分就是,构造方法没有返回值。

5. 具体选项不记得,但用到的知识如下:

6. 下面程序的运行结果:()

解析:这里考的是Thread类中start()run()方法的区别了。start()用来启动一个线程,当调用start方法后,系统才会开启一个新的线程,进而调用run()方法来执行任务,而单独的调用run()就跟调用普通方法是一样的,已经失去线程的特性了。因此在启动一个线程的时候一定要使用start()而不是run()

7. 下列属于关系型数据库的是()

一种是关系数据库,典型代表产品:DB2

另一种则是层次数据库,代表产品:IMS层次数据库。

8. GC线程是否为守护线程?()

解析:线程分为守护线程和非守护线程(即用户线程)。

只要当前JVM实例中尚存在任何一个非守护线程没有结束,守护线程就全部工作;只有当最后一个非守护线程结束时,守护线程随着JVM一同结束工作。

守护线程最典型的应用就是 GC (垃圾回收器)

9. volatile关键字是否能保证线程安全?()

解析:volatile关键字用在多线程同步中,可保证读取的可见性,JVM只是保证从主内存加载到线程工作内存的值是最新的读取值,而非cache中。但多个线程对

volatile的写操作,无法保证线程安全。例如假如线程1,线程2 在进行read,load 操作中,发现主内存中count的值都是5,那么都会加载这个最新的值,在线程1堆count进行修改之后,会write到主内存中,主内存中的count变量就会变为6;线程2由于已经进行read,load操作,在进行运算之后,也会更新主内存count的变量值为6;导致两个线程及时用volatile关键字修改之后,还是会存在并发的情况。

10. 下列说法正确的是()

解析:下面是一张下载的Java中的集合类型的继承关系图,一目了然。

解析:如果iint型,那么当iint能表示的最大整数时,i+1就溢出变成负数了,此时不就<i了吗。

解析:默认为double型,如果为float型需要加上f显示说明,即0.6332f

13. 面哪个流类属于面向字符的输入流(  )

面向字节的操作为以8位为单位对二进制的数据进行操作,对数据不进行转换,这些类都是InputStream和OutputStream的子类。
面向字符的操作为以字符为单位对数据进行操作,在读的时候将二进制数据转为字符,在写的时候将字符转为二进制数据,这些类都是Reader和Writer的子类。

扩展:Java流类图结构,一目了然,解决大部分选择题:

14. Java接口的修饰符可以为()

解析:接口很重要,为了说明情况,这里稍微啰嗦点:

(1)接口用于描述系统对外提供的所有服务,因此接口中的成员常量和方法都必须是公开(public)类型的,确保外部使用者能访问它们;

(2)接口仅仅描述系统能做什么,但不指明如何去做,所以接口中的方法都是抽象(abstract)方法;

(3)接口不涉及和任何具体实例相关的细节,因此接口没有构造方法,不能被实例化,没有实例变量,只有静态(static)变量;

4接口的中的变量是所有实现类共有的,既然共有,肯定是不变的东西,因为变化的东西也不能够算共有。所以变量是不可变(final)类型,也就是常量了。

5 接口中不可以定义变量?如果接口可以定义变量,但是接口中的方法又都是抽象的,在接口中无法通过行为来修改属性。有的人会说了,没有关系,可以通过实现接口的对象的行为来修改接口中的属性。这当然没有问题,但是考虑这样的情况。如果接口 A 中有一个public 访问权限的静态变量 a。按照 Java 的语义,我们可以不通过实现接口的对象来访问变量 a,通过 A.a = xxx; 就可以改变接口中的变量 a 的值了。正如抽象类中是可以这样做的,那么实现接口 A 的所有对象也都会自动拥有这一改变后的 a 的值了,也就是说一个地方改变了 a,所有这些对象中 a 的值也都跟着变了。这和抽象类有什么区别呢,怎么体现接口更高的抽象级别呢,怎么体现接口提供的统一的协议呢,那还要接口这种抽象来做什么呢?所以接口中不能出现变量,如果有变量,就和接口提供的统一的抽象这种思想是抵触的。所以接口中的属性必然是常量,只能读不能改,这样才能为实现接口的对象提供一个统 一的属性。

通俗的讲,你认为是要变化的东西,就放在你自己的实现中,不能放在接口中去,接口只是对一类事物的属性和行为更高层次的抽象。对修改关闭,对扩展(不同的实现 implements)开放,接口是对开闭原则的一种体现。

接口中不可以定义变量即只能定义常量(加上final修饰就会变成常量)。所以接口的属性默认是public static final 常量,且必须赋初值

15. 不通过构造函数也能创建对象吗()

解析:Java创建对象的几种方式(重要):

(1) new语句创建对象,这是最常见的创建对象的方法。

(1)(2)都会明确的显式的调用构造函数(3)是在内存上对已有对象的影印,所以不会调用构造函数(4)是从文件中还原类的对象,也不会调用构造函数。

解析:这里有点迷惑人,大家都知道默认ArrayList的长度是10个,所以如果你要往list里添加20个元素肯定要扩充一次(扩充为原来的1.5倍),但是这里显示指明了需要多少空间,所以就一次性为你分配这么多空间,也就是不需要扩充了。

17. 下面哪些是对称加密算法()

解析:常用的对称加密算法有:DES3DESRC2RC4AES

常用的非对称加密算法有:RSADSAECC

使用单向散列函数的加密算法:MD5SHA

18.新建一个流对象,下面哪个选项的代码是错误的?()

解析:请记得13题的那个图吗?Reader只能用FileReader进行实例化。

19. 下面程序能正常运行吗()

解析:输出为haha,因为null值可以强制转换为任何java类类型,(String)null也是合法的。但null强制转换后是无效对象,其返回值还是为null,而static方法的调用是和类名绑定的,不借助对象进行访问所以能正确输出。反过来,没有static修饰就只能用对象进行访问,使用null调用对象肯定会报空指针错了。这里和C++很类似。这里感谢@网友解答。

20. 下面程序的运行结果是什么()

解析:说实话我觉得这题很好,考查静态语句块、构造语句块(就是只有大括号的那块)以及构造函数的执行顺序。

对象的初始化顺序:(1)类加载之后,按从上到下(从父类到子类)执行被static修饰的语句;(2)当static语句执行完之后,再执行main方法;(3)如果有语句new了自身的对象,将从上到下执行构造代码块、构造器(两者可以说绑定在一起)。

下面稍微修改下上面的代码,以便更清晰的说明情况:

21. getCustomerInfo()方法如下,try中可以捕获三种类型的异常,如果在该方法运行中产生了一个IOException,将会输出什么结果()

解析:考察多个catch语句块的执行顺序。当用多个catch语句时,catch语句块在次序上有先后之分。从最前面的catch语句块依次先后进行异常类型匹配,这样如果父异常在子异常类之前,那么首先匹配的将是父异常类,子异常类将不会获得匹配的机会,也即子异常类型所在的catch语句块将是不可到达的语句。所以,一般将父类异常类即Exception老大放在catch语句块的最后一个。

22. 下面代码的运行结果为:()

A 代码得到编译,并输出“s=”

B 代码得到编译,并输出“s=null”

C 由于String s没有初始化,代码不能编译通过

解析:开始以为会输出null什么的,运行后才发现Java中所有定义的基本类型或对象都必须初始化才能输出值。

解析:没啥好说的,Java会自动将2转换为字符串。

解析:大家可能以为Java中String和数组都是对象所以肯定是对象引用,然后就会选D,其实这是个很大的误区:因为在java里没有引用传递,只有值传递

这个值指的是实参的地址的拷贝,得到这个拷贝地址后,你可以通过它修改这个地址的内容(引用不变),因为此时这个内容的地址和原地址是同一地址,

但是你不能改变这个地址本身使其重新引用其它的对象,也就是值传递,可能说的不是很清楚,下面给出一个完整的能说明情况的例子吧:

程序有些啰嗦,但能反映问题,该程序运行结果为:

基本类型数组内容交换并改变后:a[1]= 5

基本类型数组内容交换并改变后:b[1]= 1

说明:不管是对象、基本类型还是对象数组、基本类型数组,在函数中都不能改变其实际地址但能改变其中的内容。

n)作用是跳过n个字节不读,主要用在包装流中的,因为一般流(如FileInputStream)只能顺序一个一个的读不能跳跃读,但是包装流可以用skip方法跳跃读取。那么什么是包装流呢?各种字节节点流类,它们都只具有读写字节内容的方法,以FileInputStream与FileOutputStream为例,它们只能在文件中读取或者向文件中写入字节,在实际应用中我们往往需要在文件中读取或者写入各种类型的数据,就必须先将其他类型的数据转换成字节数组后写入文件,或者从文件中读取到的字节数组转换成其他数据类型,想想都很麻烦!!因此想通过FileOutputStream将一个浮点小数写入到文件中或将一个整数写入到文件时是非常困难的。这时就需要包装类DataInputStream/DataOutputStream,它提供了往各种输入输出流对象中读入或写入各种类型的数据的方法。

in)。包装类也可以包装另外一个包装类。

首先BC肯定 是错的,那A正确吗?按上面的解析应该也不对,但我试了下,发现A也是正确的,与网上解析的资料有些出入,下面是我的code:

那么D呢,RandomAccessFile是IO包的类,但是其自成一派,从Object直接继承而来。可以对文件进行读取和写入。支持文件的随机访问,即可以随机读取文件中的某个位置内容,这么说RandomAccessFile肯定可以达到题目的要求,但是选项有些错误,比如RandomAccessFile的初始化是两个参数而非一个参数,采用的跳跃读取方法是skipBytes()而非skip(),即正确的写法是:

这样也能读到第十个字节,也就是A和D都能读到第十个字节,那么到底该选哪个呢?A和D有啥不同吗?求大神解答~~~

26. 下列哪种异常是检查型异常,需要在编写程序时声明 ()

解析:看第2题的解析。

27. 下面的方法,当输入为2的时候返回值是多少?()

解析:注意这里case后面没有加break,所以从case 2开始一直往下运行。

28. 选项中哪一行代码可以替换题目中//add code here而不产生编译错误?()

解析:考察抽象类的使用。

1abstract关键字只能修饰类和方法,不能修饰字段。

2)抽象类不能被实例化(无法使用new关键字创建对象实例),只能被继承。

3)抽象类可以包含属性,方法,构造方法,初始化块,内部类,枚举类,和普通类一样,普通方法一定要实现,变量可以初始化或不初始化但不能初始化后在抽象类中重新赋值或操作该变量(只能在子类中改变该变量)。

4)抽象类中的抽象方法(加了abstract关键字的方法)不能实现。

5)含有抽象方法的类必须定义成抽象类。

扩展:抽象类和接口的区别,做个总结吧:

1)接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的,而抽象类是可以有私有方法或私有变量的。

语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface,实现多重继承。接口还有标识(里面没有任何方法,如Remote接口)和数据共享(里面的变量全是常量)的作用。

中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是 static final的,不过在 interface中一般不定义数据成员),所有的成员方法默认都是 public abstract 类型的。

5)实现接口的一定要实现接口里定义的所有方法,而实现抽象类可以有选择地重写需要用到的方法,一般的应用里,最顶级的是接口,然后是抽象类实现接口,最后才到具体类实现。抽象类中可以有非抽象方法。接口中则不能有实现方法。

6)接口中定义的变量默认是public static final型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以在子类中重新赋值。

解析:这里有详细的解释:

30.下面是People和Child类的定义和构造方法,每个构造方法都输出编号。在执行new Child("mike")的时候都有哪些构造方法被顺序调用?请选择输出结果 ( )

解析:考察的又是父类与子类的构造函数调用次序。在Java中,子类的构造过程中必须调用其父类的构造函数,是因为有继承关系存在时,子类要把父类的内容继承下来。但如果父类有多个构造函数时,该如何选择调用呢?

第一个规则:子类的构造过程中,必须调用其父类的构造方法。一个类,如果我们不写构造方法,那么编译器会帮我们加上一个默认的构造方法(就是没有参数的构造方法),但是如果你自己写了构造方法,那么编译器就不会给你添加了,所以有时候当你new一个子类对象的时候,肯定调用了子类的构造方法,但是如果在子类构造方法中我们并没有显示的调用基类的构造方法,如:super();  这样就会调用父类没有参数的构造方法。    

第二个规则:如果子类的构造方法中既没有显示的调用基类构造方法,而基类中又没有无参的构造方法,则编译出错,所以,通常我们需要显示的:super(参数列表),来调用父类有参数的构造函数,此时无参的构造函数就不会被调用。

总之,一句话:子类没有显示调用父类构造函数,不管子类构造函数是否带参数都默认调用父类无参的构造函数,若父类没有则编译出错。

最后,给大家出个思考题:下面程序的运行结果是什么?   答:String是不可变的对象,每次对String类型进行改变都相当于产生了一个新的对象,StringBuffer是可变的字符序列,所以如果要经常改变某个字符串的话建议使用StringBuffer   答:ServletCGI的区别在于Servlet处于服务器进程中,它通过多线程方式允许其service方法,一个实例可以服务于多个请求,并且其实例一般不会被销毁,而CGI对每个请求都产生新的进程,服务完后就销毁,所以效率上低于Servlet面向对象的特征?
  
答:1:封装:通过定义类并且给类的属性和方法加上访问控制
  
答:运行时异常时(JVMjava在运行过程中发生的问题,比如:内存溢出等问题。这类异常没法要求程序员去一一捕获并抛出,一般异常是类库或程序员自己写的代码发生的错误,这类异常可以由我们去一一捕获并抛出。多线程几种实现方法,同步?
  
答:多线程有两种实现方法,一种是继承Thread类或者实现Runnable接口。同步就是在方法返回类型后面加上synchronized中的委托,事件是不是委托?
  
答:委托就是将方法作为一个参数带入另一个方法叫做委托,事件是一种特殊的委托。应用程序域?
  
答:应用程序域可以理解为一种轻量级的进程,起到安全的作用,占用资源小。 作用?
  
答:调用该访问返回一个以字符串指定类名的类对象。 答:JDOjava对象持久化的新的规范,为java data object的简称,也是一个用于存取某种数据仓库中的对象的标准化API 答:CORBA标准是公共对象请求代理结构,用途为:用不同的程序设计语言书写,在不同的进程中运行,为不同的操作开发。 模型驱动?
  
答:JDBC数据库连接,是一种用于执行SQL语句的JavaAPI,可以为多种关系型数据库提供统一访问。什么情况下不建议使用Hibernate?
  
答:当数据量大,并且表关系复杂的时候不建议使用。 IOCDI?
  
答:控制反转和依赖注入是spring的两大基础作用。主要是将所有spring提供的外部容器中加载。提高安全性,减低耦合性,使各个框架或者类之间的依赖性降低。什么是声明式的事务管理?为什么要用?spring如何实现声明式的事务管理?
  
答:声明式的事务管理主要是将在进行对数据库中数据的添加或者修改时需要执行事务管理,主要是为了避免在执行添加或修改的时候添加或修改不完全正确,导致数据丢失。spring使用AOP面向切面的思想进行事务管理的。 Hibernate继承后,定义事务管理特性的时候查询为什么要定义为read-only
  
答:因为添加、删除和更新都涉及到了数据库的修改,而查询并未涉及到数据库修改,所以只需要定义只读,这样可以提高效率,进行更加方便的事务管理。请你谈谈对Hibernate OR映射的理解?
  
答:将数据库中的每一张表都映射成一个实体。配置了lazy="true"一定会懒加载吗?
  
答:不一定,如果在配置中你也使用了fetch属性的话此时lazy就会失效。 数据库标识与主键之间的认识?
  
答:标识是为了方便和简介映射文件,主键是为了让数据不会重复。为什么每次请求都要创建一个Action对象?
  
答:Struts2每次请求的时候都会创建一个action实例,这样会保证线程的安全。Struts1只是在第一次请求的时候创建一个action实例,以后每次相同的请求都直接从内存中去读取,它是单例模式,安全性较差。 是如何实现MVC模式的?
  
答:在Struts2里面是将每次页面的请求进行处理,然后将请求需要输出的数据转发到需要做数据显示的页面。Struts2只是起到一个数据接收和转接的功能,就是Controller控制器,而传来数据的页面叫view显示层,Struts2将数据提交给进行处理的类叫Model模型层,专门进行数据处理和数据库的连接。   答:栈是一种线形集合,其添加和删除元素的操作应在同一段完成,栈按照后进先出的方式进行处理。堆是栈的一个组成元素。 JavaBean的区别?
  
答:EJB不是一般的JavaBeanEJB是企业级的JavaBeanEJB一共分为3种,实体Bean,消息Bean,会话Bean。书写EJB要遵循一定的规范,另外要运行EJB,你需要有相应的EJB容器,比如WebLogicjboss等,而JavaBean不需要,只需要安装Tomcat就可以了。EJB用于服务端的应用开发,而JavaBean用于客户端应用开发。触发器?
  
答:触发器是一种特殊的存储过程,主要通过事件来触发而被执行。什么是存储过程?用什么调用?
  
答:存储过程是一个预编译的SQL语句,优点是允许模块化的设计。就是说只需要创建一次,以后再程序中就可以调用多次。使用存储过程比单纯的SQL语句要快,可以用一个命令对象来调用存储过程。索引优缺点?
  
答:索引可以提高对数据库中数据的检索,缺点是减慢了数据录入速度,同时也增加了数据库的尺寸大小。什么是事务?什么是事锁?
  
答:事务就是被绑定在一起,作为一个逻辑单元执行的SQL语句。如果任何一个操作失败,那么整个就失败。共同失败或共同成功。锁可以保证事务的完整性和并发性。什么是视图?游标是什么?
  
答:视图是一种虚拟的表,具有和物理表相同的功能。游标是对查询出来的结果集作为一个单元来有效的处理,可以对结果集的当前行做修改。 是什么?什么时候用到?
  
答:断言,可以将断言看成是异常处理的一种高级形式,可以用来判断某个特定的表达式或值是否为真。接口是否可以继承接口?抽象类是否可以实现接口?抽象类是否可以继承实体类?
  
答:接口可以继承接口,抽象类可以实现接口,抽象类可以继承实体类。引用传递和值传递?
  
答:引用传递:形参改变影响实参
  
答:session机制是一种服务器端机制,服务器使用一种类似于散列表的结构来保存信息。

Mathcad简介Mathcad即数学CAD,是美国Mathsoft公司于1986年推出的一个可视化的处理数学问题的软件包。其早期版本运行于DOS下,直到4.0版才运行于Windows环境下。Mathcad早期版本一直偏爱于数值计算,直到6.0版,才引入符号计算功能,不过符号计算,并不是Mathcad的强项,它不如我们下面将要介绍的另外两个数学软件包。其程序设计功能,也是6.0版后才有的功能,但在Mathcad中进行程序设计,却与其它编程语言有着本质的不同,其语言简单明了,可视化强,近似于其它程序的流程图。Mathcad不但是一个超级的数学计算器,而且还是一个出色的数学公式编辑器。只要你用过Word的Eqation,你就会发现用Mathcad 的数学公式编辑器输入一个数学公式有多么的简单。另外,Mathcad也称得上是一个优秀的文本编辑器,目前国际上很多科技论文,就是用Mathcad排版打印的。

在Mathcad中,你能够进行有关高等数学、线性代数、数值分析、概率统计等方面的各种运算,并且能够绘制常用的数学图形。它还为工程应用提供了各种量纲的转换。下面以Mathcad7 Professional为基础,简要介绍Mathcad的使用方法。

可以看出,Mathcad的界面与我们常用的软件如Office系列软件很相似。它含有9个主菜单,即文件管理(File)、编辑(Edit)、视图(View)、插入(Insert)、格式(Format)、数学计算(Math)、符号计算(Symbolics)、窗口管理(Window)、帮助(Help),每个菜单可以直接单击打开,也可以同时按ALT和菜单上的下划线字母,如ALT+O。下面我们简要介绍一下

#字典 存储形状对应7种形状 元组存储坐标

# 初始高度,宽度 核心块位置

# 初始化分数0 默认不加快 按下时加快

#先将核心块的所在位置在map中的元素设为1,通过self.shapeDict获取其余方块位置,将map中对应元素设为1。

#判断方块下移一格后对应位置map中的元素是否为一,是,则不可移动,返回False;否,可以移动,返回True。

# 先用randRange获取1~7中的随机整数,随机到某一整数,那么访问self.shapeDict,获取这种形状方块的核心块及其他方块的相对位置。

# 访问颜色字典,获取此方块的颜色。建立循环,当方块可移动时(while self. canMove():),且暂停键未被摁下(if isPause:),

# 核心块纵坐标加一,根据核心块及其他方块对于核心块的相对位置,画出四个方块。用self.getLocation()函数获取方块的位置。

# 给底部每行中方块都加上标签:bottom + str(j), j代表该块所在行数,每次遍历map,建立对于range(self. height)的for循环,删去每一行,

# 若map什么地方的元素为1,画出这一位置的方块,不断更新。这样可以画出底部方块。

# 判断填满遍历map每一行的各个元素,若所有元素为1,则标签中score值+10,将

# 此行所有元素改为0,行数map(i,j)=map(i-1,j)(即所有之上的行下移)

# ,那么后续画底部方块时,可实现消行。

# 遍历每一行,若从顶部到底部map每一行都有某一个元素或更多元素为1,

# 那么说明方块以顶到最上端,游戏结束。此处不可以简单判定最上一行是否有元素为1就判定结束,

# 若这样会产生顶部有新的方块产生,然后导致顶部有元素为1,误判为游戏结束。

# 先判断方块是否可以旋转(针对其靠近边界时)。先将其现在所在位置对应map中的元素改为0,判断其旋

# 转后位置对应map中的元素是否有一,若有,说明其旋转后的位置已经被占,是不能旋转的,返回值为False

# 。否则为可旋转,返回值True。若已判定可以旋转,那么访问self.rotateDict,得出旋转以后所有小块的位置

# 变换,将变换以后的位置对应map的元素设为1,旋转便已完成。

# 先判断是否左移/右移,同样,将方块现在所处位置的map中元素设为0,看其移动后的位置上map的元素是否有1,

# 若有,说明这一位置已被占据或已到边界,不可移动,返回False。若可移动,返回True。按下左键,若可

# 以移动,核心块的横坐标减1,由于我们只讨论其他小块对于核心块的相对位置,所以其他小块的位置自动随

# 核心块的位置移动而移动。将移动过后的位置对应map中的元素设为1。

# time变成0.05,通过调整sleep()中变量的大小可以调节方块运动的速度。

# 此功能通过if语句实现。

# 结束后告诉用户失败

# 方块可以移动,游戏运行。当按下暂停键以后,isPause值为False,方块将不可移动。同时,isPause值为False时

我要回帖

更多关于 方块Z破解版 的文章

 

随机推荐