版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第一次课一、要做的工作产生一个800*600的窗口,背景色为绿色。窗口可以被关闭,但不允许改变大小2、在窗口里画出一个红色的圆代表坦克3、让坦克动起来改变坦克的位置就相当于坦克移动了,因此首先需要把坦克的位置描述改为变量每重画一次坦克就动一次,让坦克不断的动就要不断的重画,我们用线程来控制二、知识点1、使用eclipse建立项目,创建包和类的方法2、变量命名规则:所有命名要求见名知义;类名首字母大小,变量和方法首字母小写;驼峰标识〔比方类名:TankWar〕3、事件机制事件包括三个方面:监听器类,注册事件,覆盖方法监听器类经常写成内部类〔包括匿名内部类〕或是类本身实现事件接口事件接口包括actionListener接口、窗口事件接口、鼠标事件接口、键盘事件接口等等使用事件接口要求把接口的所有方法都写出,但不一定都实现窗口事件和鼠标键盘事件接口还提供了较为简洁的适配器类3、匿名内部类类可以分为如下几种:主类:包含主方法的类内部类:在一个类内部定义的类为内部类实例内部类:在一个类内部独立存在,不属于类的成员变量和方法静态内部类:用static修饰的实例内部类局部内部类:在一个类的方法内定义的类匿名内部类:没有名字的局部内部类外部类:包含内部类的类,外部类也可能是其他类的内部类顶层类:不是任何类的内部类为顶层类设计内部类的主要目标是“封装”。顶层类只能用public修饰或者不修饰〔即默认修饰方式〕,内部类可以用public,protected,private,默认四种方式修饰,局部内部类只能用默认修饰局部内部类和匿名内部类只在方法内可见,即该类只为该方法提供服务实例内部类只在一个类内可见,只为该类提供服务4、利用eclipse重写父类的方法在eclipse中单击右键,源代码,生成覆盖方法。此时会列出当前类的所有父类,当前类可以直接继承父类的方法。5、图形的重画机制在frame上画出的图形每次刷新时会重画,重画的过程是:系统自动调用repaint方法,repaint调用update方法,update调用paint方法,从而完成重画。6、多线程见第17课详细讲解三、小注1、我们使用的Frame组件,没有使用JFrame,因为JFrame在后续画图时不好用,到时举例看第二次课要做的工作让坦克在键盘的控制下向四个方向移动我们已经写好一个坦克并且能够控制其移动,如果要求在加入一个坦克该如何实现?把坦克做成一个独立的类,把和坦克自身相关的属性和方法都写到坦克类中,然后在tankclient类中生成tank类的对象,然后用tanke类的对象调用坦克类的方法类完成各种功能让坦克在键盘的控制下向八个方向移动如何做出八个方向?通过四个方向键组合出八个方向,比方上、右同时按下是一个方向。四个布尔变量代表四个方向键的按下情况,组合出八个方向,八个方向用枚举类型表示。4、优化代码:把一些可能会改变的值定义成常量知识点键盘事件适配器键盘控制坦克移动就要使用键盘事件,事件三要素:监听器类〔监听接口还是适配器类?写成内部类还是匿名内部类?〕,注册事件,覆盖方法〔keypress,keytyped,keyreleased用哪个方法〕键盘代码如何获取键盘按键代码:e.getKeyCode()Switch语句:格式,case后能跟什么样的变量?没有break会怎样?加入键盘事件后可否去掉多线程?面向对象编程思想:一切皆为对象。对项目进行抽象,形成假设干个类,然后生成对象来实现程序功能把坦克抽象成一个类,把坦克的属性描述为成员变量,把坦克的行为描述为方法。这样就把坦克相关的属性和方法都封装到一个类中,属性一般设计为私有,通过set和get方法访问,方法一般为public,供对象调用,从而实现各种功能。构造方法构造方法用来描述一个对象刚生成时的状态。调用构造方法才能生成对象。一个类必须有构造方法,构造方法有三种情况super(xxx): 第一句调用父类的构造方法this(xxx): 第一句调用本类的其他构造方法super(): 第一句没有调用任何其他的构造方法,系统会自动加上这句,去调用父类的无参构造方法〔如果父类没有无参构造方法,那么子类会出错〕任何一个构造方法必然属于上述三者之一。任何一个类都必须提供一个空的构造方法枚举类型Tiger中的一个重要新特性是枚举构造,它是一种新的类型,允许用常量来表示特定的数据片断,而且全部都以类型安全的形式来表示。Java代码的两个基本的构造块是类和接口。现在Tiger又引入了枚举,一般简称它为enum。这个新类型允许您表示特定的数据点,这些数据点只接受分配定义枚举enumDirection{U,D,R,L,RU,RD,LU,LD,STOP};在这里,我使用了新的关键字enum,为enum提供了一个名称,并指定了允许的值。然后,Direction就变成了一个枚举类型,使用枚举类型privateDirectiondirection=Direction.STOP;用以前定义过的类型〔Direction〕建立一个新的枚举〔direction〕之后,您就可以像使用其他成员变量一样使用它了。当然,枚举只能分配枚举值中的一个〔例如,U,D,R等〕小注注意把坦克做成类后,程序的改变。第三次课要做的工作添加子弹类新建一个Missile类作为子弹类设计子弹类的属性和方法要求子弹能够根据某个方向移动在主类中画出一个子弹,进行测试要求按下ctrl键让坦克打出子弹,并且让子弹沿着坦克移动的方向运动在坦克的keyPress方法中加入ctrl键响应,产生一颗子弹。写一个attack方法,在此处生成一个Missile对象。在ctrl响应中调用该方法问题:上述方案无法打出子弹,因为没有画出子弹,两个地方可以调用draw方法画出子弹,tank类里的paint方法,tankwar1里的paint方法。我们在tanjwar1里做,因为尽量把所有对象都定义到tankwar1里,这样好管理。在tankwar1中定义一个子弹引用,在tank中生成子弹对象,那么如何把tank中的子弹对象传递到tankwar1中。让tank持有tankwar1的引用,然后把tankwar1的对象传递给坦克里的tankwar1的引用。记住这种传递对象的方法。子弹从坦克中心打出坦克的位置是x,y,又知道坦克和子弹的半径,由此求出子弹的位置。坦克停止时也能打出子弹子弹是根据坦克的方向飞行的,所以当坦克停止时子弹也就停止了。如何让坦克停止时也能打出子弹呢,就是想方法记录坦克刚刚的行动方向。我们用一个炮筒方向来记录坦克的移动方向。给坦克增加一个属性ptDir,代表炮筒方向炮筒用一条直线来表示,这条直线根据坦克的移动方向来画出。即坦克向右走时就画一条向右的线,向左走就画一条向左的线,停止时就保留上一次的方向。子弹的发射方向跟据炮筒方向来定知识点枚举类型的用法枚举就是用enum定义一个新的数据类型,该类型的取值范围是几个常量,用该类型可以定义变量,变量的取值就在限定在上述的常量中在Tank中我们定义了一个枚举类型Direction,在Missile中我们用该类型定义个变量dir,该变量是一个枚举类型变量,可取Direction枚举类型中列举的常量之一。A类中定义的变量如何获得B类中生成的对象。在A中定义好要获取的对象的引用,然后让B持有A的引用,在B中生成对象赋给A的引用画线的方法小注第四次课:要做的工作:打出多发子弹创建容器——集合框架每次按下ctrl键都往容器中加入一个子弹逐一画出每发子弹删掉子弹:当子弹飞出窗口时要删掉,如果不删掉那么容器中的子弹会越来越多,最后会导致内存崩溃。如何判断子弹飞出边界?找出四个边界从容器中remove一个子弹,此处又涉及到在Missile类中持有TankWar的对象问题。坦克的边界问题,让坦克不能走出边界注意上边界有标题栏,需要考虑。回忆以前的工作,适当加注释知识点集合框架——见第17课范型:在生命集合变量和创建集合对象时,可以使用“<>”标记指定集合的范型,即指定集合中元素的类型。类的继承与接口的实现小注注意import不同包下同名类的引发的问题。例如我们程序中使用List类,引入语句里有importjava.awt.*;和importjava.util.*,此时使用List就会出现问题,因为上述两个包中都有List类,此时eclipse不知道该使用哪个,所以出错。应该明确指明importjava.util.List;就可以了。迭代器的问题在创建迭代器之后,除非通过迭代器自身的remove或add方法从结构上对列表进行修改,否则在任何时间以任何方式对列表进行修改,迭代器都会抛出ConcurrentModificationException第五次课要做的工作加入一个敌方坦克是否需要创建敌方坦克类?加入一个标记坦克好坏的变量,然后修改构造方法在主类中创建敌方坦克用颜色区分敌我坦克我方坦克发出炮弹击毁敌方坦克是谁击毁敌方坦克,我方坦克还是炮弹?如何检测炮弹是否击中坦克?炮弹和坦克都有一个外切矩形,如果这两个矩形相交则证明炮弹击中坦克,否则没有击中。用Rectangle类可以获取外切矩形,分别获得子弹和坦克的外切矩形,然后用该类的intersects方法判断矩形是否相交Missile类中加入hitTank方法,该方法有无参数?有无返回值?hitTank方法中击中坦克后应该有哪些反应?坦克消失:不再重画坦克就可以了,因此每次重画坦克之前先判断坦克是否已经死了,死了则直接返回不再重画。所以坦克应该加入一个标记生死的变量。子弹消失:不再重画子弹并且从容器中remove掉。与处理坦克方式类似,需注意remove掉子弹时不能引发异常。小问题:击毙坦克后,向相同位置发射炮弹,炮弹仍然会消失,因为我们虽然不再重画坦克,但是坦克仍然在原来位置上存在。什么时候有谁来调用hitTank方法知识点Rectangle类:Rectangle指定了坐标空间中的一个区域,通过Rectangle对象的左上顶点的坐标〔x,y〕、宽度和高度可以定义这个区域。构造方法:Rectangle(int
x,int
y,int
width,int
height)
构造一个新的Rectangle,其左上角被指定为〔x,y〕,而其宽度和高度由同名称的参数指定其他方法:intersects(\o"java.awt中的类"Rectangle
r)
确定此Rectangle是否与指定Rectangle相交。Get,Set方法这两个方法提供了对一个类的私有变量访问的途径。一个类提供变量和方法,方法一般是公有的,变量是私有的,即变量不允许外界擅自访问,如要访问必须使用类自身的set,get方法。小注第六课:加入爆炸效果要做的工作爆炸类:子弹击中坦克产生一个爆炸的效果,这个效果我们用一个逐渐变大然后变小的圆来表示。我们把爆炸也抽象为一个类。该类所具有属性和方法有哪些?爆炸地点x,y;爆炸是有生命的live,画出爆炸的方法写完爆炸类后先测试一下,在主类生成一个爆炸类对象,看能否画出爆炸效果可能同时会有多出发生爆炸,因此我们把爆炸对象放入一个容器中,然后不断从容器中取出爆炸对象然后画出爆炸何时死?爆炸之后从容器中remove调整爆炸的出现位置,让圆有同一个圆心:每次画圆都是以x,y为左上角点,调整x,y的位置即可给爆炸添加声音知识点数组作为圆的半径由于要画出一系列大小不一的圆来显示爆炸效果,因此用数组来作为圆半径集合框架调试错误,设置一处错误调试〔去掉子弹类生成对象时的tw参数〕。此时每次调用hitTank都会出现空指针错误。调试找出该错误。图片处理Java中能识别的图片有gif和jpg两种格式,用图片主要有两个场合:图形界面中即在组件中使用,比方按钮上加一个图标,标签组件加一个图片等。此时需要首先获得一个ImageIcon对象〔ImageIcon类能根据URL、文件名或字节数组创建一个图像〕,然后用组件的setIcon方法加入。ImageIconimage=newImageIcon〔”图片路径”〕;jButton.setIcon(image);图形处理中图片不是加到组件上,而是画在某个地方,比方画到窗口〔Frame或JFrame〕内。此时先获得一个Image对象〔Image类是一个抽象类,不能实例化,我们可以借助ImageIcon来得到一个Image对象〕Imageimage=newImageIcon〔”图片路径”〕.getImage(); 得到了一个图片对象后,接下来,如何把该图片画出来?使用Graphics类提供的drawImage()方法,它能完成将Image对象中的图像显示在屏幕的特定位置上,就象显示文本一样方便。 drawImage()方法的调用格式如下: booleandrawImage(Imageimg,intx,inty,ImageObserverobserver)其中img参数就是要显示的Image对象。x和y参数是该图像左上角的坐标值。observer参数则是一个ImageObserver接口〔interface〕,它用来跟踪图像文件装载是否已经完成的情况,通常我们都将该参数置为this,即传递本对象的引用去实现这个接口。在paint方法中,下句则会画出一个image图片。 g.drawImage(image,20,10,this);注:路径问题 图片路径分为绝对路径和相对路径绝对路径:ImageIconimage=newImageIcon〔””〕; 相对路径:ImageIconimage=newImageIcon〔””〕; 相对路径中的image文件夹在eclipse中建立〔项目右键建立一个文件夹〕,然后把图片文件放入该文件夹声音处理原来,Applet包中提供了AudioClip类处理程序,现在applet已经被淘汰,而且应用程序不支持AudioClip类,所以该类也基本不再使用。现在,理类。importsun.audio.*;importsun.audio.*;importjava.io.*;publicclassSound{ publicstaticvoidmain(Stringargs[]) { try{ FileInputStreamfileau=newFileInputStream("d://2.wav"); AudioStreamas=newAudioStream(fileau); AudioPlayer.player.start(as); } catch(Exceptione){} }}小注爆炸效果用gif图片来表示第六课补充:IO操作,见第十七章第七课:要做的工作生成多辆坦克多辆坦克需要放到一个容器内,所以先做一个容器New出多辆敌方坦克,然后加到容器中。该语句写在哪个方法合适画出多辆坦克,从容器中依次取出坦克,然后调用paint方法画出击毙坦克原来击毙的是一辆坦克〔调用hitTank〔enemy〕有针对性的击毙〕,现在坦克都放在容器中,而且是多辆,如何击毙?把容器的坦克都取出来,依次hitTank〔〕,子弹和谁相交就击毙谁。可以写一个hitTanks方法,依次取出坦克后调用hitTank方法。让敌方坦克自己移动坦克每次重画都会调用move方法,move方法会根据坦克的方向改变x,y的值,因此我们只要不断改变敌方坦克的方向就可以了不断改变敌方坦克的方向需要随机的变换方向,用Random类实现。随机数和方向如何建立联系?如何控制走随机步数后改变一次方向?让敌方坦克发炮弹我方坦克发炮弹是通过ctrl键,每次按下ctrl键就调用fire方法发出一发炮弹,敌方坦克什么时候发出炮弹?随机发炮弹——把fire方法的调用写入随机移动的代码块内就可以了。此时发现敌方坦克会发出炮弹了,但是会炸掉自己,因为炮弹只要和坦克相交就会炸毁,如何做到敌方坦克不打自己?坦克区分好坏,让子弹也区分好坏,这样再打的时候判断一下坦克和子弹都好或者都坏就不打,否则打敌方坦克无法击毁我方坦克,为什么?知识点构造方法重载,好坦克用一个构造方法,坏坦克用另一个,因为坏坦克需要我们指定他的初始方向。构造方法里写一个对象刚生成时具有的特性。构造方法的三种形式Random类:首先生成一个Random对象:Randomr=newRandom();然后调用方法产生随机数:intrn=r.nextInt(10);,rn就是0到9之间的一个随机数字另:Math.random()方法:返回带正号的double值,大于或等于0.0,小于1.0。枚举类:枚举类有一个values方法,以数组的方式返回一个枚举类型的所有常量。Direction[]dirs=dir.values();,dirs就是一个数组,每个数组分量就代表一个枚举里的方向常量,即一个方向。小注第八课:要做的工作用坦克图片代替圆形表示的坦克坦克可以朝八个方向走,所以需要八个方向的坦克图片各一张画出坦克图片需要用到哪个方法?这个方法写到什么地方?每个方向都需要一张图片,共八张。我们使用数组来存放这八张图片数组定义改成静态的可以吗?静态的和原来的有什么区别?用hashmap建立图片和字符之间的联系让坦克不能相互穿越坦克相交时停下,然后改变方向即可知识点eclipse中如何引入图片?项目上单击右键新建文件夹,然后再磁盘目录里找到该文件夹,把图片考入。或者,把图片直接拖放到eclipse中该文件夹下数组的初始化〔1〕Int[]x=newint[5];然后for循环初始化〔2〕Int[]x=newint[]{1,2,3,4,5}声明同时初始化〔3〕Int[]x={1,2,3,4,5}声明同时初始化〔4〕Staticintx;Static{x=newint[]{1,2};}Static的用法修饰成员变量表示静态变量〔类变量〕静态变量在内存中只有一个拷贝,在加载类的过程中完成对其的内存分配Java不提供全局变量,静态变量可以代替全局变量。静态变量可以被类的所有实例对象共享通过类名直接访问静态变量修饰成员方法表示静态方法〔类方法〕在加载类的过程中完成对其的内存分配静态方法可以访问静态变量和静态方法,不可访问实例变量和实例方法通过类名直接访问静态方法修饰代码块表示静态代码块类中可以有静态代码块,它不存在于任何方法中,在加载类时会执行静态代码块小注第九课:要做的工作、敌方坦克不可互相穿越敌方坦克相遇时就停下,然后转换方向再走知识点小注第十课、网络见教案第19课第十一课、聊天室程序基本原理C/S结构包括两个方面服务器和客户端,因此我们要写两个程序,一个运行在服务器,一个运行在客户端。服务器运行后等待客户端连入,客户端根据服务器的IP和端口连入,这样服务器和客户端就建立了一个连接,而且可以有多个客户端连入服务器。每个客户端的发言都发送给服务器,服务器接收后然后转发给所有连入的客户端,这样每个客户端就都能收到其他客户端发出的信息了。这就是C/S结构聊天室的工作过程。其实现主要使用如下两种技术:Socket:网络套接字,让两个应用程序通过一个双向的网络通信链接实现数据交换。即服务器和客户端的应用程序各有一个Socket,这两个Socket把服务器和客户端的程序连接起来并交换数据。多线程:因为一个服务器要连入多个客户端,因此服务器程序需要为每个客户端开辟一个线程,专为该客户服务。此外,客户端不仅要发送信息给服务器,还要不断接收服务器转发过来的信息,因此也需要开辟一个线程专门负责接收服务器的信息。程序实现服务器端建一个ChartServer类,在该类中,首先定义一个ServerSocket,并指明端口号,然后不断侦听接收客户端的请求,收到请求则把客户端传来的Socket放入一个HashSet中保存,并启动一个线程负责该客户,在线程中接收客户的信息并转发给HashSet中所有的客户。代码如下://服务器端程序//服务器端程序publicclassChartServer{ privateHashSet<Socket>clients=newHashSet<Socket>();//存放客户端Socket publicChartServer(){ try{ ServerSocketss=newServerSocket(6666);//建立Socket while(true){ Sockets=ss.accept(); //等待并接收客户端请求 clients.add(s);//把收到的客户端Socket保存 newServerThread(s,clients).start();//启动一个线程接收该客户信息 } }catch(IOExceptione){ e.printStackTrace(); } } //线程,负责接收客户信息并转发给其他客户 classServerThreadextendsThread{ privateSockets; privateHashSetclients; publicServerThread(Sockets,HashSetclients){ this.s=s; this.clients=clients; } publicvoidrun(){ try{ BufferedReaderbr=newBufferedReader(newInputStreamReader(s.getInputStream())); while(true){ sendMessage(br.readLine()+"\n"); } }catch(IOExceptione){ e.printStackTrace(); } } //给每个客户发送一份信息 privatevoidsendMessage(Stringstr){ Iteratorit=clients.iterator(); while(it.hasNext()){ Sockettemp=(Socket)it.next(); try{ PrintWriterpw=newPrintWriter(temp.getOutputStream()); pw.println(str); pw.flush(); }catch(IOExceptione){ e.printStackTrace(); } } } } publicstaticvoidmain(String[]args){ newChartServer(); }}客户端聊天室客户端建一个ChartClient类作为客户端程序。运行后如下列图:聊天室客户端//客户端程序publicclassChartClientextendsJFrame{ privateJTextAreajta; privateJTextFieldjtf; privateJButtonjb;//客户端程序publicclassChartClientextendsJFrame{ privateJTextAreajta; privateJTextFieldjtf; privateJButtonjb; privateJLabelname; privateSockets; privatePrintWriterpw; privateBufferedReaderbr; privateDateFormatformat; privateDatedate=newDate(); //构造方法,建立界面,初始化工作 publicChartClient(){ this.setSize(300,350); this.setTitle("聊天室"); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jta=newJTextArea(15,20); jtf=newJTextField(15); jb=newJButton("发送"); name=newJLabel(""); JPaneljp=newJPanel(); jp.setLayout(newFlowLayout()); jp.add(name); jp.add(jtf); jp.add(jb); jb.addActionListener(newSendMessage()); this.setLayout(newBorderLayout())
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 沈阳理工大学《材料工程测试技术》2021-2022学年第一学期期末试卷
- 光伏组件销售合同范本
- 果园分包合同书模板
- 合同编第十九条法条解读
- 2024上海市电视广播广告发布合同(示范文本版)
- 2024化妆品品牌加盟合同
- 2024建筑委托合同协议
- 沈阳理工大学《Java程序设计基础》2021-2022学年期末试卷
- 2024表演场地租赁合同范本
- 2024开店双方入股合同协议范文
- 中国湿疹诊疗指南
- LTC流程介绍完整版
- 饲料加工系统粉尘防爆安全规程
- 一年级上册美术课件-第11课-花儿寄深情-▏人教新课标
- 植物的象征意义
- 夏商周考古课件 第5章 西周文化(1、2节)
- 二年级上册美术教案-7. 去远航 -冀教版
- 装配图画法及要求课件
- 翻译实习教学大纲
- 心力衰竭-英文版课件
- 邀请回国探亲邀请函范本
评论
0/150
提交评论