java课程设计——俄罗斯方块

合集下载

JAVA课程设计 俄罗斯方块

JAVA课程设计 俄罗斯方块
设计说明:
1. 这个程序定义了两个类,一个是 BlockFrame 类,另一个是 Block 类。前一个负责整体 外部布局,后一个负责方块的变化过程的显示,这两个类分别继承了 Jframe 类和 Jpanel 类,所以在整个程序运行过程中大量调用了父类的成员方法。
(1):第一个类 BlockFrame 类的 setSize()函数用于设置整个框架的大小,setTitle() 函数用于设置框架标题的显示,setResizable()用于框架大小不可调整的设置。
但是,本程序确实存在许多的缺点,比如没有调用 JMenu 的功能,不能实现 对游戏的设置,比如难易程度、不同的风格以及缺少最重要的功能,就是对游 戏的暂停、结束、重新开始的操作。
5
设计体会与建议: 通过这次的课程设计,我更加了解 java 语言,学会更好的使用 java 语言
函数调用和结构体等,把学过的知识运用于实践中,而不仅仅停留于对课本的 单纯理解;设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的 检查终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺和经验不足。这次设 计也让我知道我懂的太少,要学习的东西还有很多。想完成一项功能就要用很 复杂的语句去实现,所以整个程序变的很长,复杂,但是如果前期工作如果准 备的比较充分,如程序的总体功能的明确,以及各函数功能的细分又可使程序 的编写工作变的简单,这将大大降低编写的难度。实验过程中,也对团队精神的进
这个方块游戏程序可以实现对界面中方块的左移、右一、下移和变换的控 制,并且每消一行后可以获得 10 分值,分值一直累加下去。当面板内的空间填 满的时候,方块无法下移,与顶端接触,到此游戏结束。 游戏本身实现了功能要求的基本功能,程序代码短,结构清晰、明确。通过键 盘中的方向键的上键、下键、左键、右键分别对应方块的变形、下移、左移和 右移的功能,操作简单。

java课程设计报告-俄罗斯方块

java课程设计报告-俄罗斯方块

JAVA程序设计课程设计之俄罗斯方块年级: 13 级班级: T412 网络工程指导老师:朱林小组成员:20138346021 许浩洋II时间: 2015 年 11 月 11 日目录摘要 .................................................................第一章课程设计要求..................................................第二章设计概要 ......................................................2.1功能设计 ......................................................2.2功能分析 ......................................................2.2.1系统操作界面 ...............................................2.2.2程序主要功能说明 ...........................................第三章调试分析与测试结果 ............................................3.1游戏运行界面 ..................................................3.2测试项目 ......................................................3.2.1功能区按键测试 ............................................3.2.2键盘功能测试 ..............................................3.2.3游戏结束测试 ..............................................第四章设计总结 ......................................................4.1改进意见 ......................................................4.2《Java 课程设计》心得体会 ......................................1摘要在现代,高科技的飞跃发展,人们工作习惯的改变,特别是电脑的大量普及,人们生活节奏越来越快,一些有趣的桌面游戏已经成为人们在使用计算机进行工作或学习之余休闲娱乐的首选,而俄罗斯方块游戏是人们最熟悉的小游戏之一。

JAVA课程设计 俄罗斯方块

JAVA课程设计  俄罗斯方块

JAVA语言实现俄罗斯方块的代码实现
初始化游戏界面:创建JFrame对象,设 置大小和标题
游戏结束处理:判断游戏是否结束,显 示得分和重新开始按钮
绘制游戏网格:使用二维数组存储游戏 状态,绘制每个方块
优化游戏性能:使用双缓冲技术,提高 游戏流畅度
控制游戏逻辑:监听键盘事件,实现方 块的移动、旋转和消除
游戏逻辑的实现
游戏界面:显示游戏区域、得分、等级等信息 游戏操作:通过键盘或鼠标控制方块的移动和旋转 游戏规则:方块掉落、消除、得分等规则 游戏结束:当游戏区域被填满或达到一定分数时结束游戏
游戏音效和动画效果的实现
音效:使用Java的 Audio类播放音效 文件
动画效果:使用 Java的Swing库中 的JPanel和JLabel 组件实现动画效果
易 于 学 习 : J AVA 具 有 简 洁 的 语 法 和 丰 富 的类库,使得学习JAVA语言相对容易。
JAVA语言在游戏开发中的应用
JAVA语言具有跨平台性,可以在多种操作系统上运行,适合游戏开发。 JAVA语言具有丰富的API,可以方便地实现游戏功能。 JAVA语言具有强大的图形处理能力,可以方便地实现游戏画面。 JAVA语言具有良好的安全性和稳定性,适合大型游戏的开发。
Hale Waihona Puke 05 课程设计的总结和展望
课程设计的收获和不足
收获:掌握了JAVA编程的基本知识和技能,提高了逻辑思维能力和解决问题的能力。
不足:在课程设计中遇到了一些困难,如代码编写错误、程序运行异常等,需要加强实践和 经验积累。
展望:希望在未来的课程设计中能够更加熟练地运用 JAVA编程,提高程序设计的质量和效率。
打包发布:使用JAR文件打包游戏,方 便分发和运行

《Java程序设计》实训报告范文-俄罗斯方块

《Java程序设计》实训报告范文-俄罗斯方块

《Java程序设计》实训报告范文-俄罗斯方块——《俄罗斯方块》一、实训任务及要求:1.1、实训任务1.运用Java实现小游戏的开发2.了解Java开发项目的流程3.掌握规划,设计,开发,测试的能力1.2、实训要求熟悉java的编程环境J2SDK,掌握Application和Applet的程序结构,并能熟练编写和调试两类程序。

熟练使用各种常用类库。

理解JDK的事件处理机制,掌握java.awt、java某.wing,java某.wing.event中的GUI标准组件的用法,学会合理运用布局策略、综合运用各种界面元素,编程构造满足应用需要的图形工作界面。

二、需求分析:1.课程设计的目的和意义2.系统功能设计1.本系统主要设计以下几种功能2.1、游戏难度选择功能3.游戏难度选择界面设置在程序运行开始时,一共有九种难度供玩家选择,每选一级难度,都会相应地显示出代表该难度的图片。

开始时不设置任何默认的难度,如果玩家不选难度直接按“Enter”进入,将会弹出提示框,提示其先选难度再进入。

4.2、方块下落、变形功能5.在整个俄罗斯方块游戏中,方块的设计是核心。

这里设计了一个方块类:Square(),用来生成方块以及实现块的左移、右移、向下、变形、重画、同步显示、初始化新块等。

6.3、自动升级功能7.当分数累积到一定大小时,系统将自动为玩家提高难度。

这里设置了每消除10行方块,就增加一级难度。

当难度增加的时候,方块会相应地改变颜色,以作为对玩家的提示。

8.4、游戏音乐功能9.游戏开始音乐就自动播放,游戏暂停与结束时音乐相应消除。

10.5、获取帮助功能11.这里设置了一个类,用来显示帮助,按F1键就能弹出窗口,显示游戏规则。

3.系统功能设计分析GameArea,GameSetting,GameOver,Help,ImagePanel,JieMian,MyPane l,MyTimer,PlayMidi,WinLitener,每个类的描述如下:2.1、Square,方块类。

Java俄罗方块课程设计

Java俄罗方块课程设计
通过该课程设计,全面系统的理解了编译原理程序构造的一般原理和基本实现方法。把死板的课本知识变得生动有趣,激发了学习的积极性。把学过的计算机编译原理
沈 阳 大 学
课程设计说明书NO.14
的知识强化,能够把课堂上学的知识通过自己设计的程序表示出来,加深了对理论知识的理解。以前对与计算机操
作系统的认识是模糊的,概念上的,现在通过自己动手做实验,从实践上认识了Java是如何编写命令的,如何协调计算机内部各个部件运行,对计算机编译原理的认识更加深刻。课程设计中程序比较复杂,在调试时应该仔细,在程序调试时,注意构造,将不必要的命令去除。
屏幕数组:int [][] scrArr
对方快的引用:Block b
以下几个图分别为在运行后的结果截图。图16为在开始后落下方块的截图;图17为得分后的截图;图18为提高级数后的截图;图19为游戏方块落满后的截图。
图16开始后落下方块
沈 阳 大 学
课程设计说明书NO.11
图16注释:
返回新块的初始行坐标方法:public int getInitRow()
返回新块的初始行坐标:return(blockInitRow)
返回新块的初始列坐标方法:public int getInitCol()
返回新块的初始列坐标:return(blockInitCol)
图17得分后
图17注释:
满行删除方法:void deleteFullLine()
沈 阳 大 学
课程设计说明书NO.12
ers.addWindowListener(win_listener);
}
//俄罗斯方块类的构造方法
2.3类、包及其描述
java类的动态装载是java语言能力动态性的根源;研究理解它是每一个java设计和代码人员不能忽视的特点,因为很多底层和问题和不理解的技术都来源于它;可以这么说它是热插拨(plug and pay)的根本,是IOC(Sping/PicoContant)的技术最有力的支持,能善用它为设计和实现一个很好的框架必不可少的技术。对于其他技术(C/C++)没有动态特性的语言来说,要运用底层的OS系统所提供的机制,设计人员必須多費一些功夫来编写额外的程序代码(例如Windows 平台上需要使用LoadLibrary()與GetProcAddress()兩個Win32 API 来完成动态的需求),這些额外编写的程序代码也会因为平台的不同而不同,毕竟這些额外的程序代码本身的运作逻辑很少关联,所以维护起来虽不算复杂,但仍有其难度。

java俄罗斯方块课程设计

java俄罗斯方块课程设计

java俄罗斯方块课程设计一、课程目标知识目标:1. 学生能理解Java语言的基本语法和面向对象编程思想;2. 学生能掌握Java图形用户界面编程,熟练运用Swing组件;3. 学生能了解俄罗斯方块游戏的规则和逻辑。

技能目标:1. 学生能够运用Java语言编写简单的图形用户界面程序;2. 学生能够运用面向对象编程思想设计和实现俄罗斯方块游戏;3. 学生能够通过调试和修改代码,优化游戏性能。

情感态度价值观目标:1. 学生培养编程兴趣,激发学习Java语言的热情;2. 学生培养团队协作精神,学会与他人共同解决问题;3. 学生培养良好的编程习惯,注重代码规范和程序优化。

分析课程性质、学生特点和教学要求,本课程目标具体、可衡量,旨在让学生通过学习Java语言实现俄罗斯方块游戏,掌握基本的编程知识和技能。

同时,课程注重培养学生的编程兴趣和团队协作精神,使学生在学习过程中形成积极的情感态度和价值观。

课程目标将分解为具体的学习成果,便于后续教学设计和评估。

二、教学内容1. Java基本语法和面向对象编程思想:包括数据类型、变量、运算符、控制结构、类和对象、继承与多态等基本概念。

- 教材章节:第1章 Java概述,第2章 Java基本语法,第3章 面向对象编程基础。

2. Java图形用户界面编程:介绍Swing组件的使用,包括窗口、按钮、面板等,以及事件处理机制。

- 教材章节:第4章 图形用户界面编程,第5章 事件处理。

3. 俄罗斯方块游戏设计与实现:- 游戏规则和逻辑:介绍俄罗斯方块游戏的规则、游戏界面的设计以及游戏逻辑的实现。

- 游戏编程:利用Java语言和Swing组件实现俄罗斯方块游戏。

- 教材章节:第6章 Java绘图,第7章 多线程。

4. 调试与优化:- 代码调试:教授学生如何找出并修复代码中的错误。

- 性能优化:介绍提高程序运行效率的方法和技巧。

教学内容安排和进度:1. 第1-2周:学习Java基本语法和面向对象编程思想。

俄罗斯方块java课程设计

俄罗斯方块java课程设计

俄罗斯方块java课程设计一、课程目标知识目标:1. 掌握Java基本语法和编程规范;2. 学会使用Java面向对象编程思想设计类和对象;3. 了解俄罗斯方块游戏的规则和基本逻辑;4. 掌握在Java中实现图形用户界面(GUI)的方法。

技能目标:1. 能够运用所学知识编写简单的Java程序;2. 培养逻辑思维能力和问题解决能力,将俄罗斯方块游戏逻辑转化为代码实现;3. 学会使用Java的Swing库创建图形用户界面,实现游戏交互;4. 提高团队协作和沟通能力,通过分组合作完成课程设计。

情感态度价值观目标:1. 培养对编程的兴趣和热情,激发主动学习的动力;2. 培养良好的编程习惯,注重代码规范和优化;3. 增强自信心,勇于面对编程挑战,善于克服困难;4. 学会与他人分享和交流编程经验,互相学习,共同进步。

课程性质:本课程设计为实践性课程,旨在让学生在动手实践中掌握Java编程知识,培养实际编程能力。

学生特点:学生处于具有一定Java基础知识的阶段,具备基本的编程思想和语法知识,但实践经验不足。

教学要求:注重理论与实践相结合,引导学生运用所学知识解决实际问题,培养编程思维和实际操作能力。

在教学过程中,关注学生个体差异,提供个性化指导,确保每位学生都能在课程中取得实际的学习成果。

通过分组合作,培养学生团队协作和沟通能力,提高解决问题的综合能力。

二、教学内容1. Java基本语法与编程规范复习(1课时)- 变量、数据类型与运算符- 控制语句(条件语句、循环语句)2. 面向对象编程基础(2课时)- 类与对象的概念- 封装、继承与多态- 抽象类与接口3. 俄罗斯方块游戏规则与逻辑分析(1课时)- 游戏规则介绍- 游戏逻辑设计4. Java图形用户界面(GUI)编程(2课时)- Swing库简介- 创建窗体、面板和组件- 事件处理机制5. 俄罗斯方块游戏编程实践(4课时)- 游戏界面设计- 方块形状、移动与旋转实现- 游戏逻辑处理(消行、得分、游戏结束判断)- 游戏整体测试与优化6. 课程总结与展示(1课时)- 学生分组展示作品- 总结编程过程中遇到的问题及解决方法- 教师点评与反馈教学内容安排与进度:1. 前3课时为理论知识复习与扩展,第4课时进行游戏规则与逻辑分析;2. 第5课时开始进入实际编程环节,分阶段完成游戏设计;3. 最后1课时进行课程总结与展示。

java俄罗斯方块课程设计

java俄罗斯方块课程设计

java 俄罗斯方块课程设计一、教学目标本课程的学习目标包括知识目标、技能目标和情感态度价值观目标。

知识目标要求学生掌握Java编程基础,了解俄罗斯方块游戏的规则和逻辑。

技能目标要求学生能够使用Java语言编写简单的俄罗斯方块游戏,培养学生的编程能力和问题解决能力。

情感态度价值观目标要求学生培养对计算机科学的兴趣和热情,培养学生的创新精神和团队合作意识。

二、教学内容本课程的教学内容主要包括Java编程基础、俄罗斯方块游戏的规则和逻辑、以及Java语言编写俄罗斯方块游戏的过程。

首先,学生将学习Java编程基础,包括变量、数据类型、运算符、控制语句等。

然后,学生将学习俄罗斯方块游戏的规则和逻辑,包括方块的移动、旋转、消行等。

最后,学生将使用Java语言编写俄罗斯方块游戏,包括界面设计、游戏逻辑实现等。

三、教学方法本课程的教学方法包括讲授法、讨论法、案例分析法和实验法。

首先,教师将通过讲授法向学生传授Java编程基础和俄罗斯方块游戏的规则和逻辑。

然后,教师将学生进行讨论,鼓励学生提出问题和解决问题,培养学生的思维能力和问题解决能力。

接着,教师将通过案例分析法向学生展示一些经典的俄罗斯方块游戏编程案例,让学生分析和理解游戏的实现过程。

最后,教师将学生进行实验,让学生亲自动手编写俄罗斯方块游戏,培养学生的实践能力和创新精神。

四、教学资源本课程的教学资源包括教材、参考书、多媒体资料和实验设备。

教材和参考书将提供Java编程基础和俄罗斯方块游戏的相关知识,供学生自学和参考。

多媒体资料将提供一些俄罗斯的方块游戏的演示和教学视频,帮助学生更好地理解游戏的规则和逻辑。

实验设备将支持学生进行实验,包括计算机、编程软件等。

五、教学评估本课程的评估方式包括平时表现、作业和考试。

平时表现将根据学生在课堂上的参与度、提问和回答问题的情况进行评估。

作业将包括编程练习和项目任务,以检验学生对Java编程和俄罗斯方块游戏的掌握程度。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、程序功能介绍本程序实现了俄罗斯方块游戏的基本功能,游戏中玩家可以做的操作有:1.中间一个方块不变其他三个以90度为单位向右旋转方每一格块,此程序会判断方块有没有空间让他实现旋转,即判断是否越界,若越界则不可以实现旋转。

2.以格子为单位左右移动方块,下方向让方块加速落下,空格键则急速下落。

3.方块移到区域最下方或是着地到其他方块上无法移动时,就会固定在该处,而新的随机图形会出现在区域上方开始落下。

4.当区域中某一列横向格子全部由方块填满,则该列会自动消除并成为玩家的得分。

同时删除的列数越多,得分指数上升。

5.当固定的方块堆到区域最上方,则游戏结束。

(此功能尚未实现)6.此程序还不完善,开始,暂停,重来,结束都没有实现,有待改进。

二、课程设计过程1、总体概述:设计一个简单的游戏,能够将Java的面向对象程序思想应用到课程设计中,用到Java 中常用的组件以及相应的布局方式。

完成设计、编程、测试等过程,给出设计思路、设计说明书、主要的代码的说明、源代码以及可运行的游戏程序。

2、各个子类的定义:1.定义俄罗斯方块类,通过可视化界面设定一个游戏界面窗口,用一个10*20表示游戏区域。

public class TetrisGame extends JPanelJFrame jf=new JFrame("俄罗斯方块");jf.setSize(540,600);jf.setVisible(true);public static final int ROWS=20;public static final int COLS=10;2.定义7种俄罗斯方块的基本类型,分别以S、Z、L、J、I、O、T这7个字母的形状来命名。

先定义四方格主类:public class Tetromino;再定义它的7个子类:S、Z、L、J、I、O、Tprivate static class S extends Tetromino;private static class Z extends Tetromino;private static class L extends Tetromino;private static class J extends Tetromino;private static class I extends Tetromino;private static class O extends Tetromino;private static class T extends Tetromino;3.通过switch语句,随机输出方块到游戏区域顶部。

public static Tetromino randomOne();4.用键盘监听来实现下落、移动、旋转变形。

键盘监听:public void keyPressed(KeyEvent e);软着陆:protected void softDropAction();硬着陆:protected void hardDropAction();左移:protected void moveLeftAction();右移:protected void moverightAction();右旋:public void rotateRight();repaint();重绘java里repaint()是重绘component的方法;component中己有的图形发生变化后不会立刻显示,须使用repaint方法。

component简而言之,组件就是对象。

C++Builder中叫组件,Delphi中叫部件,而在Visual BASIC中叫控件。

组件是对数据和方法的简单封装。

C++ Builder中,一个组件就是一个从TComponent派生出来的特定对象组件可以有自己的属性和方法。

判断是否越界:private boolean canMoveR();//是否碰墙,是否有其他图形private boolean outOfBoundsTB();//private boolean baoHanR();//判断右侧墙上是否有内容private boolean baoHanL();//判断左侧墙上是否有内容private boolean outOfBoundsR();private boolean outOfBoundsL();5.绘制图像public void paint(Graphics g);private void paintScore(Graphics g);private void paintNextOne(Graphics g);private void paintWall(Graphics g);private void paintTetromino(Graphics g);6.每次摆放如果将场地的一行或多行完全填满,则组成这些行的所有小正方形将被消除,并且以此来换取积分。

判断是否行满:private boolean fullCells(int row);消行:private void destroyLines();3、导入各种包:1、java.awt.Font:Font类表示字体,可以使用它以可见方式呈现文本。

字体提供将字符序列映射到字形序列所需要的信息,以便在Graphics对象和Component对象上呈现字形序列。

2、java.awt.Graphics:是一个用来绘制2D图像必须导入的java包,提供对图形图像的像素,颜色的绘制。

3、java.awt.Image:提供创建和修改图像的各种类。

使用流框架来处理图像,该框架涉及图像生产者、可选的图像过滤器和图像使用者。

此框架使得在获取和生成图像的同时逐步呈现该图像成为可能。

而且,该框架允许应用程序丢弃图像使用的存储空间并随时重新生成它。

此包提供了多种图像生产者、使用者和过滤器,可以根据图像处理的需要来配置它们。

4、java.awt.event.KeyAdapter:接收键盘事件的摘要适配器类。

方法在这类。

这类方便创建侦听器对象的存在。

扩展这个类来创建一个键盘事件听众和覆盖感兴趣的事件的方法。

(如果你实施KeyListener接口,你必须定义所有的方法,它。

这个抽象类定义了无效的方法所有,所以你只能定义为事件你关心的方法。

)创建一个使用扩展类的听众对象然后登记与组件使用组件的addkeylistener方法当一个键被按下,释放,或类型,方法在听者相关对象时,键盘事件通过它。

5、java.awt.event.KeyEvent:提供处理由AWT组件所激发的各类事件的接口和类。

有关AWT事件模型的细节,请参见java.awt.AWTEvent类。

事件由事件源所激发。

向事件源注册的事件侦听器可接收有关特定事件类型的通知。

此包定义了事件和事件侦听器,以及事件侦听器适配器,它是让事件侦听器的编写过程更为轻松的便捷类。

6、java.awt.event.KeyListener:用于接收键盘事件(击键)的侦听器接口。

旨在处理键盘事件的类要么实现此接口(及其包含的所有方法),要么扩展抽象KeyAdapter类(仅重写有用的方法)。

然后使用组件的addKeyListener方法将从该类所创建的侦听器对象向该组件注册。

按下、释放或键入键时生成键盘事件。

然后调用侦听器对象中的相关方法并将该KeyEvent传递给它。

7、java.awt.event.KeyListener:java.util.Arrays类包含一个静态的工厂,允许数组被视为列表。

以下是关于数组的要点:这个类包含了各种方法来操作数组(比如排序和搜索)。

在这个类中的方法抛出NullPointerException如果指定数组引用为null。

8、javax.imageio.ImageIO:此包包含一些基本类和接口,有的用来描述图像文件内容(包括元数据和缩略图)(IIOImage)有的用来控制图像读取过程(ImageReader、ImageReadParam和ImageTypeSpecifier)和控制图像写入过程(ImageWriter和ImageWriteParam);还有的用来执行格式之间的代码转换(ImageTranscoder)和报告错误(IIOException)。

9、javax.swing.JFrame:java的GUI程序的基本思路是以JFrame为基础,它是屏幕上window的对象,能够最大化、最小化、关闭。

10、javax.swing.JPanel:JPanel类是一个通用的轻量级容器。

11、java.util.Random:Random是数的随机生成器。

4、程序功能设计:功能模块图:如图1:图1功能模块图main 框架墙下一个图形计分监听器判断越界判断到底N 判断消行左移右移变形软下降硬下降消行重画墙计分重画墙YN三、程序运行的结果分析1、初始界面如图2:有一个方块下来且右上方矩形中显示下一个方块图2初始状态图2、当底部有一行方块填充,进行计算行数并加分及消除该行,结果如图3图3计分消行图四、课程设计总结这次JAVA课程设计我选择了做俄罗斯方块这个小游戏,刚开始很迷茫,不知道该怎么做,多次想要换题,但是由于很早玩过这个游戏所以对于它产生了兴趣,想要知道它到底是怎么做成的。

之后经过网上查询以及请教学霸等方法,终于慢慢的开始打代码,在学习过程中,我学到了一些关于做游戏的相关知识,比如说怎么设置界面,设置面板,画游戏界面等,也在过程中发现了自己的不足之处。

运行程序的时候出现了几个问题:1、不知道该用哪些函数2、一段一段代码总有好多漏洞,要判断好多东西,比如它是否到达底部的墙上,墙上是否有方块,到底怎样使它自动下降等。

经过这次课程设计,我对java这门课程更加了解了,学习也有了方向感,明白了基础知识很重要,但实践也很重要。

强大的理论功底和动手能力结合才是一个工程师必备的,理论与实践结合才是完美的。

我们应该抓住每次实验的机会,实打实的学些东西,还有在学校提供的学习平台里面好好学习。

当然,这些也离不开我们老师的悉心指导,所以我们更应该不负老师所望,今后我们强化自己的知识的认识,在这里想跟老师说一声,非常感谢。

五、程序设计的完整代码及注解package newTetris;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.Image;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import java.util.Arrays;import javax.imageio.ImageIO;import javax.swing.JFrame;import javax.swing.JPanel;public class TetrisGame extends JPanel{public static final int ROWS=20;public static final int COLS=10;public static final int CELL_SIZE=26;//格子的大小private int score;//计分private int lines=0;//计消除行Tetromino t=Tetromino.randomOne();Tetromino next=Tetromino.randomOne();//下一张图private Cell[][]wall=new Cell[20][10];//墙public static Image background;//声明变量public static Image I;public static Image T;public static Image S;public static Image Z;public static Image L;public static Image J;public static Image O;static{try{background=ImageIO.read(TetrisGame.class.getResource("tetris.png"));I=ImageIO.read(TetrisGame.class.getResource("I.png"));T=ImageIO.read(TetrisGame.class.getResource("T.png"));S=ImageIO.read(TetrisGame.class.getResource("S.png"));Z=ImageIO.read(TetrisGame.class.getResource("Z.png"));L=ImageIO.read(TetrisGame.class.getResource("L.png"));J=ImageIO.read(TetrisGame.class.getResource("J.png"));O=ImageIO.read(TetrisGame.class.getResource("O.png"));}catch(Exception e){e.printStackTrace();}}public static void main(String[]args){JFrame jf=new JFrame("俄罗斯方块");TetrisGame tetris=new TetrisGame();jf.add(tetris);jf.setSize(540,590);jf.setLocationRelativeTo(null);//居中jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);jf.setVisible(true);tetris.action();}private void action(){KeyListener kL=new KeyAdapter(){public void keyPressed(KeyEvent e){int key=e.getKeyCode();switch(key){case KeyEvent.VK_DOWN:softDropAction();break;case KeyEvent.VK_RIGHT:moveRightAction();break;case KeyEvent.VK_LEFT:moveLeftAction();break;case KeyEvent.VK_UP:rotateRightAction();break;case KeyEvent.VK_SPACE:hardDropAction();break;}repaint();}};this.addKeyListener(kL);//添加到jpanelthis.requestFocus();while(true){softDropAction();repaint();try{Thread.sleep(700);}catch(InterruptedException e1){//TODO自动生成的catch块e1.printStackTrace();}}}protected void hardDropAction(){while(canDrop()){if(canDrop()){Cell[]cells=t.cells;for(int i=0;i<cells.length;i++){cells[i].drop();//一直下落,直到不能下落,写到墙上}}}landWall();//着陆到墙上destroyLines();t=next;//下一张图替换当前next=Tetromino.randomOne();}protected void rotateRightAction(){t.rotateRight();//如果越界,则转回if(outOfBoundsTB()||outOfBoundsL()||baoHanL()||outOfBoundsR()||baoHanR()) t.rotateLeft();}protected void moveLeftAction(){if(canMoveL()){Cell[]cells=t.cells;for(int i=0;i<cells.length;i++){cells[i].moveLeft();}}else{}}protected void moveRightAction(){if(canMoveR()){Cell[]cells=t.cells;for(int i=0;i<cells.length;i++){cells[i].moveRight();}}else{}}protected void softDropAction(){if(canDrop()){//判断有无靠边和落底Cell[]cells=t.cells;for(int i=0;i<cells.length;i++){cells[i].drop();}}else{landWall();//画到墙上去destroyLines();t=next;//下一张图替换当前next=Tetromino.randomOne();//下一张重新生成}}private void destroyLines(){for(int row=0;row<20;row++){if(fullCells(row)){deleteLine(row);//消行lines++;score+=10;}}}private void deleteLine(int row){//消行for(int i=row;i>=1;i--){System.arraycopy(wall[i-1],0,wall[i],0,10);}Arrays.fill(wall[0],null);}private boolean fullCells(int row){Cell[]line=wall[row];for(Cell c:line){if(c==null){return false;}}return true;}private void landWall(){//图形的四个格子填充墙对应位置Cell[]cells=t.cells;for(int i=0;i<cells.length;i++){Cell c=cells[i];int row=c.getRow();int col=c.getCol();wall[row][col]=c;}}//判断能否继续,是否有其他图形private boolean canDrop(){Cell[]cells=t.cells;for(int i=0;i<cells.length;i++){Cell c=cells[i];if(c.getRow()==19)return false;}for(Cell c:cells){//如果碰到东西就不可落int row=c.getRow()+1;int col=c.getCol();if(wall[row][col]!=null)return false;}return true;}//是否碰墙,是否有其他图形private boolean canMoveR(){if(outOfBoundsR()||baoHanR()){return false;}return true;}private boolean canMoveL(){if(outOfBoundsL()||baoHanL()){return false;}return true;}//判断右侧墙上是否有内容private boolean baoHanR(){Cell[]cells=t.cells;for(Cell c:cells){int col=c.getCol();if(row>=0&&row<=20&&col>=0&&col<=10&&wall[row][col+1]!=null){ return true;}}return false;}//判断左侧墙上是否有内容private boolean baoHanL(){Cell[]cells=t.cells;for(Cell c:cells){int row=c.getRow();int col=c.getCol();if(row>=0&&row<=20&&col>=0&&col<=10&&wall[row][col-1]!=null){ return true;}}return false;}private boolean outOfBoundsTB(){Cell[]cells=t.cells;for(Cell c:cells){int row=c.getRow();if(row>=19||row<=0){return true;}}return false;}private boolean outOfBoundsL(){Cell[]cells=t.cells;for(Cell c:cells){int col=c.getCol();//int row= c.getRow();if(col<1){return true;}}return false;}private boolean outOfBoundsR(){Cell[]cells=t.cells;for(Cell c:cells){//int row= c.getRow();if(col>8){return true;}}return false;}public void paint(Graphics g){g.drawImage(background,0,0,null);g.translate(15,15);//坐标系平移paintWall(g);//画墙paintTetromino(g);//下落的图paintNextOne(g);//右边那个paintScore(g);//计分计行g.translate(-15,-15);//画笔恢复原位}private void paintScore(Graphics g){int x=289;int y=160;g.setColor(Color.BLUE);Font font=new Font("楷体",Font.BOLD,30);g.setFont(font);String str="SCORE:"+score;g.drawString(str,x,y);//绘制字符串y+=56;str="LINES:"+lines;g.drawString(str,x,y);//行数}private void paintNextOne(Graphics g){if(next!=null){Cell[]cells=next.cells;for(int i=0;i<cells.length;i++){Cell cell=cells[i];int x=(cell.getCol()+10)*CELL_SIZE;int y=(cell.getRow()+1)*CELL_SIZE;g.drawImage(cell.getImage(),x,y,null);}}}private void paintWall(Graphics g){for(int row=0;row<wall.length;row++){Cell[]line=wall[row];for(int col=0;col<10;col++){Cell cell=line[col];int x=col*CELL_SIZE;int y=row*CELL_SIZE;if(cell==null){//判断墙是否有内容g.drawRect(x,y,CELL_SIZE,CELL_SIZE);}else{g.drawImage(cell.getImage(),x-1,y-1,null);}}}}private void paintTetromino(Graphics g){Cell[]cells=t.cells;for(int i=0;i<cells.length;i++){Cell c=cells[i];int x=c.getCol()*CELL_SIZE;int y=c.getRow()*CELL_SIZE;g.drawImage(c.getImage(),x,y,null);}}}package newTetris;import java.awt.Image;public class Cell{int row;//行int col;//列Image image;//这个格子上有的图形public Cell(int row,int col,Image image){super();this.row=row;this.col=col;this.image=image;}public int getRow(){return row;}public void setRow(int row){this.row=row;}public int getCol(){return col;}public void setCol(int col){this.col=col;}public Image getImage(){return image;}public void setImage(Image image){this.image=image;}//调试格子处于第几行第几列public String toString(){return"第"+row+"行"+"第"+col+"列";}public void drop(){row++;}public void moveLeft(){col--;}public void moveRight(){col++;}}package newTetris;import java.util.Random;public class Tetromino{Cell[]cells=new Cell[4];State[]states;//四个方块int index=1000;private static class T extends Tetromino{public T(){cells[0]=new Cell(0,4,TetrisGame.T);cells[1]=new Cell(0,3,TetrisGame.T);cells[2]=new Cell(0,5,TetrisGame.T);cells[3]=new Cell(1,4,TetrisGame.T);states=new State[4];states[0]=new State(0,0,0,-1,0,1,1,0);states[1]=new State(0,0,-1,0,1,0,0,-1);states[2]=new State(0,0,0,1,0,-1,-1,0);states[3]=new State(0,0,1,0,-1,0,0,1);}}private static class I extends Tetromino{public I(){cells[0]=new Cell(0,4,TetrisGame.I);cells[1]=new Cell(0,3,TetrisGame.I);cells[2]=new Cell(0,5,TetrisGame.I);cells[3]=new Cell(0,6,TetrisGame.I);states=new State[]{new State(0,0,0,1,0,-1,0,-2), new State(0,0,-1,0,1,0,2,0)};}}private static class S extends Tetromino{public S(){cells[0]=new Cell(0,4,TetrisGame.S);cells[1]=new Cell(0,5,TetrisGame.S);cells[2]=new Cell(1,3,TetrisGame.S);cells[3]=new Cell(1,4,TetrisGame.S);states=new State[]{new State(0,0,0,1,1,-1,1,0),new State(0,0,-1,0,1,1,0,1)};}}private static class L extends Tetromino{public L(){cells[0]=new Cell(0,4,TetrisGame.L);cells[1]=new Cell(0,3,TetrisGame.L);cells[2]=new Cell(0,5,TetrisGame.L);cells[3]=new Cell(1,3,TetrisGame.L);states=new State[]{new State(0,0,0,-1,0,1,1,-1),new State(0,0,-1,0,1,0,-1,-1),new State(0,0,0,1,0,-1,-1,1),new State(0,0,1,0,-1,0,1,1)};}}private static class J extends Tetromino{public J(){cells[0]=new Cell(0,4,TetrisGame.J);cells[1]=new Cell(0,3,TetrisGame.J);cells[2]=new Cell(0,5,TetrisGame.J);cells[3]=new Cell(1,5,TetrisGame.J);states=new State[]{new State(0,0,0,-1,0,1,1,1),new State(0,0,-1,0,1,0,1,-1),new State(0,0,0,1,0,-1,-1,-1),new State(0,0,1,0,-1,0,-1,1)};}}private static class O extends Tetromino{ public O(){cells[0]=new Cell(0,4,TetrisGame.O);cells[1]=new Cell(0,5,TetrisGame.O);cells[2]=new Cell(1,4,TetrisGame.O);cells[3]=new Cell(1,5,TetrisGame.O);states=new State[]{new State(0,0,0,1,1,0,1,1),new State(0,0,0,1,1,0,1,1)};}}private static class Z extends Tetromino{ public Z(){cells[0]=new Cell(1,4,TetrisGame.Z);cells[1]=new Cell(0,3,TetrisGame.Z);cells[2]=new Cell(0,4,TetrisGame.Z);cells[3]=new Cell(1,5,TetrisGame.Z);states=new State[]{new State(0,0,-1,-1,-1,0,0,1),new State(0,0,-1,1,0,1,1,0)};}}public static Tetromino randomOne(){Random r=new Random();int type=r.nextInt(7);switch(type){case0:return new T();case1:return new I();case2:return new S();case3:return new J();case4:return new L();case5:return new O();case6:return new Z();}return null;}//右旋转方法public void rotateRight(){index++;State s=states[index%states.length];//s是旋转状态数量Cell c=cells[0];int row=c.getRow();int col=c.getCol();//设置其他三格子位置cells[1].setRow(row+s.row1);cells[1].setCol(col+s.col1);cells[2].setRow(row+s.row2);cells[2].setCol(col+s.col2);cells[3].setRow(row+s.row3);cells[3].setCol(col+s.col3);}public void rotateLeft(){index--;State s=states[index%states.length];Cell c=cells[0];int row=c.getRow();int col=c.getCol();//设置其他三格子位置cells[1].setRow(row+s.row1);cells[1].setCol(col+s.col1);cells[2].setRow(row+s.row2);cells[2].setCol(col+s.col2);cells[3].setRow(row+s.row3);cells[3].setCol(col+s.col3);}class State{int row0,col0,row1,col1,row2,col2,row3,col3;public State(int row0,int col0,int row1,int col1,int row2, int col2,int row3,int col3){super();this.row0=row0;this.col0=col0;this.row1=row1;this.col1=col1;this.row2=row2;this.col2=col2;this.row3=row3;this.col3=col3;}}}。

相关文档
最新文档