软件工程俄罗斯方块

合集下载

俄罗斯方块游戏的开发需求分析

俄罗斯方块游戏的开发需求分析

俄罗斯方块游戏的开发组长:XXX组员:XXX XXX XXX XXX05软件工程一班一、课程设计的目的和意义俄罗斯方块游戏是一个经典的小游戏,由于它简单有趣,因而得到了广泛的流行,男女老幼都适合。

而俄罗斯方块游戏的设计工作复杂且富有挑战性,它包含的内容多,涉及的知识广泛,与图形界面联系较大,包括界面的显示与更新、数据收集等,在设计的过程中,必将运用到各方面的知识,这对于visualbasi语言设计者而言,是个很好的锻炼机会。

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

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

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

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

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

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

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

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

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

三、系统功能设计分析俄罗斯方块游戏根据功能的不同,设置了如下12个类:Square,Command,GameArea,GameSetting,GameOver,Help,ImagePanel,JieMian,MyPanel, MyTimer,PlayMidi,WinListener,每个类的描述如下:1、Square,方块类。

这个类中定义了生成方块的方法,用二维数组int[][]pattern,存放7种方块的四种状态。

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

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

一、程序功能介绍本程序实现了俄罗斯方块游戏的基本功能,游戏中玩家可以做的操作有: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语句,随机输出方块到游戏区域顶部。

基于JAVA技术的俄罗斯方块游戏的设计与实现

基于JAVA技术的俄罗斯方块游戏的设计与实现

基于JAVA技术的俄罗斯方块游戏的设计与实现引言俄罗斯方块是一款经典的游戏,深受人们的喜爱。

本文将介绍基于JAVA技术的俄罗斯方块游戏的设计与实现,包括游戏的界面设计、游戏逻辑设计以及代码的实现。

一、界面设计1.游戏界面包括一个游戏区域和一个信息区域,游戏区域用来显示方块和进行游戏,信息区域用来显示得分、下一个方块等信息。

2. 游戏区域可以使用网格布局来表示,每个方格可以用一个Label 来表示,并设置相应的背景颜色。

3. 信息区域可以使用一个Panel来表示,包括得分、下一个方块等信息的显示。

二、游戏逻辑设计1.方块的表示:每个方块由4个小方块组成,可以使用一个4x4的二维数组来表示方块的状态,数组中的值为1表示存在方块,为0表示不存在方块。

2.方块的移动:方块可以向左、向右、向下进行移动。

移动时需要判断是否会与已有方块重叠或越界,如果是则不能移动。

3.方块的旋转:方块可以进行顺时针旋转。

旋转时需要判断旋转后的方块是否会与已有方块重叠或越界,如果是则不能旋转。

4.方块的消除:当一行方块被填满时需要进行消除,并计算得分。

消除后需要将上方的方块进行下落,直至没有可消除的方块为止。

三、代码实现1.在游戏界面中添加键盘监听事件,监听方向键和空格键的按下事件。

2.通过监听事件来判断用户的操作,如向左移动、向右移动、向下移动、旋转、加速下落等。

3.使用计时器来定时触发方块向下移动的操作,即每隔一定时间方块自动向下移动一格。

4.在移动方块时,需要判断是否会与已有方块重叠或越界,如果是则不能移动。

5.在旋转方块时,需要判断旋转后的方块是否会与已有方块重叠或越界,如果是则不能旋转。

6.在消除方块时,需要判断是否有一行被填满,如果是则进行消除,并计算得分。

7.在消除方块后,需要将上方的方块进行下落,直至没有可消除的方块为止。

结论通过本文的介绍,我们了解了基于JAVA技术的俄罗斯方块游戏的设计与实现。

该游戏采用了网格布局来表示游戏区域,并通过监听事件和计时器来实现方块的移动和消除。

基于java的俄罗斯方块设计与实现

基于java的俄罗斯方块设计与实现

基于java的俄罗斯方块设计与实现基于Java的俄罗斯方块设计与实现俄罗斯方块是一款经典的游戏,它的玩法简单,但是难度很大,极具挑战性。

本文将介绍基于Java的俄罗斯方块的设计和实现,让读者了解如何利用Java语言实现这个游戏。

一、游戏规则俄罗斯方块的游戏规则很简单,玩家需要控制下落的方块,使其在底部拼出完整的行,拼完一行就会消失,拼出的行数越多,得分就越高。

玩家需要尽可能地拼出更多的行,同时要注意避免方块堆积到顶部,否则游戏就结束了。

二、设计思路在设计基于Java的俄罗斯方块时,我们需要考虑以下几个方面:1. 方块的设计俄罗斯方块包含7种不同的方块,每种方块由4个小方块组成。

因此,在设计方块时,我们需要定义一个方块类,每个方块实例包含4个小方块。

在游戏开始时,我们需要随机生成一个方块,让它从屏幕顶部开始下落。

2. 游戏界面的设计游戏界面应该包括以下几个部分:a. 方块区域这个区域显示当前正在下落的方块,并在方块堆积到底部时将方块固定在该区域。

b. 下一个方块区域这个区域显示下一个要下落的方块,让玩家提前预知一下,方便做出决策。

c. 得分区域这个区域显示当前的得分情况。

3. 方块的移动和旋转在游戏中,玩家需要控制方块的移动和旋转,这是俄罗斯方块的核心玩法。

因此,在设计游戏时,我们需要定义方块的移动和旋转方法,让玩家能够控制方块。

4. 方块的消除当玩家将方块拼成一行时,该行就会被消除。

因此,在游戏中,我们需要定义一个消除方法,用于检查游戏区域中是否有完整的行,如果有,则将该行消除,并更新得分情况。

三、实现步骤在设计思路明确之后,我们可以开始实现基于Java的俄罗斯方块了。

具体实现步骤如下:1. 定义方块类在方块类中,我们需要定义方块的类型、颜色、位置等属性,以及移动、旋转、判断是否可以移动等方法。

2. 定义游戏界面游戏界面包括方块区域、下一个方块区域、得分区域等。

我们需要使用Swing或JavaFX等GUI库来实现游戏界面。

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文件打包游戏,方 便分发和运行

俄罗斯方块软件需求说明书

俄罗斯方块软件需求说明书

1引言 ................................................................................................................ 错误!未定义书签。

1.1编写目旳................................................................................................. 错误!未定义书签。

1.2背景......................................................................................................... 错误!未定义书签。

1.3定义......................................................................................................... 错误!未定义书签。

1.4参照资料................................................................................................. 错误!未定义书签。

2任务概述 ........................................................................................................ 错误!未定义书签。

2.1目旳......................................................................................................... 错误!未定义书签。

软件作业俄罗斯方块游戏2

软件作业俄罗斯方块游戏2

目录一、需求分析1.电子游戏的发展状况 (1)2.设计目标 (6)3.游戏需求 (6)4.软硬件环境 (7)二、总体设计2.1游戏设计方案的确定 (8)2.2系统流程结构设计 (9)2.3各个功能图模块设计 (9)三、详细设计3.1模型层设计 (10)3.2视图层设计 (16)3.3控制层设计 (18)3.4游戏演示 (18)四、系统测试分析4.1游戏界面菜单选项的功能测试 (21)4.2按键事件的功能测试 (22)4.3方块堆砌与消行测试 (22)4.4测试结果分析 (23)五、个人小结 (23)一、需求分析1. 电子游戏发展现状1.1 电子游戏在国外的发展现状电子游戏是最初产生于美国,1971年,一个还在MIT就读的学生设计了世界上第一个业务用游戏机,这个街机游戏的名字叫《电脑空间》。

可以说时至今日,电子游戏仍然是外国的天下。

美国至今仍是世界第一大游戏市场,它遵循的是以发行商为主的产业开发链模式,根据美国市场调查公司NPD Group调查统计,美国2004年游戏总销售金额(包括家用、掌上型主机及软件)为99亿美元,占了全球游戏市场的45%。

其中游戏软件销售的具体数字是:视频游戏软件的销售额达52亿美元(1.6亿套),PC游戏软件销售额达11亿美元(4500万套),掌机游戏销售额达10亿美元(4230万套)。

2004年一共大约有2.48亿套游戏售出。

据估计,美国每个家庭平均购买过2部游戏[3]。

日本近20年来疯狂赚电子游戏的钱。

从上世纪60年代初的街机,到六七十年代之间的家用游戏机,再到八九十年代的掌上游戏机,日本经过30多年的耕耘,终于把电子游戏这棵“摇钱树”,培育成第一时尚娱乐产业,垄断全球业界长达10余年。

对于日本来说,电玩业已是国家经济的重要支柱之一,在GDP中占有1/5的举足轻重地位。

日本游戏业在最辉煌的1998年,曾经占领全球电子游戏市场硬件90%以上,软件50%以上。

韩国号称世界上网络游戏产业最发达国家之一。

JAVA--俄罗斯方块实验报告

JAVA--俄罗斯方块实验报告

JAVA–俄罗斯方块实验报告实验目的本次实验旨在通过使用JAVA程序设计语言编写俄罗斯方块游戏,巩固和深入理解JAVA语言的基础知识,提高编程实践能力。

实验环境本次实验主要使用了Java SE SDK 8环境,使用Eclipse Java EE IDE for Web Developers编程工具,以及Java AWT和Java Swing开发组件。

实验过程首先,我们需要确定游戏的基本功能和规则:•游戏开始时,屏幕上出现一个空白的方块区域,以及一个正在下落的方块组合(包括四个小方块);•玩家通过移动和旋转方块来使其落到正确的位置;•当一个完整的水平行被填满时,该行会消失并向下移动其上面的方块;•当屏幕上出现一个顶部行被填满时,游戏结束。

接下来,我们需要考虑如何实现这些功能:1.创建游戏屏幕并绘制方块•使用Java AWT和Java Swing组件创建一个屏幕窗口,并在该窗口中创建一个Panel,用于绘制游戏方块区域;•实现绘制方块的方法,例如,使用drawRect()方法绘制一个小方块,实现方块组合的方法。

2.状态管理和动作控制•状态管理:定义枚举类型来表示方块的状态(例如,下落、停止、旋转等);•动作控制:实现按键监听器来接收玩家输入的键盘事件,并根据事件执行相应的动作。

3.移动和旋转操作的实现•根据当前方块的状态,在方块组合中确定一个基准点,以此为基础进行方块的移动和旋转;•对于方块的移动,计算新的位置并检查其是否合法;•对于方块的旋转,计算新的方块组合位置并检查其是否合法,若不合法则撤销当前的旋转操作。

4.水平行填满的处理•在Panel中定义一个二维数组,存储每个小方块的位置以及其所在的行和列;•定义方法来检查每一行是否填满,并返回一个布尔值;•在检查到满行时,将该行变为灰色表示该行已填满,并将所有位于该行上方的方块向下移动一行。

5.游戏结束的处理•定义方法来判断游戏是否结束,判断条件为:新的方块组合不能在放置时超出游戏区域的顶部。

俄罗斯方块java程序设计步骤

俄罗斯方块java程序设计步骤

俄罗斯方块java程序设计步骤第一步:创建一个新的Java项目第二步:设计游戏窗口在这一步中,我们将使用Java的Swing库来实现游戏窗口。

可以通过创建一个继承自JFrame类的Java类来创建游戏窗口。

在游戏窗口中,你可以定义游戏的大小、标题和关闭按钮的行为。

第三步:绘制游戏界面接下来,我们需要定义游戏界面的外观。

你可以使用Java的图形库来绘制游戏界面,例如绘制方块、背景和得分等元素。

此外,你还需要定义游戏界面的布局,以便能够按照一定的规则来放置方块。

第四步:实现方块的移动和旋转接下来,我们需要实现方块的移动和旋转功能。

你可以通过键盘事件来监听玩家的按键操作,并根据按键的不同来移动或旋转方块。

此外,你还需要定义方块的初始位置和方向,以及方块的最大移动范围。

第五步:实现方块的下落和消除在游戏中,方块是从上方开始下落的。

一旦方块到达底部或者碰到其他方块,它将停止移动。

同时,当一行方块填满时,这一行的方块将会被消除。

你需要为方块的下落和消除编写相应的代码。

第六步:实现游戏的控制逻辑接下来,我们需要实现游戏的控制逻辑,包括游戏的开始和结束。

你可以为游戏定义相应的变量和状态,并编写相应的代码来处理游戏的开始和结束条件。

此外,你还需要实现游戏的计时器,以便控制方块的下落速度。

第七步:实现游戏的音效和界面动画如果你想让你的游戏更加生动和有趣,你可以为游戏添加一些音效和界面动画。

你可以使用Java的音频库来播放音效,并使用Java的图形库来实现一些简单的动画效果,例如方块的闪烁或者消除的动画。

第八步:测试和调试你的游戏最后,你需要测试和调试你的游戏,以确保它能够正常运行并且没有错误。

你可以通过模拟用户的操作来测试游戏的各种功能,并且检查游戏是否有任何异常或者崩溃。

如果发现任何问题,你可以使用调试工具来查找和修复错误。

总结:以上就是使用Java编程语言实现俄罗斯方块游戏的步骤。

通过按照这些步骤逐步实现,你将能够开发出一个完整和可玩的俄罗斯方块游戏。

JAVA课程设计俄罗斯方块(含代码)

JAVA课程设计俄罗斯方块(含代码)

Java程序课程设计任务书俄罗斯方块游戏的开发1、主要内容:俄罗斯方块游戏具有广泛的游戏人群,因为它比较简单有趣,无论老少都比较适合。

俄罗斯方块游戏的设计对于每一个Java语言设计者进行语言提高和进阶都是一个很好的锻炼机会。

俄罗斯方块游戏的设计工作是非常复杂和重要的,它涉及面逛,牵涉面多,如果不好好考虑和设计,将难以成功开发出这个游戏。

在这个游戏的设计中,将牵涉到图形界面的显示与更新,数据的收集与更新并且在这个游戏的开发中还会应用类的继承机制以及一些设计模式。

因此,如何设计和开发好这个俄罗斯方块游戏,对于提高Java开发水平和系统的设计能力有极大的帮助。

在设计开发过程中,开发者需要处理好各个类之间的集成关系,还要处理各个类的相应的封装,并且还要协调好各个模块之间的逻辑依赖关系和数据通信关系。

2、具体要求(包括技术要求等):系统的功能设计要求:本课程设计将实现以下几种功能。

1.游戏界面主框架游戏界面主框架主要包括游戏图形区域界面,游戏速度的选择更新界面,,游戏分数的显示更新界面,下一个图形方块的显示更新区域,开始游戏按钮,重新开始游戏按钮以及退出游戏按钮游戏界面主框架的主要结构如下图所示。

2.游戏图形区域界面的显示更新功能游戏图形区域界面主要是一个图形显示更新区域,主要包括游戏方块显示更新,整行方块的删除和更新,进行中和游戏结束时的分数更新和游戏图形区域界面的清除。

在这个游戏图形区域界面中,主要是一个表格,根据相应格子的设置标志来显示相应的图形图片,这样就实现了俄罗斯方块的实时显示。

3.游戏方块的设计在俄罗斯方块游戏中,具体的游戏方块图形的设计是比较重要的一个方面。

因为俄罗斯方块游戏中主要的动作就是控制游戏方块的移动和翻转,以便于组成一行行连续的方块从而增加游的分数。

由于主要的游戏动作都集中在这个游戏方块上,因此游戏方块的设计就显得格外重要了。

为了增加程序的可扩展性,这里设计一个游戏方块的基类,各个具体的游戏方块都从这个基类开始继承。

毕业论文JAVA俄罗斯方块游戏

毕业论文JAVA俄罗斯方块游戏

毕业论文JAVA俄罗斯方块游戏一、引言俄罗斯方块是一款经典的益智休闲游戏,自1984年问世以来深受大众喜爱。

游戏的玩法简单,画面优美,具有很强的趣味性和挑战性。

在本篇毕业论文中,我们将介绍一个用JAVA语言实现的俄罗斯方块游戏,并对该游戏的实现细节进行详细说明。

二、游戏概述俄罗斯方块是一款单机游戏,其游戏目标是控制四种不同形状的方块在游戏区域中拼出完整的一行。

随着游戏的进行,方块下落速度逐渐加快,难度也逐渐增加。

当方块堆积到达一定高度后,则为游戏失败。

在本游戏中,我们使用JAVA语言编写程序,并通过JAVA图形用户界面实现游戏画面的显示与交互。

通过键盘控制,玩家可以实现方块的移动、旋转、下落及直接掉落等操作。

具体实现中,游戏区域使用网格布局进行实现,并通过线程控制方块的下落速度。

游戏的得分以及游戏结束后的处理也进行了相应实现。

三、游戏实现以下为游戏实现中的重点内容:1. 创建游戏界面在JAVA中,可以使用Swing包中的JFrame和JPanel组件进行用户界面的创建。

在创建游戏界面时,我们使用了GridLayout布局管理器,并设置了10行、20列的网格布局,通过数组存储每个网格格子的状态,实现方块的下落和碰撞等操作。

2. 实现方块的生成与控制在游戏开始时,需要随机生成一个方块,并在游戏区域中显示。

在本游戏中,我们使用了一个Piece类来实现方块。

Piece类具有如下属性:- kind属性:用于表示方块的种类,包括I、J、L、O、S、T、Z共七种。

- color属性:用于表示方块的颜色。

- coordinates属性:用于表示方块的坐标,存储方块中心格子的行列值。

- relative坐标属性:用于表示方块中各个格子相对中心格子的坐标。

- clock和counterclock方法:用于实现方块的旋转操作。

对于每一个方块,都可以通过将其中心点的坐标加上相对坐标,计算出方块中各个格子的坐标。

方块的移动和旋转可以通过修改相对坐标来实现。

俄罗斯方块游戏的开发需求分析

俄罗斯方块游戏的开发需求分析

俄罗斯方块游戏的开发组长:XXX组员:XXX XXX XXX XXX05软件工程一班一、课程设计的目的和意义俄罗斯方块游戏是一个经典的小游戏,由于它简单有趣,因而得到了广泛的流行,男女老幼都适合。

而俄罗斯方块游戏的设计工作复杂且富有挑战性,它包含的内容多,涉及的知识广泛,与图形界面联系较大,包括界面的显示与更新、数据收集等,在设计的过程中,必将运用到各方面的知识,这对于visualbasi语言设计者而言,是个很好的锻炼机会。

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

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

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

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

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

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

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

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

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

三、系统功能设计分析俄罗斯方块游戏根据功能的不同,设置了如下12个类:Square,Command,GameArea,GameSetting,GameOver,Help,ImagePanel,JieMian,MyPanel, MyTimer,PlayMidi,WinListener,每个类的描述如下:1、Square,方块类。

这个类中定义了生成方块的方法,用二维数组int[][]pattern,存放7种方块的四种状态。

基于java的俄罗斯方块的设计与实现

基于java的俄罗斯方块的设计与实现

河北农业大学本科毕业论文题目:基于Java的俄罗斯方块的设计与实现摘要俄罗斯方块作为一款风靡全球的多样化终端游戏,经久不衰。

俄罗斯方块简单的基本游戏规则是旋转、移动,游戏自动随机输出7种形状的方块,经旋转后可形成28种形状,方块堆叠在一起,排列成完整的一行或多行消除得分,积分达到一定程度会自动提升级别。

该游戏上手简单、老少皆宜、家喻户晓。

本论文在详尽分析传统俄罗斯实现的基本原理、基本规则基础上,更深一步地研究俄罗斯方块的创新模式,在经典模式基础上开发出等级可变的模式,本文对以上功能给出了实现流程、详尽描述、和部分源代码。

程序是在Microsoft Windows 7系统下,以Java 为开发语言,在MyEclipse开发平台上进行游戏的设计与实现。

关键词:游戏;软件工程;MyEclipseAbstractTetris is a popular global diversification terminal game, enduring. The basic rules of the game Tetris simple is rotating, moving, the game automatically random output 7 shape box, the rotation can be formed after the 28 square shape, stacked together, arranged to complete one or more rows to eliminate the score, the integral to a certain extent will automatically upgrade the level of. The game started simple, suitable for all ages, make known to every family.In this paper a detailed analysis of the basic rules of traditional Russian basic principle, on the basis of the realization of innovation mode, further study of Tetris, developed a class variable model in the classical model, the above function gives the implementation process, detailed description, and part of the source code.This design is in the Microsoft Windows 7 system, taking Java as the development language, for game design and Implementation on MyEclipse platform.Keywords: Game; software engineering; MyEclipse目录1 绪论 (1)1.1 俄罗斯方块游戏的背景 (1)1.2俄罗斯方块游戏的规则 (1)1.3研究俄罗斯方块游戏的意义 (1)1.4 论文组织 (2)2 相关技术分析 (3)2.1 JAVA语言概述 (3)2.2 Eclipse简介 (4)3 需求分析 (6)3.1 系统需求 (6)3.2 接口控制 (6)4 系统设计 (7)4.1 软件运行和开发工具 (7)4.2 系统功能设计 (7)4.2.1 手工处理业务的基本流程 (7)4.2.2 基本流程的功能模块 (9)5 系统实现 (11)5.1 游戏主界面显示模块 (11)5.2 画布、方块显示模块 (12)5.2.1 背景画布模块设计 (12)5.2.2 预览方块模块设计 (14)5.2.3方块移动、旋转设计 (16)5.3 控制面板模块 (20)5.3.1菜单栏模块设计 (20)5.3.2控制面板按钮设计 (22)6 总结 (23)参考文献 (24)致谢 (25)1 绪论1.1 俄罗斯方块游戏的背景俄罗斯方块是俄罗斯人阿列克谢•帕基特诺夫(Alexey Pazhitnov)发明。

JAVA俄罗斯方块实验报告

JAVA俄罗斯方块实验报告

JAVA俄罗斯方块实验报告一、实验目的通过编写Java程序,实现俄罗斯方块游戏,掌握Java面向对象编程的基本思想和方法。

二、实验内容1.设计并编写俄罗斯方块游戏的主要功能,包括方块的移动、旋转、消除等。

2. 利用Java图形库,实现游戏界面的搭建和美化。

3. 运用Java的面向对象编程思想,对游戏的各个功能进行模块化设计和编码。

三、实验步骤1. 创建一个Java项目,设置所需的类和包,导入相关的库文件。

2.设计并编写方块类,包括方块的形状、位置、移动和旋转等方法。

3.设计并编写游戏区域类,包括绘制游戏界面、处理方块的移动和消除等方法。

4.设计并编写游戏控制类,包括监听键盘事件、控制方块的移动和旋转等方法。

5.综合测试各个类的功能,确保游戏的正常运行。

四、实验结果经过几个迭代的调试和改进,游戏的各个功能可以正常运行。

在游戏开始后,方块会从顶部下落,玩家可以通过键盘的上、下、左、右键来控制方块的移动,通过空格键来进行方块的旋转。

当方块底部与其他方块或游戏区域底部碰撞时,方块会固定在当前位置。

当一行方块都被填满时,该行方块会被消除,并得到相应的分数。

当游戏区域的顶部被方块填满时,游戏结束。

五、实验总结通过这次实验,我掌握了Java面向对象的编程方法和技巧,对Java的图形库有了更深入的了解和应用,提高了自己的编程能力。

俄罗斯方块游戏的实现过程中,我学习到了如何进行游戏逻辑的设计和处理,提高了自己的问题解决能力。

在今后的学习和实践中,我会继续不断地深入研究和探索Java编程的技术和应用,提高自己的编程水平。

六、参考资料1.《Java编程思想》2.《Java核心技术》。

软件工程课程设计选题

软件工程课程设计选题

软件工程课程设计选题第一篇:软件工程课程设计选题软件工程课程设计选题1、俄罗斯方块设计俄罗斯方块游戏程序,用户可以通过平移和转动自动落下的不同形状物体,填满一行来得分。

开发智力和反应能力。

要求(1)界面的左侧是游戏区域。

新的图形会在顶部刷新,并且自动下落,可以通过方向左右键平移和方向上键顺时针旋转来控制图形落下的位置。

(2)界面的右侧是选项和显示区,显示现在的得分,以及开始游戏、暂停游戏、结束游戏按钮。

2、商品销售统计编写商品销售统计程序,商品的信息有:商品的名称,计量单位(重量或件),单价。

所有商品的信息事先已存入计算机,屏幕上显示所有商品的名称,选择商品名,输入商品计量单位(如重量,件数等),根据单价算出总价。

客户一次购物可能购买多种商品,程序应计算出客户应付的钱款数。

要求(1)第一部分用于输入商品的信息并允许修改和删除;(2)第二部分实现销售统计。

程序运行时由用户选择进入哪一部分功能,并能在运行时在两部分之间切换。

第二部分运行时,首先显示所有商品名称及代码(商品数目较多时,应考虑分屏显示),用户输入商品代码及商品重量或件数,用户一次操作可输入若干商品的购买信息,然后输入一个特殊的代码表示本次购物结束。

此时。

程序计算出应付钱款数并显示。

3、校园卡管理系统针对校内通用的校园卡需要统一管理这一需求而推出。

通过这个程序,可以较为方便地实现用户的登陆以及个人信息的查询更改等服务,同时管理员将以特定的帐号登陆,实现对所有用户信息及账户信息的管理。

要求(1)以用户身份登陆可查询个人信息,并对相关信息作出修改,提交后新信息将写入数据库,取代原有信息。

可查询个人的帐户信息,包括帐户余额、今日消费、末次充值情况等。

可实现网上充值,通过与银行卡的连接,只要用户输入正确密码,即可从银行卡往校园卡转帐,同时帐户信息中末次充值情况将自动更新。

可修改个人的登陆信息,对登陆密码作出修改。

(2)以管理员身份登陆,可查阅所有用户的信息,以及他们对应的帐户信息。

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

课程实验报告课程名称:软件工程计算机科学与技术学院目录软件名称:俄罗斯方块1.软件定义. . . . . . . . . . . . . . . . . . . . . . . . . . . . .3a)问题定义. . . . . . . . . . . . . . . . . . . . . . . . . . .3b)可行性研究. . . . . . . . . . . . . . . . . . . . . . . . . .3c)需求分析. . . . . . . . . . . . . . . . . . . . . . . . . . .4i.设计棋盘 . . . . . . . . . . . . . . . . . . . . . . . . .5ii.设计棋子 . . . . . . . . . . . . . . . . . . . . . . . . .6 iii.按键功能设置(上下左右). . . . . . . . . . . . . . . . . . . .7 iv.棋子落下的动画实现以及越界检测. . . . . . . . . . . . . . . .9 v.More functions . . . . . . . . . . . . . . . . . . . . . .11 2.俄罗斯方块的DFD图 . . . . . . . . . . . . . . . . . . . . . . .12 3.需求分析建模–数据字典. . . . . . . . . . . . . . . . . . . . . .13 4.代码. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14俄罗斯方块1.编译环境Codeblocks编译器用C语言在window8下2.软件定义a)问题定义额,俄罗斯方块不用定义了吧。

相信大家都知道。

俄罗斯方块(Tetris, 俄文:Тетрис)是一款风靡全球的电视游戏机和掌上游戏机游戏,它由俄罗斯人阿列克谢·帕基特诺夫发明,故得此名。

俄罗斯方块的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。

由于上手简单、老少皆宜,从而家喻户晓,风靡世界。

2014年2月22日,英国心理学家发现,减肥者通过玩俄罗斯方块,可以降低对富含脂肪的食物和零食的心理需求;尝试戒烟者的烟瘾也能得到遏制。

b)可行性研究俄罗斯方块是曾经风靡全球的一款游戏。

如今看来,虽然与其他手游相比,编码简单,但对于现阶段的我们,还是有一定的难度,因而做出俄罗斯方块的代码,是一个很能锻炼自我的任务,因此我选择了写俄罗斯方块。

通过大一对C语言和这学期数据结构的学习,已经基本掌握了俄罗斯方块编程的需要,因此是可行的。

c)需求分析•设计棋盘•设计棋子•按键功能设置(上下左右)•棋子落下的动画实现以及越界检测软件设计1.设计棋盘设计出棋盘的高和宽:#define CHESS_WIDTH 12*2#define CHESS_HIGHT 1出来的效果应该是这样的:2.设计棋子用一个二维数组表示棋子:x,y (4,1)char a[4][4]a[0][0]=1,a[0][1]=1,a[1][0],a[1][1]=1;出来的效果:3.按键功能设置(上下左右,暂停)按键功能分别由下面几个函数实现:void ClearChess(chess_data chess) 清屏void MoveDown(chess_data* Chess) 下移void MoveLeft(chess_data* Chess) 左移void MoveRight(chess_data* Chess) 右移然后这儿呢,会出现一个bug,即出现越界现象,所以需要写函数来判断是否越界。

4.棋子落下的动画实现以及越界检测越界检测:int CheckLeftBorder(chess_data Chess)检查左右边界int CheckDownBorder(chess_data Chess)检查下边界5.More functions•游戏难度控制•添加声音效果•还未研发出来….俄罗斯方块的DFD图第0层:第1层:需求分析建模–数据字典数据流名:玩家可用键说明:玩家在玩游戏是可以用到的键数据流来源:玩家数据流去向:系统处理数据流组成:Y/N + 上下左右数据元素词条Y/N= “Y”“N”上下左右= “↑”“↓”“←”“→”程序代码#include <stdio.h>#include <stdlib.h>#include <string.h>#include <ctype.h>#include <stdarg.h>#include <time.h>#include "hello.h"#include <share.h>#include <Windows.h>#include "gameproc.h"//#define var 333;//移动光标位置void gotoxy(int x,int y){COORD xy;HANDLE hstdout;hstdout=GetStdHandle(STD_OUTPUT_HANDLE);xy.X=x;xy.Y=y;SetConsoleCursorPosition(hstdout,xy);//CloseHandle(hstdout);}void fillchar(char a,int charlen){COORD xy={0};HANDLE hstdout;long byw;hstdout=GetStdHandle(STD_OUTPUT_HANDLE);FillConsoleOutputCharacter(hstdout,a,charlen,xy,&byw);CloseHandle(hstdout); }#define X 20#define Y 6//绘制边框void drawM(void){int i;//上边gotoxy(X,Y);prt("┏");for (i=1;i<=13;i++){prt("━");}prt("┓");//左边for (i=1;i<=16;i++){gotoxy(X,Y+i);prt("┃");}//右边for (i=1;i<=16;i++){gotoxy(X+28,Y+i);prt("┃");}//下边gotoxy(X,Y+17);prt("┗");for (i=1;i<=13;i++){prt("━");}prt("┛");return ;}//drawmenuvoid drawmenu(void){gotoxy(X+3,Y+3);prt("1->菜单选项一");gotoxy(X+3,Y+3+2);prt(" 菜单选项二");gotoxy(X+3,Y+3+2+2);prt(" 退出");gotoxy(0,0);}int selmenu_Num=0;int selmenu(void){ //0,1,2//如果按下↓selmenu_Num++; 如果>2 selmenu_Num=0; //如果按下↑selmenu_Num--; 如果<0 selmenu_Num=2;int ch=0;while(1){ch=getch();//gotoxy(0,0);//prt("%d ",ch);if (ch==13){return selmenu_Num;}switch(ch){case 72://上光标selmenu_Num--;if (selmenu_Num<0){selmenu_Num=2;}break;case 80: //下光标selmenu_Num++;if (selmenu_Num>2){selmenu_Num=0;}break;}gotoxy(0,0);// prt("selmenu_num=%d",selmenu_Num);//动态菜单switch(selmenu_Num){case 0:gotoxy(X+3,Y+3);prt("1->");gotoxy(X+3,Y+3+2);prt(" ");gotoxy(X+3,Y+3+2+2);prt(" ");gotoxy(0,0);break;case 1:gotoxy(X+3,Y+3);prt(" ");gotoxy(X+3,Y+3+2);prt("2->");gotoxy(X+3,Y+3+2+2);prt(" ");gotoxy(0,0);break;case 2:gotoxy(X+3,Y+3);prt(" ");gotoxy(X+3,Y+3+2);prt(" ");gotoxy(X+3,Y+3+2+2);prt("3->");gotoxy(0,0);break;}} //end whilereturn selmenu_Num;}//doMenuvoid doMenu(void){ int sel;sel= selmenu();switch(sel){case 0: //菜单一gotoxy(0,0);prt("\n菜单一功能\n");break;case 1:gotoxy(0,0);prt("\n菜单二功能\n");break;case 2: //退出exit(1);break;}}DWORD WINAPI ThreadProc1(LPVOID lpParameter // 接收CreateThread的第4个参数){ int i=0;while(1)//添加线程代码{ i++;EnterCriticalSection(&cs);gotoxy(0,1);printf("OKOK i=%d",i);//下移一格棋子if (CheckDownBorder(oneChess)||CheckDownChess(oneChess)){Add1Chess(oneChess);ShowChessBoard();//重新赋值OneChess进行新的一轮棋子掉落//随机初始化rx=rand()%5;ry=0;oneChess=DownChessData[rx][ry];oneChess.rx=rx;oneChess.ry=ry;ShowChess(oneChess);} else{MoveDown(&oneChess);}LeaveCriticalSection(&cs);Sleep(speed);}return 1;}DWORD WINAPI ThreadProc2(LPVOID lpParameter // 接收CreateThread 的第4个参数){while(1)//添加线程代码{//随机初始化rx=rand()%2;ry=rand()%4;Sleep(100);}return 1;}int main(void){//Y行X列// fillchar(' ',3000);InitializeCriticalSection(&cs);InitializeCriticalSection(&cs_puts);system("color 0a");system("title QQ150330575");/* drawM();drawmenu();doMenu();*/SetWindowPos(HWND_BOTTOM,HWND_NOTOPMOST,133,100, 800,600,SWP_SHOWWINDOW);DrawChessMap();//开始游戏th1=CreateThread(NULL,0,ThreadProc1,NULL,0,NULL); //创建线程//CreateThread(NULL,0,ThreadProc2,NULL,0,NULL); //创建线程playgame();getch();prt("22222222222");getch();return 0;}//宏定义#define CHESS_X 28#define CHESS_Y 8#define CHESS_WIDTH 12*2#define CHESS_HIGHT 18char ChessBoard[12][18]={0}; //12*18的二维数组表示棋盘数据有黑格子的地方置1 其它地方置0unsigned int rx,ry;extern void gotoxy(int,int);int PointNum=0;int speed=1000;HANDLE th1;//线程1句柄void ShowChessBoard() ;typedef struct _chess_data{char rx;//5种类型0..4char ry;////4种形态0..3char data[4][4]; //数据COORD xy;//位置POINT}chess_data;chess_data oneChess;CRITICAL_SECTION cs;CRITICAL_SECTION cs_puts;void prt(char* s){ //进入临界区EnterCriticalSection(&cs_puts);puts(s);LeaveCriticalSection(&cs_puts);//离开临界区}//画棋盘void DrawChessMap(void){int i;//U型//左边for (i=0;i<CHESS_HIGHT;i++){gotoxy(CHESS_X,CHESS_Y+i);prt("┃");}//右边for (i=0;i<CHESS_HIGHT;i++){gotoxy(CHESS_X+CHESS_WIDTH,CHESS_Y+i);prt("┃");}//底部转角gotoxy(CHESS_X,CHESS_Y+CHESS_HIGHT);prt("┗");gotoxy(CHESS_X+CHESS_WIDTH,CHESS_Y+CHESS_HIGHT);prt("┛");//底部横线for (i=1;i<CHESS_WIDTH/2;i++){gotoxy(CHESS_X+i*2,CHESS_Y+CHESS_HIGHT);prt("━");}return ;}//20种不成形态的棋子chess_data DownChessData[5][4]={0};void InitChessData(void){//□□//□□类型0 状态0DownChessData[0][0].xy.X=CHESS_X+4;DownChessData[0][0].xy.Y=CHESS_Y+0;DownChessData[0][0].data[0][0]=1;DownChessData[0][0].data[1][0]=1;DownChessData[0][0].data[0][1]=1;DownChessData[0][0].data[1][1]=1;//状态1-3 =状态0DownChessData[0][1]=DownChessData[0][2]=DownChessData[0][3]=DownChessData[0][0];//□□□// □类型1 状态0DownChessData[1][0].xy.X=CHESS_X+4;DownChessData[1][0].xy.Y=CHESS_Y+0;DownChessData[1][0].data[0][0]=1;DownChessData[1][0].data[1][0]=1;DownChessData[1][0].data[2][0]=1;DownChessData[1][0].data[1][1]=1;// □//□□// □类型1 状态1DownChessData[1][1].xy.X=CHESS_X+4;DownChessData[1][1].xy.Y=CHESS_Y+0;DownChessData[1][1].data[1][0]=1;DownChessData[1][1].data[1][1]=1;DownChessData[1][1].data[1][2]=1;DownChessData[1][1].data[0][1]=1;// □类型1 状态2//□□□DownChessData[1][2].xy.X=CHESS_X+4;DownChessData[1][2].xy.Y=CHESS_Y+0;DownChessData[1][2].data[1][0]=1;DownChessData[1][2].data[0][1]=1;DownChessData[1][2].data[1][1]=1;DownChessData[1][2].data[2][1]=1;//□类型1 状态3//□□//□DownChessData[1][3].xy.X=CHESS_X+4;DownChessData[1][3].xy.Y=CHESS_Y+0;DownChessData[1][3].data[0][0]=1;DownChessData[1][3].data[0][2]=1; DownChessData[1][3].data[1][1]=1;//□//□//□//□DownChessData[2][0].xy.X=CHESS_X+4; DownChessData[2][0].xy.Y=CHESS_Y+0; DownChessData[2][0].data[1][0]=1; DownChessData[2][0].data[1][1]=1; DownChessData[2][0].data[1][2]=1; DownChessData[2][0].data[1][3]=1;DownChessData[2][2]= DownChessData[2][0];//□□□□DownChessData[2][3].xy.X=CHESS_X+4; DownChessData[2][3].xy.Y=CHESS_Y+0; DownChessData[2][3].data[1][2]=1; DownChessData[2][3].data[2][2]=1; DownChessData[2][3].data[3][2]=1; DownChessData[2][3].data[0][2]=1;DownChessData[2][1]= DownChessData[2][3];//□□// □□DownChessData[3][0].xy.X=CHESS_X+4; DownChessData[3][0].xy.Y=CHESS_Y+0; DownChessData[3][0].data[0][1]=1;DownChessData[3][0].data[1][2]=1; DownChessData[3][0].data[1][3]=1;DownChessData[3][2]= DownChessData[3][0];//□//□□// □DownChessData[3][1].xy.X=CHESS_X+4; DownChessData[3][1].xy.Y=CHESS_Y+0; DownChessData[3][1].data[0][0]=1; DownChessData[3][1].data[1][0]=1; DownChessData[3][1].data[1][1]=1; DownChessData[3][1].data[2][1]=1;DownChessData[3][3]= DownChessData[3][1];// □// □// □□DownChessData[4][0].xy.X=CHESS_X+4; DownChessData[4][0].xy.Y=CHESS_Y+0; DownChessData[4][0].data[1][0]=1; DownChessData[4][0].data[1][1]=1; DownChessData[4][0].data[1][2]=1; DownChessData[4][0].data[2][2]=1;// □□□// □DownChessData[4][1].xy.X=CHESS_X+4; DownChessData[4][1].xy.Y=CHESS_Y+0;DownChessData[4][1].data[1][2]=1;DownChessData[4][1].data[2][2]=1;DownChessData[4][1].data[0][3]=1;//□□// □// □DownChessData[4][2].xy.X=CHESS_X+4;DownChessData[4][2].xy.Y=CHESS_Y+0;DownChessData[4][2].data[0][0]=1;DownChessData[4][2].data[1][0]=1;DownChessData[4][2].data[1][1]=1;DownChessData[4][2].data[1][2]=1;// □// □□□DownChessData[4][3].xy.X=CHESS_X+4;DownChessData[4][3].xy.Y=CHESS_Y+0;DownChessData[4][3].data[3][1]=1;DownChessData[4][3].data[1][2]=1;DownChessData[4][3].data[2][2]=1;DownChessData[4][3].data[3][2]=1;}//显示某个下落的棋子void ShowChess(chess_data chess){int x,y;for (x=0;x<=3;x++){for(y=0;y<=3;y++)if (chess.data[x][y]){gotoxy(chess.xy.X+x*2,chess.xy.Y+y);prt("□");}}}//隐藏棋子void ClearChess(chess_data chess){int x,y;for (x=0;x<=3;x++){for(y=0;y<=3;y++)if (chess.data[x][y]) //{gotoxy(chess.xy.X+x*2,chess.xy.Y+y);prt(" ");}}}void MoveUp(chess_data* Chess){chess_data bakChess;//隐藏ClearChess(*Chess);//ry+1Chess->ry++; //1,2,3,4,5Chess->ry%=4;//0..3//databakChess=DownChessData[Chess->rx][Chess->ry];bakChess.xy=Chess->xy;bakChess.rx=Chess->rx;bakChess.ry=Chess->ry;//*Chess=bakChess;ShowChess(*Chess);}void MoveDown(chess_data* Chess){//隐藏ClearChess(*Chess);Chess->xy.Y+=1;ShowChess(*Chess);}void MoveLeft(chess_data* Chess){//隐藏ClearChess(*Chess);Chess->xy.X-=2;ShowChess(*Chess);}void MoveRight(chess_data* Chess){//隐藏ClearChess(*Chess);Chess->xy.X+=2;ShowChess(*Chess);}//检测左边界是否到达,到达则返回1 否则返回0int CheckLeftBorder(chess_data Chess){int x,y;for (x=0;x<=3;x++)for (y=0;y<=3;y++){if (Chess.data[x][y]){if (Chess.xy.X+x*2<=CHESS_X+2){return 1;}}}return 0;}//检测左边界是否到达,到达则返回1 否则返回0int CheckRightBorder(chess_data Chess){int x,y;for (x=3;x>=0;x--)for (y=3;y>=0;y--){if (Chess.data[x][y]){if (Chess.xy.X+x*2>=CHESS_X+CHESS_WIDTH-2)//左边界│占2字符宽度+右边界│占的2个字符宽度所以得减4{return 1;}}}return 0;}//检测下边界int CheckDownBorder(chess_data Chess){int x,y;for (y=0;y<=3;y++)for (x=0;x<=3;x++){if (Chess.data[x][y]){if (Chess.xy.Y+y+1>=CHESS_Y+CHESS_HIGHT){return 1;}}}return 0;}//检测下方向是否有棋子存在int CheckDownChess(chess_data Chess){int x,y;for (y=0;y<=3;y++)for (x=0;x<=3;x++){if (Chess.data[x][y]){if (ChessBoard[(Chess.xy.X-CHESS_X)/2+x][Chess.xy.Y-CHESS_Y+y+1]) //12*18{return 1;}}}return 0;}//假设向左移一格,是否会产生碰撞,如果有,则返回1 否则返回0 int CheckLeftChess(chess_data Chess){int x,y;for (y=0;y<=3;y++)for (x=0;x<=3;x++){if (Chess.data[x][y]){if (ChessBoard[(Chess.xy.X-CHESS_X)/2+x-1][Chess.xy.Y-CHESS_Y+y]) //12*18{return 1;}}}return 0;}//假设向右移一格,是否会产生碰撞,如果有,则返回1 否则返回0 int CheckRightChess(chess_data Chess){int x,y;for (y=0;y<=3;y++)for (x=0;x<=3;x++){if (Chess.data[x][y]){if (ChessBoard[(Chess.xy.X-CHESS_X)/2+x+1][Chess.xy.Y-CHESS_Y+y]) //12*18{return 1;}}return 0;}//旋转冲突检测int CheckSpinBorder(chess_data chess){ int x,y,ty;chess_data NextChess;//取得旋转后的棋子数据NextChess=chess;//xy,rx,ry//取得旋转后棋子数据data//NextChess.data=DownChessData[chess.rx][chess.ry].data;if (chess.ry==3){ty=0;}else{ty=chess.ry+1;}memcpy(NextChess.data,DownChessData[chess.rx][ty].data,4*4*size of(char));//检测边界冲突for (x=0;x<=3;x++)for (y=0;y<=3;y++){if (NextChess.data[x][y]){if (NextChess.xy.X+x<=CHESS_X+2){return 1;}if (NextChess.xy.X+x>=CHESS_X+CHESS_WIDTH-4)//左边界│占2字符宽度+右边界│占的2个字符宽度所以得减4{return 1;}//if (NextChess.xy.Y+y+1>=CHESS_Y+CHESS_HIGHT){return 1;}//检测与棋盘数据的冲突if (ChessBoard[(NextChess.xy.X-CHESS_X)/2+x][NextChess.xy.Y-CHESS_Y+y]) //12*18{return 1;}}}return 0;}//检测ChessBoard 里边是否有一行是全1 是返回这一行的下标,否则返回-1int CheckRowAllOne(){int x,y;int num=0;for ( y=17;y>=0;y--){num=0; //归零初始化for (x=0;x<=11;x++) //行是否全1{if (ChessBoard[x][y]){num++;}}if (num>=11){return y;}}return -1;}//ClearRowint ClearRow(int rowY){ int x,y;for (x=1;x<=11;x++) //行是否全1{ChessBoard[x][rowY]=0;gotoxy(CHESS_X+x*2,CHESS_Y+rowY);prt(" ");}//下移所有的行for (y=rowY;y>=1;y--){for (x=1;x<11;x++){gotoxy(CHESS_X+x*2,CHESS_Y+y-1);prt(" ");ChessBoard[x][y]=ChessBoard[x][y-1];}for (x=1;x<12;x++){for (y=0;y<18;y++)gotoxy(CHESS_X+x*2,CHESS_Y+y);if (ChessBoard[x][y]){prt("■");}else prt(" ");}}//添加棋子数据到棋盘void Add1Chess(chess_data Chess){int x,y;int rowY;int rowNum=0;for (x=0;x<4;x++)for (y=0;y<4;y++){if (Chess.data[x][y]){//ChessBoardChessBoard[(Chess.xy.X-CHESS_X)/2+x][Chess.xy.Y-CHESS_Y+y]=1;}}//更新数据后检测for (y=0;y<4;y++){if ((rowY=CheckRowAllOne())>=0){//消掉这一行ClearRow(rowY);rowNum++;//记算这一局得分情况}}//switch (rowNum){case 1:PointNum+=10;gotoxy(CHESS_X+CHESS_WIDTH+3,CHESS_Y+5);printf("当前得分=%8d",PointNum);break;case 2:PointNum+=30;gotoxy(CHESS_X+CHESS_WIDTH+3,CHESS_Y+5);printf("当前得分=%8d",PointNum);case 3:PointNum+=60;gotoxy(CHESS_X+CHESS_WIDTH+3,CHESS_Y+5);printf("当前得分=%8d",PointNum);case 4:PointNum+=100;gotoxy(CHESS_X+CHESS_WIDTH+3,CHESS_Y+5);printf("当前得分=%8d",PointNum);break;}}//以■方块显示棋盘数据void ShowChessBoard() //显示ChessBoard里的1 {int x,y;for (x=0;x<12;x++)for (y=0;y<18;y++){if (ChessBoard[x][y]){gotoxy(CHESS_X+x*2,CHESS_Y+y);prt("■");}}}void showallchess(void){int x,y;for (x=0;x<5;x++){for (y=0;y<4;y++) //0..3{ShowChess (DownChessData[x][y]);gotoxy(0,0);printf("%d,%d",x,y);getch();getch();ClearChess(DownChessData[x][y]);}}}void pauseGame(){static int pause=0;if (pause){gotoxy(CHESS_X+CHESS_WIDTH+3,CHESS_Y+5+2);printf("按Q键--暂停");ResumeThread(th1);pause=0;} else{gotoxy(CHESS_X+CHESS_WIDTH+3,CHESS_Y+5+2);printf("按Q键--继续");SuspendThread(th1); //线程挂起后,线程代码就暂停执行pause=1;}}//开始游戏void playgame(void){int ch=0;//srand( (unsigned)time( NULL ) );//初始化数据EnterCriticalSection(&cs);gotoxy(CHESS_X+CHESS_WIDTH+3,CHESS_Y+5);printf("当前得分=%8d",PointNum);gotoxy(CHESS_X+CHESS_WIDTH+3,CHESS_Y+5+2);printf("按Q键--暂停");gotoxy(CHESS_X+CHESS_WIDTH+3,CHESS_Y+5+2+2); printf("难度调节+,-号",3000-speed);gotoxy(CHESS_X+CHESS_WIDTH+3,CHESS_Y+5+2+2+2); printf("难度:%6d",3000-speed);InitChessData();//showallchess();//随机初始化rx=rand()%5;ry=0;oneChess=DownChessData[rx][ry];oneChess.rx=rx;oneChess.ry=ry;ShowChess(oneChess);LeaveCriticalSection(&cs);//while(1){ch=getch();EnterCriticalSection(&cs);gotoxy(0,0);printf("%d ",ch);// 如果是下光标控制↓则下移//80//如果是左光标控制←则左移//75//如果是右光标控制→则右移//77 switch(ch){case 61://+ 大键盘speed-=100;if (speed<100){speed=100;}gotoxy(CHESS_X+CHESS_WIDTH+3,CHESS_Y+5+2+2+2);printf("难度:%6d",3000-speed);break;case 43: //+ 数字键盘speed-=100;if (speed<100){speed=100;}gotoxy(CHESS_X+CHESS_WIDTH+3,CHESS_Y+5+2+2+2);printf("难度:%6d",3000-speed);break;case 45://-号speed+=100;if (speed>2900){speed=2900;}gotoxy(CHESS_X+CHESS_WIDTH+3,CHESS_Y+5+2+2+2);printf("难度:%6d",3000-speed);break;case 113: //q//如果线程在运行,就挂起它,如果暂停,我们恢复运行pauseGame();break;case 81: //QpauseGame();break;//上光标键case 72://MoveUpif (CheckSpinBorder(oneChess)){break;}MoveUp(&oneChess);break;//下case 80: //if(CheckDownBorder(oneChess)||CheckDownChess(oneChess)) {//更新数据Add1Chess(oneChess);ShowChessBoard();//重新赋值OneChess进行新的一轮棋子掉落//随机初始化rx=rand()%5;ry=0;oneChess=DownChessData[rx][ry];oneChess.rx=rx;oneChess.ry=ry;ShowChess(oneChess);} else{MoveDown(&oneChess);}break;//左case 75:if (CheckLeftBorder(oneChess)||CheckLeftChess(oneChess)){break;}MoveLeft(&oneChess);break;//右case 77:if (CheckRightBorder(oneChess)){ break;}if (CheckRightChess(oneChess)){break;//不移动,直接下一次循环//continue;}MoveRight(&oneChess);break;} //end switchLeaveCriticalSection(&cs);}//end while}#include <stdio.h>#include <stdlib.h>#include <string.h>#include <ctype.h>#include <stdarg.h>#include <time.h>#include "hello.h"#include <share.h>#include <Windows.h>#include "gameproc.h"//#define var 333;//移动光标位置void gotoxy(int x,int y){COORD xy;HANDLE hstdout;hstdout=GetStdHandle(STD_OUTPUT_HANDLE);xy.X=x;xy.Y=y;SetConsoleCursorPosition(hstdout,xy);//CloseHandle(hstdout);}void fillchar(char a,int charlen){COORD xy={0};HANDLE hstdout;long byw;hstdout=GetStdHandle(STD_OUTPUT_HANDLE);FillConsoleOutputCharacter(hstdout,a,charlen,xy,&byw);CloseHandle(hstdout);}#define X 20#define Y 6//绘制边框void drawM(void){int i;//上边gotoxy(X,Y);prt("┏");for (i=1;i<=13;i++){prt("━");}prt("┓");//左边for (i=1;i<=16;i++){gotoxy(X,Y+i);prt("┃");}//右边for (i=1;i<=16;i++){gotoxy(X+28,Y+i);prt("┃");}//下边gotoxy(X,Y+17);prt("┗");for (i=1;i<=13;i++){prt("━");}prt("┛");return ;}//drawmenuvoid drawmenu(void) {gotoxy(X+3,Y+3);prt("1->菜单选项一");gotoxy(X+3,Y+3+2);prt(" 菜单选项二");gotoxy(X+3,Y+3+2+2);prt(" 退出");gotoxy(0,0);}int selmenu_Num=0;int selmenu(void){ //0,1,2//如果按下↓selmenu_Num++; 如果>2 selmenu_Num=0; //如果按下↑selmenu_Num--; 如果<0 selmenu_Num=2;int ch=0;while(1){ch=getch();//gotoxy(0,0);//prt("%d ",ch);if (ch==13){return selmenu_Num;}switch(ch){case 72://上光标selmenu_Num--;if (selmenu_Num<0){selmenu_Num=2;}break;case 80: //下光标selmenu_Num++;if (selmenu_Num>2){selmenu_Num=0;}break;}gotoxy(0,0);// prt("selmenu_num=%d",selmenu_Num);//动态菜单switch(selmenu_Num){case 0:gotoxy(X+3,Y+3);prt("1->");gotoxy(X+3,Y+3+2);prt(" ");gotoxy(X+3,Y+3+2+2);prt(" ");gotoxy(0,0);break;case 1:gotoxy(X+3,Y+3);prt(" ");gotoxy(X+3,Y+3+2);prt("2->");gotoxy(X+3,Y+3+2+2);prt(" ");gotoxy(0,0);break;case 2:gotoxy(X+3,Y+3);prt(" ");gotoxy(X+3,Y+3+2);prt(" ");gotoxy(X+3,Y+3+2+2);prt("3->");gotoxy(0,0);break;}} //end whilereturn selmenu_Num;}//doMenuvoid doMenu(void){ int sel;sel= selmenu();switch(sel){case 0: //菜单一gotoxy(0,0);prt("\n菜单一功能\n");break;case 1:gotoxy(0,0);prt("\n菜单二功能\n");break;case 2: //退出exit(1);break;}}DWORD WINAPI ThreadProc1(LPVOID lpParameter // 接收CreateThread的第4个参数){ int i=0;while(1)//添加线程代码{ i++;EnterCriticalSection(&cs);gotoxy(0,1);printf("OKOK i=%d",i);//下移一格棋子if (CheckDownBorder(oneChess)||CheckDownChess(oneChess)) {Add1Chess(oneChess);ShowChessBoard();//重新赋值OneChess进行新的一轮棋子掉落//随机初始化rx=rand()%5;ry=0;oneChess=DownChessData[rx][ry];oneChess.rx=rx;oneChess.ry=ry;ShowChess(oneChess);} else{MoveDown(&oneChess);}LeaveCriticalSection(&cs);Sleep(speed);}return 1;}DWORD WINAPI ThreadProc2(LPVOID lpParameter // 接收CreateThread 的第4个参数){while(1)//添加线程代码{//随机初始化rx=rand()%2;ry=rand()%4;Sleep(100);}return 1;}int main(void){//Y行X列// fillchar(' ',3000);InitializeCriticalSection(&cs);InitializeCriticalSection(&cs_puts);system("color 0a");system("title QQ150330575");/* drawM();drawmenu();doMenu();*/SetWindowPos(GetConsoleWindow(),HWND_NOTOPMOST,133,1 00,800,600,SWP_SHOWWINDOW);DrawChessMap();//开始游戏th1=CreateThread(NULL,0,ThreadProc1,NULL,0,NULL); //创建线程//CreateThread(NULL,0,ThreadProc2,NULL,0,NULL); //创建线程playgame();getch();。

相关文档
最新文档