项目实战   --俄罗斯方块 主讲:贾宗维.

Slides:



Advertisements
Similar presentations
第四章 类、对象和接口.
Advertisements

3.2 Java的类 Java 类库的概念 语言规则——程序的书写规范 Java语言 类库——已有的有特定功能的Java程序模块
JAVA 编 程 技 术 主编 贾振华 2010年1月.
项目7 面向对象高级.
项目6 通用堆栈.
四資二甲 第三週作業 物件導向程式設計.
MVC Servlet与MVC设计模式.
南京理工大学 第2章 Java基本语法 本章我们将学习Java编程语言的基本语法,包括变量、操作符、表达式、语句、字符串、数组、控制流以及如何使用帮助文档。 使用下面的编程框架: public class Test{ public static void main(String []args){ //以下添加测试代码.
项目:贪吃蛇游戏设计 工作任务一:系统设计(system design) 工作任务二:豆类(Bean)设计
第11章 Java多媒体技术.
RUSSIA RECT 全过程开发 开发讲师:龙博强.
第二章 JAVA语言基础.
第二部分 Java语言基础篇 第4章 Java语言与面向对象 (之一).
類別與物件 Class & Object.
Ch07 介面與多重繼承 物件導向程式設計(II).
第三章 控制结构.
第5章 Java中类、对象、接口 及包的概念 5.1 类的基本概念 5.2 类的继承概念 5.3 抽象类和接口 5.4 包.
Ch02 視窗Swing套件 物件導向系統實務.
Android + JUnit 單元測試 建國科技大學資管系 饒瑞佶 2012/8/19V4.
第5章 异常处理 王德俊 上海交通大学继续教育学院.
2.1 基本資料型別 2.2 變數 2.3 運算式與運算子 2.4 輸出與輸入資料 2.5 資料型別轉換 2.6 實例
第四章 在 C# 中实现 OOP 概念.
Java语言程序设计 第七部分 多线程.
Classes Lecturer: 曾學文.
CHAPTER 9 建構方法 ROBERT.
第六章 类的扩展与继承.
程式敘述執行順序的轉移 控制與重複、方法 Lecturer:曾學文.
第四次课后作业 1 问题描述: 将谜题定义为:包含一个初始位置,一个目标位置,以及用于判断是否是有效移动的规则集。
Android介面設計 Android智慧型手機程式設計 建國科技大學 資管系 饒瑞佶 2012/4 V1 2012/8 V2
本單元介紹何謂變數,及說明變數的宣告方式。
西南科技大学网络教育系列课程 高级语程序设计(Java) 第五章 继承、接口与范型.
程式設計實作.
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
2018/12/3 面向对象与多线程综合实验-网络编程 教师:段鹏飞.
Java语言程序设计 第五部分 Java异常处理.
第9章 多线程 王德俊 上海交通大学继续教育学院.
Java程序设计 第9章 继承和多态.
辅导课程六.
中国矿大计算机学院杨东平 第5章 接口和包 中国矿大计算机学院杨东平
第一次课后作业 1. C/C++/Java 哪些值不是头等程序对象 2. C/C++/Java 哪些机制采用的是动态束定
9.1 程式偵錯 9.2 捕捉例外 9.3 自行拋出例外 9.4 自定例外類別 9.5 多執行緒
3.1 数据类型 3.2 标识符与关键字 3.3 常量 3.4 变量 3.5 运算符与表达式 3.6 一个编程实例
2019/1/16 Java语言程序设计-类与对象 教师:段鹏飞.
Java程序设计 第2章 基本数据类型及操作.
Ch02-基礎語法.
C/C++/Java 哪些值不是头等程序对象
* 單元:電腦與問題解決 主題:Java物件導向程式設計-類別與物件 台南縣國立善化高中 蕭嘉民 老師
4.2通讯服务模块线程之间传递信息 信息工程系 向模军 Tel: QQ:
Multithread 多執行緒 以GUI為例了解物件以及Event
JAVA 编 程 技 术 主编 贾振华 2010年1月.
《JAVA程序设计》 语音答疑 辅导老师:高旻.
第二章Java基本程序设计.
實驗九:延續實驗八, 製作一個完整音樂播放器
第7章 异常处理.
第二章 Java基本语法 讲师:复凡.
第五次课后作业 1 问题描述: 将谜题定义为:包含一个初始位置,一个目标位置,以及用于判断是否是有效移动的规则集。
Interfaces and Packages
第二章 Java语法基础.
#include <iostream.h>
第二章 Java基本语法 讲师:复凡.
硬幣遊戲解題詳解 王豐緒 銘傳大學資訊工程學系.
第6單元 6-1 類別的繼承 (Class Inheritance) 6-2 抽象類別 (Abstract Class)
JAVA 程式設計與資料結構 第三章 物件的設計.
第2章 Java语言基础.
第4讲 类和对象、异常处理 ggao.
判斷(選擇性敘述) if if else else if 條件運算子.
第二章 Java基础语法 北京传智播客教育
輸出執行結果到螢幕上 如果要將執行結果的文字和數值都「輸出」到電腦螢幕時,程式要怎麼寫? class 類別名稱 {
第二章 Java基本语法 讲师:复凡.
第6章 继承和多态 伍孝金
Presentation transcript:

项目实战   --俄罗斯方块 主讲:贾宗维

程序演示 游戏01_功能演示与说明 游戏02_面向对象设计 游戏03_使用API类组装游戏 游戏04_编写各个类主体框架 游戏05_编写Controler类实现事件监听 游戏06_编写类测试代码 游戏07_图形设计与创建 游戏08_图形移动与显示 游戏09_处理游戏边界问题 游戏10_障碍物生成与显示 游戏11_消除满行的障碍物 游戏12_增加游戏结束 游戏13_定时下落

编写各个类主体框架-Shape类 private class ShapeDriver implements Runnable{ public void run() { // TODO Auto-generated method stub while(true){ moveDown(); //listener.shapeMoveDown(Shape.this); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); public class Shape { //private ShapeListener listener; public void moveLeft(){ System.out.println("shape's moveLeft"); } public void moveRight(){ System.out.println("shape's moveright"); public void moveDown(){ System.out.println("shape's moveDown"); public void rotate(){ System.out.println("shape's rotate"); public void drawMe(){ System.out.println("shape's drawme");

编写各个类主体框架-ShapeFactory类 public class ShapeFactory { public Shape getShape(ShapeListener listener){ System.out.println("ShapeFactory's getShape"); Shape shape=new Shape(); return shape; }

编写各个类主体框架-Ground类 package cn.tetris.entities; public class Ground { public void accept(){ System.out.println("Ground's accept"); } public void drawMe(){ System.out.println("Ground's drawMe");

编写各个类主体框架-GamePanel类 public class GamePanel extends JPanel { private Ground ground; private Shape shape; public void display(Ground ground,Shape shape){ System.out.println("GamePanel's display"); this.ground=ground; this.shape=shape; this.repaint(); } @Override protected void paintComponent(Graphics arg0) { // TODO Auto-generated method stub //重新显示 if (ground!=null && shape!=null){ ground.drawMe(); shape.drawMe();

编写各个类主体框架-Controller类 public class Controller extends KeyAdapter { private Ground ground; private Shape shape; private ShapeFactory shapeFactory; private GamePanel gamePanel; public void keyPressed(KeyEvent e) { switch(e.getKeyCode()){ case KeyEvent.VK_UP: shape.rotate(); break; case KeyEvent.VK_LEFT: shape.moveLeft(); break; case KeyEvent.VK_RIGHT: shape.moveRight(); break; case KeyEvent.VK_DOWN: shape.moveDown(); break;} gamePanel.display(ground, shape); }

编写各个类主体框架-ShapeListener接口 public interface ShapeListener { void shapeMoveDown(Shape shape); }

Shape类增加监听器对象及下落后调用 listener.shapeMoveDown(Shape.this); private class ShapeDriver implements Runnable{ public void run() { // TODO Auto-generated method stub while(true){ moveDown(); listener.shapeMoveDown(Shape.this); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); public class Shape { private ShapeListener listener; public void moveLeft(){ System.out.println("shape's moveLeft"); } public void moveRight(){ System.out.println("shape's moveright"); public void moveDown(){ System.out.println("shape's moveDown"); public void rotate(){ System.out.println("shape's rotate"); public void drawMe(){ System.out.println("shape's drawme");

public void addShapeListener(ShapeListener l){ if(l!=null){ this.listener =l; }

new Thread(new ShapeDriver()).start(); } public Shape(){ new Thread(new ShapeDriver()).start(); }

Controller类实现ShapeListener接口 public class Controller extends KeyAdapter implements ShapeListener { public void shapeMoveDown(Shape shape) { // TODO Auto-generated method stub gamePanel.display(ground, shape); }

public class ShapeFactory { 生产图形时同时注册监听器 public class ShapeFactory { public Shape getShape(ShapeListener listener){ System.out.println("ShapeFactory's getShape"); Shape shape=new Shape(); shape.addShapeListener(listener); return shape; }

GamePanel类设置大小 public GamePanel(){ this.setSize(300,300); }

Controller类中增加开始新游戏方法 public void newGame(){ shape=shapeFactory.getShape(this); }

Controller类中如何接收外部控制的对象 public Controller(ShapeFactory shapeFactory,Ground ground, GamePanel gamePanel){ this.shapeFactory=shapeFactory; this.ground=ground; this.gamePanel=gamePanel; }

测试类Game public class Game { public static void main(String[] args) { // TODO Auto-generated method stub ShapeFactory shapeFactory=new ShapeFactory(); Ground ground=new Ground(); GamePanel gamePanel=new GamePanel(); Controller controller=new Controller(shapeFactory,ground,gamePanel); JFrame frame=new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(gamePanel.getSize().width+10, gamePanel.getSize().height+35); frame.add(gamePanel); gamePanel.addKeyListener(controller); frame.setVisible(true); controller.newGame(); }

程序步骤 游戏01_功能演示与说明 游戏02_面向对象设计 游戏03_使用API类组装游戏 游戏04_编写各个类主体框架 游戏05_编写Controler类实现事件监听 游戏06_编写类测试代码 游戏07_图形设计与创建 游戏08_图形移动与显示 游戏09_处理游戏边界问题 游戏10_障碍物生成与显示 游戏11_消除满行的障碍物 游戏12_增加游戏结束 游戏13_定时下落

Shape类,增加图形的描述 //二维变量用于保存图形的所有状态 private int[][] body; //用于保存图形当前的状态 private int status; //设置状态的方法 public void setBody(int body[][]){ this.body=body; } //设置当前是第几种状态 public void setStatus(int status){ this.status=status;

ShapeFactory类增加生产各种图形 //三维数组用于表示一种图形的多种形状 private int shapes[][][]=new int[][][]{ {{1,0,0,0, 1,1,1,0, 0,0,0,0, 0,0,0,0}, {1,1,0,0, 1,0,0,0, 1,0,0,0, 0,0,0,0}, {1,1,1,0, 0,0,1,0, {0,1,0,0, 0,1,0,0, 1,1,0,0, 0,0,0,0} }}; public Shape //生产一个随机数,用于表示图形的状态 int type=new Random().nextInt(shapes.length); //设置图形有几种状态 shape.setBody(shapes[type]); //设置默认状态 shape.setStatus(0); return shape; }

Shape类中增加图形的位置信息 //表示图形距离左侧的距离 private int left; //表示图形距离上边界的距离 private int top; public void moveLeft(){ left--; } public void moveRight(){ left++; public void moveDown(){ top++; public void rotate(){ //显示下一个状态,但得保证状态值不超过4,所以需处理 status=(status+1)%body.length;

Shape类中增加图形的绘制方法 public void drawMe(Graphics g){ System.out.println("shape's drawme"); g.setColor(Color.RED); //循环访问代表方正的数组 for(int x=0;x<4;x++){ for(int y=0;y<4;y++){ if(getFlagByPoint(x,y)){ g.fill3DRect((left+x)*Global.CELL_SIZE, (top+y)*Global.CELL_SIZE, Global.CELL_SIZE, Global.CELL_SIZE, true); } } } } //获取方正中标志是1还是0,1表示要绘图0表示不绘图 private boolean getFlagByPoint(int x,int y){ return body[status][y*4+x]==1; }

public static final int CELL_SIZE=20; //表示图形面板有多少个格子宽和高 游戏常量的存放——Glaobal public class Global { //表示每个方格的像素值 public static final int CELL_SIZE=20; //表示图形面板有多少个格子宽和高 public static final int WIDTH=15; public static final int HEIGHT=15; }

在GamePanel类的paintComponent方法中增加如下代码:在填充一个与背景同色的区域 测试游戏,下落方块出现拖影 在GamePanel类的paintComponent方法中增加如下代码:在填充一个与背景同色的区域 g.setColor(new Color(0xcfcfcf)); g.fillRect(0, 0, Global.CELL_SIZE*Global.WIDTH, Global.CELL_SIZE*Global.HEIGHT); //填充一个灰色显示区域,避免图形拖影 修改此处的同时还需修改Shape的drawme方法中设置图形的颜色,以及给frame也注册监听器。

图形如何避免移出边界 public boolean isMoveable(Shape shape,int action){ //得到图像当前的位置信息 int left=shape.getLeft(); int top=shape.getTop(); //根据图形的动作,得出图形最新的位置信息 switch(action){ case Shape.LEFT: left--; break; case Shape.RIGHT: left++; case Shape.DOWN: top++; break; } //依次取出图形中的每一个点,判断是否超出显示区域 for(int x=0;x<4;x++){ for(int y=0;y<4;y++){ //判断xy点是否是图形的成员 if(shape.isMember(x, y,action==Shape.ROTATE)){ if(top+y>=Global.HEIGHT|| left+x<0|| left+x>=Global.WIDTH) return false; } } } return true; }