课程设计报告-俄罗斯方块-嵌入式-qt

合集下载

俄罗斯方块实验报告

俄罗斯方块实验报告

邮电大学通达学院算法与数据结构设计报告(2016/ 2017学年第二学期)专业软件工程嵌入式学号姓名学号姓名学号姓名指导教师指导单位计算机学院计算机科学与技术系日期2017-5-26目录课题容---------------------------------------1算法设计与分析---------------------------------1 算法实现---------------------------------------9测试数据及结果分析----------------------------38 调试过程中的问题------------------------------40 总结------------------------------------------41俄罗斯方块一、课题容实现俄罗斯方块游戏。

主要功能为游戏界面显示、上下左右键响应以及当前得分统计。

通过该课题全面熟悉数组、字符串等的使用。

掌握设计的基本方法及友好界面的设计。

课题要求:1、游戏界面显示:下落方块和方块堆、左右移动、旋转、删除行等特效以及得分。

2、动作选择:上下左右键对应于旋转、加速、左右移动的功能。

3、得分统计判断:判定能否消除行、并统计得分总数等。

扩展要求:1、用户数据管理。

2、游戏玩法:由小方块组成的不同形状的板块陆续从屏幕上方落下来,玩家通过调整板块的位置和方向,使它们在屏幕底部拼出完整的一条或几条。

这些完整的横条会随即消失,给新落下来的板块腾出空间,与此同时,玩家得到分数奖励。

没有被消除掉的方块不断堆积起来,一旦堆到屏幕顶端,玩家便告输,游戏结束。

基本规则1、一个用于摆放小型正方形的平面虚拟场地,其标准大小:行宽为10,列高为20,以每个小正方形为单位。

2、一组由4个小型正方形组成的规则图形,英文称为Tetromino,中文通称为方块共有7种,分别以S、Z、L、J、I、O、T这7个字母的形状来命名。

嵌入式实验报告_俄罗斯方块实验报告

嵌入式实验报告_俄罗斯方块实验报告

嵌⼊式实验报告_俄罗斯⽅块实验报告俄罗斯⽅块实验报告班级电⼦班学号******* 姓名**实验名称俄罗斯⽅块⼀、设计⽬标和要求:1、实现多个模块的驱动:液晶、按键、定时器等。

综合多个模块的协调运⾏。

2、设计游戏运⾏的⾏为仲裁引擎,合理设计前景和背景的相对关系。

3、通过ucos2操作系统,合理实现多任务的协调运⾏。

4、完成考核要求:①在液晶上画出欢迎界⾯。

②开启定时器,定时刷新页⾯。

③俄罗斯⽅块满⾏时消⾏,并计数。

④当⽅块叠加到页⾯顶时,结束游戏。

⼆、实验环境:硬件:PC机、嵌⼊式系统实验箱,串⼝线。

软件: windows,编译器三、设计思路和实现步骤、内容:1、设计思路:俄罗斯⽅块游戏软件基于ARM的Windowns CE平台进⾏写操作,利⽤PXA270RP实验箱模拟仿真器,利⽤evc编程来具体实现,在实验箱的触摸屏上进⾏游戏。

⾸先对俄罗斯⽅块的设计和功能需求进⾏详细的了解和分析,如下图1是俄罗斯⽅块总体设计功能图。

开始结束设计消⾏设计转换设计俄罗斯⽅块游戏设计游戏计积分等级设计系统帮助说明操作设计界⾯分布设计⽅块设计游戏帮助系统说明图1 俄罗斯⽅块总体设计功能图(1)游戏界⾯设计:分别是游戏显⽰界⾯,下⼀个⽅块下落界⾯,积分和等级记录界⾯,开始结束暂停按钮,⽅块形态位置变化操作按钮。

(2)操作设计:①游戏开始结束暂停操作设计:在游戏界⾯上有开始、结束、暂停按钮,⽤⿏标操作,选择是否要进⼊游戏。

②⽅块形状转换操作:良好的⽅块形状设计,绘制七种常见的基本图形(长条形、Z字形、反Z形、⽥字形、7字形、反7形、T 字型),各个⽅块要能实现它的变形,统⼀设为逆时针变形。

如下图2所⽰为俄罗斯⽅块定位点设置表。

当⽅块下落时,可通过键盘⽅向键(上、下、左、右键)对该⽅块进⾏向上(变形),向下(加速)、向左、向右移动。

俄罗斯⽅块定位点设置,以⿊⾊点为(0,0)坐标状态类型 1 2 3 44567图2 俄罗斯⽅块⽅块形状图③消⾏操作设计:当⽅块落到游戏界⾯最底部并且铺满最后⼀⾏,就能消去所在这⼀⾏,积分增加100分,⽽积分增加到⼀定数值时,玩家等级增加。

qt俄罗斯方块课程设计

qt俄罗斯方块课程设计

qt俄罗斯方块课程设计一、课程目标知识目标:1. 学生能理解qt俄罗斯方块游戏的基本原理和编程逻辑。

2. 学生掌握qt图形用户界面设计的基本方法,并能运用到方块游戏中。

3. 学生了解坐标系在游戏编程中的应用,并能够运用坐标进行方块移动和布局。

技能目标:1. 学生通过实践操作,学会使用qt进行游戏编程,具备独立编写简单俄罗斯方块游戏的能力。

2. 学生能够运用所学的编程知识,解决游戏开发过程中遇到的问题。

3. 学生培养逻辑思维和问题解决能力,通过团队合作,共同优化游戏设计。

情感态度价值观目标:1. 学生对计算机编程产生兴趣,培养主动探究和自主学习的精神。

2. 学生在游戏编程过程中,体会团队合作的重要性,学会与他人沟通协作。

3. 学生通过游戏设计,认识到编程与生活的紧密联系,增强创新意识和实践能力。

课程性质分析:本课程为信息技术课程,旨在通过qt俄罗斯方块游戏的实践操作,使学生掌握编程知识和技能,培养其逻辑思维和问题解决能力。

学生特点分析:五年级学生对计算机有一定的操作基础,对游戏有浓厚兴趣,但编程知识有限,需要通过具体案例和实践活动,激发学习兴趣,逐步提高编程能力。

教学要求:1. 结合学生特点,采用任务驱动法,引导学生主动参与学习,提高实践操作能力。

2. 注重团队合作,培养学生的沟通协作能力。

3. 教师应及时关注学生个体差异,给予针对性指导,确保每个学生都能达到课程目标。

二、教学内容1. qt基本概念与安装:介绍qt框架的概念、特点及应用领域,指导学生安装qt开发环境。

2. qt图形用户界面设计:讲解qt中的窗口、控件等基本元素,使学生掌握使用qt创建用户界面。

- 界面布局与坐标系统- 控件的使用与事件处理3. 俄罗斯方块游戏原理:分析俄罗斯方块游戏的规则、逻辑和基本结构。

4. 编程实现俄罗斯方块:- 方块的形状、颜色和旋转- 方块的移动与消除逻辑- 游戏得分与结束条件5. qt编程实践:- 使用qt创建俄罗斯方块游戏界面- 实现方块的基本操作(移动、旋转、消除)- 游戏逻辑的编写与优化6. 团队协作与项目展示:分组进行项目实践,培养学生团队合作能力,展示并分享各自的作品。

软件工程课程设计报告俄罗斯方块

软件工程课程设计报告俄罗斯方块

《软件工程》课程设计报告课题:俄罗斯块学院:计算机与信息学院专业:软件工程姓名(学号):晋烨(2011112360)指导教师:昭一、任务分析俄罗斯块是个老少皆宜的小游戏,它实现由四块正形的色块组成,计算机随机产生不同七种类型的块,根据计算机时钟控制它在一定的时间不停的产生,用户根据键盘的四个向键控制翻转、向左、向右和向下操作,然后程序根据这七种块堆叠成各种不同的模型。

二、可行性研究报告1、设计背景俄罗斯块是一款风靡全球的电视游戏机和掌上游戏机游戏,它曾经造成的轰动与造成的经济价值可以说是游戏史上的一件大事。

俄罗斯块最早还是出现在PC机上,而我国的用户都是通过红白机了解、喜欢上它的。

随着计算机的发展而发展,俄罗斯块不断推出新,深爱广大玩家喜爱。

这个游戏有的简单,有的复杂,但其根本原理是一样的都是对运动的块进行组合,来训练玩家的反应能力。

因此开发此游戏软件可满足人们的一些娱乐的需求。

此俄罗斯块游戏可以为用户提供一个可在普通个人电脑上运行的,界面美观的,易于控制的俄罗斯块游戏。

2、设计目的通过本游戏的设计,综合自己在校期间所学的理论知识,设计开发俄罗斯广场游戏,使自己熟应用系统的开发过程,培养独立思考能力,检验学习效果和动手能力,初步掌握软件工程的系统理论,进一步巩固和加强自身对J2SE基础知识的理解,提高自己的编程水平,从而达到理论与实践相结合的目的。

3、设计要求本游戏开发的总体任务是实现游戏的可操作性,以及界面的美观性。

整个开发过程遵循软件工程规,采用JAVA GUI编程实现界面以及事件的控制。

用户根据键盘的四个向键控制翻转、向左、向右、和向下操作,通过菜单栏中的相应菜单选项实现游戏的开始、结束、变换向、积分以及等级的功能。

4、设计目标通过本游戏的开发,主要实现游戏的可操作性及美观性,同时使自己对JAVA语言的了解更进一层,为将来的实际工作打下坚实的基础。

三、需求分析游戏需求28种状态的块随机产生,自由下落,落下时可由玩家用上、下、左、右控制键控制翻转和移动,以便玩家所需要的形态和位置落下。

c课程设计俄罗斯方块

c课程设计俄罗斯方块

c 课程设计俄罗斯方块一、教学目标本课程的教学目标是让学生掌握C语言编程的基本知识,学会使用俄罗斯方块游戏引擎进行游戏开发。

具体分为以下三个部分:1.知识目标:使学生了解C语言的基本语法、数据类型、运算符、控制结构等,理解面向对象编程的基本概念,掌握游戏引擎的使用方法。

2.技能目标:培养学生具备运用C语言进行简单游戏开发的能力,能够独立完成俄罗斯方块游戏的编写,提高学生的编程实践能力。

3.情感态度价值观目标:激发学生对计算机编程的兴趣,培养学生的创新精神和团队合作意识,使学生在解决实际问题的过程中,体验到编程带来的成就感和乐趣。

二、教学内容教学内容主要包括C语言基础知识、面向对象编程、游戏引擎的使用和俄罗斯方块游戏的开发。

具体安排如下:1.第一章:C语言基础知识,包括数据类型、运算符、控制结构等。

2.第二章:面向对象编程,包括类与对象、继承与多态等。

3.第三章:游戏引擎的使用,包括引擎的基本功能、事件处理、图形渲染等。

4.第四章:俄罗斯方块游戏的开发,包括游戏逻辑、界面设计、音效处理等。

三、教学方法本课程采用讲授法、案例分析法、实验法等多种教学方法相结合的方式进行教学。

1.讲授法:用于讲解C语言基本语法、数据类型、运算符、控制结构等知识。

2.案例分析法:通过分析经典游戏案例,使学生掌握游戏引擎的使用方法和游戏开发技巧。

3.实验法:安排多次上机实验,让学生亲手编写代码,培养学生的实际编程能力。

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

1.教材:选用《C程序设计原理与应用》作为主要教材,辅助以《C语言编程实战》等参考书。

2.多媒体资料:制作PPT、视频教程等,用于辅助讲解和演示。

3.实验设备:提供计算机实验室,让学生进行上机实验。

4.网络资源:推荐学生访问一些优秀的编程,如CSDN、StackOverflow等,以便于学生自主学习和交流。

五、教学评估本课程的评估方式包括平时表现、作业、考试等部分,以全面客观地评价学生的学习成果。

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

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

内容摘要俄罗斯方块是个比较经典的小游戏,它实现由四块正方形的色块组成,然后存储在一个数组的四个元素中,计算机随机产生不同七种类型的方块,根据计算机定时器控制它在一定的时间不停的产生,用户根据键盘的四个方向键控制翻转、向左、向右和向下操作,(用信号和槽函数的关联来实现对按键事件的控制)。

然后程序根据这七种方块堆叠成各种不同的模型。

本设计大体分以下三部分:第一部分是简介,用基本方法实现自己的俄罗斯方块游戏,介绍游戏的基本概况及要实现的功能。

第二部分是功能演示,验证游戏可否按预想方案运行,验证运行流畅度,图形界面的美观度。

第三部分是代码分析,这里将展示整个游戏编程代码及接口函数。

本次设计用到的工具是基于UBUNTU下的QT软件,图行界面的处理都是代码实现。

关键词数组;定时器;信号;槽函数;QTDesign and implementation of Tetris, based on the QTName:Yiwenbo Teacher:WangyiqinAbstractTetris is a classic game, it consists of four square blocks of color, and then stored in an array of four elements, the computer randomly generated box of the seven types, according to the computer timer control it stop to produce a certain amount of time, according to the four directions of the keyboard keys to control flip, left, right and down operation (signal and slot functions associated with control of key events). The program then based on these seven box stacked into a variety of different models. This design is generally divided into the following three parts: The first part is the introduction to the basic methods to achieve their own game of Tetris. The second part is the functional demonstration; verify that the game please run the desired program. The third part is the game analysis, will show the entire game programming code and an excuse to function. The design tool used is based on the QT under UBUNTU software, the graph line interface processing is code to achieve.Key wordsarray; cell function; timer; signal;Qt目录引言................................................... - 1 - 第一部分简介.......................................... - 3 -1.1游戏功能......................................... - 3 -1.2 游戏界面与控制 .................................. - 3 -1.2.1游戏窗口.................................... - 3 -1.2.2方块形状.................................... - 4 -1.2.3键盘处理事件................................ - 4 -1.2.4显示需求.................................... - 4 - 第二部分功能展示 ...................................... - 5 - 2.1 打开游戏........................................... - 5 -2.2 进入游戏 ........................................ - 6 -2.3游戏过关......................................... - 6 -2.4 游戏暂停 ........................................ - 7 -2.5 游戏退出 ........................................ - 8 - 第三部分代码分析 ...................................... - 8 -3.1 Tetrix工程.................................... - 8 -3.2 tetrixboard.h ................................. - 9 -3.3 tetrixpiece.h ................................. - 10 -3.4 tetrixwindow.h ................................ - 11 -3.5 main.cpp ...................................... - 12 -3.6 tetrixpiece.cpp ............................... - 13 -3.7 tetrixwindow.cpp ............................... - 14 -3.7.1 显示框 .................................... - 14 -3.7.2 功能按钮 .................................. - 15 -3.7.3 信号与槽 .................................. - 16 -3.7.4 游戏面板布局 .............................. - 16 -3.8etrixboard.cpp .................................. - 17 -3.8.1游戏初始化,复位的实现..................... - 18 -3.8.2 游戏开始与暂停 ............................ - 19 -3.8.3 按键控制游戏 .............................. - 22 -3.8.4计时模块................................... - 23 -3.8.5 方块的活动 ................................ - 24 -3.8.6 过关与奖励 ................................ - 25 -3.8.7 方块颜色控制 .............................. - 28 - 总结.................................................. - 30 - 致谢.................................................. - 30 - 参考文献.............................................. - 30 -基于QT 的俄罗斯方块的设计与实现081308233 易文波指导教师:王义琴讲师引言Qt是一个1991年由奇趣科技开发的跨平台C++图形用户界面应用程序开发框架。

c课程设计俄罗斯方块

c课程设计俄罗斯方块

c 课程设计俄罗斯方块一、课程目标知识目标:1. 学生能理解俄罗斯方块的基本游戏规则和操作方法。

2. 学生能掌握运用方向键控制方块移动、旋转的技巧。

3. 学生了解俄罗斯方块中的不同形状及其特点。

技能目标:1. 学生通过操作俄罗斯方块,提高手眼协调能力和反应速度。

2. 学生能运用策略,合理安排方块的位置,提高游戏成绩。

3. 学生能够运用编程思维,设计简单的俄罗斯方块游戏。

情感态度价值观目标:1. 学生在游戏中培养团队合作精神,学会互相鼓励和支持。

2. 学生体验游戏带来的乐趣,激发对计算机编程的兴趣。

3. 学生认识到游戏背后的科技原理,培养对科学的敬畏之心。

分析课程性质、学生特点和教学要求:1. 课程性质:本课程为信息技术课程,旨在通过游戏教学,让学生掌握计算机基本操作和编程思维。

2. 学生特点:六年级学生具备一定的计算机操作基础,对新奇有趣的游戏充满兴趣,具备团队合作精神。

3. 教学要求:结合学生特点,课程设计应注重实践操作,鼓励学生主动探索,培养创新思维。

二、教学内容1. 俄罗斯方块游戏规则与操作方法- 游戏界面认识- 方块形状及特点- 方块移动、旋转操作技巧2. 计算机编程基础- 编程思维训练- 简单的算法设计- 俄罗斯方块游戏编程实践3. 游戏策略与团队合作- 游戏策略制定与调整- 团队合作与沟通- 互相鼓励,共同提高游戏成绩4. 教学内容的安排与进度- 第一节课:游戏规则与操作方法学习- 第二节课:方块移动、旋转技巧训练- 第三节课:计算机编程基础及编程思维训练- 第四节课:简单算法设计与俄罗斯方块游戏编程实践- 第五节课:游戏策略制定与团队合作5. 教材章节及内容列举- 课本第三章:计算机游戏与编程- 第一节:游戏概述- 第二节:俄罗斯方块游戏介绍- 第三节:编程基础与游戏设计教学内容确保科学性和系统性,结合课程目标,注重实践操作,使学生能够在掌握游戏操作的基础上,进一步学习编程思维和团队合作。

俄罗斯方块编程课程设计报告

俄罗斯方块编程课程设计报告

课程设计报告题目:俄罗斯方块设计设计者:* *专业班级:* *学号:* *指导教师:* *所属系部:* ** *年* *月* *日、目录目录 .................... 错误!未定义书签。

一.设计的目的和要求..... 错误!未定义书签。

二.设计内容............. 错误!未定义书签。

三.设计任务............. 错误!未定义书签。

四.游戏基本规则......... 错误!未定义书签。

五.总体设计............. 错误!未定义书签。

六.详细设计与程序实现... 错误!未定义书签。

七.主要处理流程.......... 错误!未定义书签。

八.游戏设计源程序........ 错误!未定义书签。

九.截图 ................. 错误!未定义书签。

十心得体会.............. 错误!未定义书签。

十一参考文献............ 错误!未定义书签。

一.设计的目的和要求加深对《C语言》课程所学知识的理解,进一步巩固C语言语法规则。

学会编制结构清晰、风格良好、数据结构适当的C语言程序,从而具备解决综合性实际问题的能力。

二.设计内容在熟练掌握C语言的基本知识:数据类型(整形、实型、字符型、指针、数组、结构等);运算类型(算术运算、逻辑运算、自增自减运算、赋值运算等);程序结构(顺序结构、判断选择结构、循环结构);大程序的功能分解方法(即函数的使用)等。

进一步掌握各种函数的应用,包括时间函数、绘图函数,以及文件的读写操作等。

三.设计任务1.游戏欢迎界面。

2.游戏执行功能,包括计算得分。

3.游戏结束界面。

四.游戏基本规则游戏共由7种不同形状的方块组成,游戏开始以后随机产生一个方块由屏幕的顶端开始向下落下,落到低端则固定到桌面,并开始下一个方块。

在游戏窗口的左边作为游戏的桌面,用宽度10和高度20的表格表示。

游戏桌面的右边靠上显示得分,最下边显示游戏帮助。

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

目录摘要 (1)关键字 (1)1 功能说明 (1)2 开发环境 (1)2.1 Qt简介 (1)2.2 Qt安装 (1)2.3 Qt开发基础 (1)2.3.1 Qt对象与对象树 (1)2.3.2 信号与槽 (1)2.3.3 事件 (3)3 系统设计 (3)3.1 需求分析 (3)3.2 框架设计 (3)3.2.1 俄罗斯方块基本规则 (3)3.2.2 系统模块 (4)3.3 系统实现 (4)4 系统测试 (5)5 课程设计总结 (6)6 附录 (6)6.1 参考资料 (6)6.2 程序源码 (6)摘要Qt是一个跨平台的C++图形用户界面应用程序框架。

本程序利用Qt提供的相关类,实现了俄罗斯方块的基本功能。

关键字QT、嵌入式、软件开发1 功能说明支持俄罗斯方块游戏的基本功能支持虚拟按键2 开发环境操作系统:ubuntu 10.04 LTS开发工具:gnu编译工具链(gcc等)、Qt Creator、Qt 4.6.22.1 Qt简介Qt是跨平台的应用程序和UI框架。

它包括跨平台类库、集成开发工具和跨平台IDE。

使用Qt,只需一次性开发应用程序,无须重新编写源代码,便可跨不同桌面和嵌入式操作系统部署这些应用程序。

2.2 Qt安装1.Qt官网()上有完整的SDK下载,下载开发平台的SDK,下载完成后点击即可安装2.如果是使用Linux系统,也可能通过命令行进行安装,以ubuntu 10.04 LTS为例:sudo apt-get install qt4-dev-tools qtcreator qt4-doc qt4-qtconfig qt-demos3.如果希望构建嵌入式Qt开发平台,则需要参考相关开发板的说明,一般是先制作交叉编译工具链、再交叉编译一个用于目标板的Qt库,这里不再详述2.3 Qt开发基础2.3.1 Qt对象与对象树QObject是所有Qt类的基类。

QObject 组织成为对象树。

当你创建QObject 时,将另外的对象作为其父对象,这个对象就被加入其父对象的children() 列表,并且当父对象销毁时,这个对象也能够被销毁。

事实证明,这种实现方法非常适合GUI 对象。

例如,一个QShortcut(键盘快捷键)对象是相关窗口的子对象,所以当用户关闭窗口时,这个对象也能够被删除。

QWidget 作为所有能够显示在屏幕上的组件的父类,扩展了这种父子关系。

一个子对象通常也成为一个子组件,就是说,它被显示在父组件的坐标系统中,受到父组件的边界影响可能会有剪切等等。

例如,当应用程序销毁掉已关闭的消息对话框时,对话框上面的按钮和标签一起被销毁,就像我们希望的那样,因为这些按钮和标签都是对话框的子对象。

2.3.2 信号与槽在GUI 编程中,当我们改变了一个组件,我们经常需要通知另外的一个组件。

更一般地,我们希望任何类型的对象都能够与另外的对象通讯。

例如,如果用户点击了关闭按钮,我们希望窗口的close() 函数被调用。

早期工具库对这种通讯使用回调实现。

回调是一个指向一个函数的指针,所以如果你希望某种事件发生的时候,处理函数获得通知,你就需要将指向另外函数的指针(也就是这个回调)传递给处理函数。

这样,处理函数就会在合适的时候调用回调函数。

回调有两个明显的缺点:第一,它们不是类型安全的。

我们不能保证处理函数传递给回调函数的参数都是正确的。

第二,回调函数和处理函数紧密地耦合在一起,因为处理函数必须知道哪一个函数被回调。

在Qt 中,我们有回调技术之外的选择:信号槽。

当特定事件发出时,一个信号会被发出。

Qt 组件有很多预定义的信号,同时,我们也可以通过继承这些组件,添加自定义的信号。

槽则能够响应特定信号的函数。

Qt 组件有很多预定义的槽,但是更常见的是,通过继承组件添加你自己的槽,以便你能够按照自己的方式处理信号。

信号槽机制是类型安全的:信号的签名必须同接受该信号的槽的签名一致(实际上,槽的参数个数可以比信号少,因为槽能够忽略信号定义的多出来的参数)。

既然签名都是兼容的,那么编译器就可以帮助我们找出不匹配的地方。

信号和槽是松耦合的:发出信号的类不知道也不关心哪些槽连接到它的信号。

Qt 的信号槽机制保证了,如果你把一个信号同一个槽连接,那么在正确的时间,槽能够接收到信号的参数并且被调用。

信号和槽都可以有任意类型的任意个数的参数。

它们全部都是类型安全的。

所有继承自QObject 或者它的一个子类(例如QWidget)都可以包含信号槽。

信号在对象改变其状态,并且这个状态可能有别的对象关心时被发出。

这就是这个对象为和别的对象交互所做的所有工作。

它并不知道也不关心有没有别的对象正在接收它发出的信号。

这是真正的信息封装,保证了这个对象能够成为一个组件。

槽能够被用于接收信号,也能够像普通函数一样使用。

正如一个对象并不知道究竟有没有别的对象正在接收它的信号一样,一个槽也不知道有没有信号与它相连。

这保证了使用Qt 可以创建真正相互独立的组件。

你可以将任意多个信号连接到同一个槽上,也可能将一个信号连接任意多个槽。

同时,也能够直接将一个信号与另一个信号相连(这会使第一个信号发出时,马上发出第二个信号)。

总之,信号槽建立起一种非常强大的组件编程机制。

2.3.3 事件在Qt中,事件是作为对象处理的,所有事件对象继承自抽象类QEvent。

此类用来表示程序内部发生或者来自于外部但应用程序应该知道的动作。

事件能够能过被QObject 的子类接受或者处理,但是通常用在与组件有关的应用中。

本文档主要阐述了在一个典型应用中的事件接收与处理。

当一个事件产生时,Qt 通过实例化一个QEvent 的合适的子类来表示它,然后通过调用event() 函数发送给QObject 的实例(或者它的子类)。

event() 函数本身并不会处理事件,根据事件类型,它将调用相应的事件处理函数,并且返回事件被接受还是被忽略。

一些事件,比如QMouseEvent 和QKeyEvent,来自窗口系统;有的,比如QTimerEvent,来自于其他事件源;另外一些则来自应用程序本身。

通常事件的处理需要调用一个虚函数。

比如,QPaintEvent 事件的处理需要调用QWidget::paintEvent() 函数。

这个虚函数负责做出适当的响应,通常是用来重绘组件。

如果你在自己的函数中并不打算实现所有的处理,你可以调用基类的实现。

3 系统设计3.1 需求分析可随机生成7种基本方块单元不同的方块单元具备不同的颜色基本方块单元在移动时支持两种操作:旋转、移动具备计分及升级系统支持虚拟按键3.2 框架设计3.2.1 俄罗斯方块基本规则一个用于摆放小型正方形的平面虚拟场地,其标准大小:行宽为10,列高为20,以每个小正方形为单位一组由4个小型正方形组成的规则图形,英文称为Tetromino,中文通称为方块共有7种,分别以S、Z、L、J、I、O、T这7个字母的形状来命名随机发生器不断地输出单个方块到场地顶部,以一定的规则进行移动、旋转、下落和摆放,锁定并填充到场地中。

每次摆放如果将场地的一行或多行完全填满,则组成这些行的所有小正方形将被消除,并且以此来换取一定的积分或者其他形式的奖励。

而未被消除的方块会一直累积,并对后来的方块摆放造成各种影响如果未被消除的方块堆放的高度超过场地所规定的最大高度(并不一定是20或者玩家所能见到的高度),则游戏结束3.2.2 系统模块如上图所示,系统可由以下几个模块组成:虚拟显示屏:为系统核心模块,负责游戏元素的显示、游戏逻辑的执行、以及游戏状态的维护、接收操作模块的操作信息、为辅助显示模块提供必要的信息辅助显示模块:显示下一个方块单元的类型、当前分数、当前等级操作区模块:为用户提供操作按键3.3 系统实现系统源文件布局如下:HTetris.pro:系统工程文件HTetrisWindow.h:HTetrisWindow类声明头文件HTetrisPiece.h:HTetrisPiece类声明头文件HTetrisBoard.h:HTetrisBoard类声明头文件tetris.qrc:系统资源文件,存放了表示方向的图像数据HTetrisWindow.cpp:HTetrisWindow类的实现HTetrisPiece.cpp:HTetrisPiece类的实现HTetrisBoard.cpp:HTetrisBoard类的实现main.cpp:程序入口main.cpp中初始化一个HTetrisWindow实例,并使其显示。

HTetrisWindow对应程序窗口,它包含一个游戏显示区(HTetrisBoard)、辅助显示区、及一些按键,HTetrisWindow在自身的构造函数中完成对这些界面元素的初始化及布局工作,同时建立起必要的信号-槽连接。

HTetrisPiece类表示基本方块单元,总共有7种,即I、T、J、L、O、Z、S,用HTetrisPieceShape来标识方块类型。

HTetrisPiece提供了设置方块形状、设置旋转、获取方块信息的一些公共成员函数。

HTetrisPiece使用coords[4][2]这个二维数组来存储方块的形状信息,这个数组的每行表示一个点的坐标。

HTetrisBoard是整个程序的核心,相对前两个类,这个类要复杂很多。

它提供了如下几个槽:start()、pause()、moveRight()、moveLeft()、moveDown()、rotateRight()、rotateLeft()。

提供了scoreChanged与levelChanged两个信号。

paintEvent负责整个HTetrisBoard的重绘。

removeFullLines负责判断是否某行全部为方块,如果是,则把该行消除,同时添加一定分数及经验。

4 系统测试程序的运行界面如上图所示,经测试,该程序具备了俄罗斯方块游戏的基本功能。

5 课程设计总结通过这次嵌入式实验,我对嵌入式技术有了更加深入的了解,在老师悉心帮助下,和其他同学的共同努力下,我们最终圆满地完成了这次课程设计。

但是实验中,也暴露了自己在软件运用方面的不足和缺点,以后在这方面上认真学习和研究,争取在毕业之前能更上一层楼。

6 附录6.1 参考资料[1]/4.6/[2]C plus plus GUI Programming with Qt 4 2nd Edition[3]6.2 程序源码/**Filename: main.cpp*Author: Hale Chan <halechan@>*Date: 2011-11-24*/#include <QtGui>#include "HTetrisWindow.h"int main(int argc, char *argv[]){QApplication app(argc, argv);HTetrisWindow window;window.show();qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));return app.exec();}/**Filename: HTetrisWindow.h*Author: Hale Chan <halechan@>*Date: 2011-11-24*/#ifndef HTetrisWINDOW_H#define HTetrisWINDOW_H#include <QWidget>class HTetrisBoard;class QLabel;class QLCDNumber;class QPushButton;class HTetrisWindow : public QWidget{Q_OBJECTpublic:HTetrisWindow();private:QLabel *createLabel(const QString &text);HTetrisBoard *board;QLabel *nextPieceLabel;QLCDNumber *scoreLcd;QLCDNumber *levelLcd;QPushButton *leftButton;QPushButton *rightButton;QPushButton *upButton;QPushButton *downButton;QPushButton *aButton;QPushButton *bButton;};#endif // HTetrisWINDOW_H/**Filename: HTetrisWindow.cpp*Author: Hale Chan <halechan@>*Date: 2011-11-24*/#include "HTetrisWindow.h"#include "HTetrisBoard.h"#include <QtGui>HTetrisWindow::HTetrisWindow(){board = new HTetrisBoard;nextPieceLabel = new QLabel;nextPieceLabel->setFrameStyle(QFrame::Box | QFrame::Raised);nextPieceLabel->setAlignment(Qt::AlignCenter);nextPieceLabel->setBaseSize(60, 60);nextPieceLabel->setMinimumSize(60, 60);nextPieceLabel->setMaximumSize(60,60);nextPieceLabel->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); board->setNextPieceLabel(nextPieceLabel);scoreLcd = new QLCDNumber(6);scoreLcd->setSegmentStyle(QLCDNumber::Filled);scoreLcd->setFixedWidth(70);levelLcd = new QLCDNumber(1);levelLcd->setSegmentStyle(QLCDNumber::Filled);levelLcd->setFixedWidth(70);leftButton = new QPushButton;leftButton->setAutoRepeat(true);leftButton->setIcon(QIcon(":/images/left.png"));rightButton = new QPushButton;rightButton->setAutoRepeat(true);rightButton->setIcon(QIcon(":/images/right.png"));upButton = new QPushButton;upButton->setIcon(QIcon(":/images/up.png"));downButton = new QPushButton;downButton->setAutoRepeat(true);downButton->setIcon(QIcon(":/images/down.png"));aButton = new QPushButton(tr("A"));aButton->setFixedWidth(50);bButton = new QPushButton(tr("B"));bButton->setFixedWidth(50);connect(leftButton, SIGNAL(clicked()), board, SLOT(moveLeft()));connect(rightButton, SIGNAL(clicked()), board, SLOT(moveRight()));connect(upButton, SIGNAL(clicked()), board, SLOT(pause()));connect(downButton, SIGNAL(clicked()), board, SLOT(moveDown()));connect(aButton, SIGNAL(clicked()), board, SLOT(rotateLeft()));connect(bButton, SIGNAL(clicked()), board, SLOT(rotateRight()));connect(board, SIGNAL(levelChanged(int)), levelLcd, SLOT(display(int))); connect(board, SIGNAL(scoreChanged(int)), scoreLcd, SLOT(display(int)));QGridLayout *mainLayout = new QGridLayout;mainLayout->addWidget(board, 0, 0, 7, 3, Qt::AlignCenter);mainLayout->addWidget(createLabel(tr("Next")), 0, 3, Qt::AlignCenter);mainLayout->addWidget(nextPieceLabel, 1, 3, Qt::AlignCenter);mainLayout->setRowStretch(2, 9);mainLayout->addWidget(createLabel(tr("Score")), 3, 3, Qt::AlignCenter); mainLayout->addWidget(scoreLcd, 4, 3, Qt::AlignHCenter | Qt::AlignTop); mainLayout->addWidget(createLabel(tr("Level")), 5, 3, Qt::AlignCenter); mainLayout->addWidget(levelLcd, 6, 3, Qt::AlignHCenter | Qt::AlignTop); mainLayout->addWidget(upButton, 7, 1, Qt::AlignBottom);mainLayout->addWidget(aButton, 7, 3, Qt::AlignBottom | Qt::AlignHCenter); mainLayout->addWidget(leftButton, 8, 0, Qt::AlignTop | Qt::AlignLeft);mainLayout->addWidget(downButton, 8, 1, Qt::AlignBottom);mainLayout->addWidget(rightButton, 8, 2, Qt::AlignRight | Qt::AlignTop); mainLayout->addWidget(bButton, 8, 3, Qt::AlignBottom | Qt::AlignHCenter); mainLayout->setRowMinimumHeight(7, 30);mainLayout->setRowMinimumHeight(8, 50);this->setLayout(mainLayout);this->setWindowTitle(tr("Tetris"));this->setFixedSize(240, 400);}QLabel *HTetrisWindow::createLabel(const QString &text){QLabel *lbl = new QLabel(text);lbl->setAlignment(Qt::AlignHCenter | Qt::AlignBottom);return lbl;}/**Filename: HTetrisPiece.h*Author: Hale Chan <halechan@>*Date: 2011-11-24*/#ifndef HTetrisPIECE_H#define HTetrisPIECE_Htypedef enum{HTetrisPieceShapeNone,HTetrisPieceShapeI,HTetrisPieceShapeT,HTetrisPieceShapeJ,HTetrisPieceShapeL,HTetrisPieceShapeO,HTetrisPieceShapeZ,HTetrisPieceShapeS}HTetrisPieceShape;typedef enum{HTetrisPieceRotateZero,HTetrisPieceRotate90,HTetrisPieceRotate180,HTetrisPieceRotate270}HTetrisPieceRotate;class HTetrisPiece{public:HTetrisPiece(){setShape(HTetrisPieceShapeNone);}void setRandomShape();void setShape(HTetrisPieceShape shape);HTetrisPieceShape shape() const { return pieceShape; } int x(int index) const { return coords[index][0]; }int y(int index) const { return coords[index][1]; }int minX() const;int maxX() const;int minY() const;int maxY() const;void setRotate(HTetrisPieceRotate rotate);HTetrisPiece pieceFromRotatedLeft() const;HTetrisPiece pieceFromRotatedRight() const;private:void setX(int index, int x) { coords[index][0] = x; } void setY(int index, int y) { coords[index][1] = y; }HTetrisPieceShape pieceShape;int coords[4][2];};#endif // HTetrisPIECE_H/**Filename: HTetrispiece.cpp*Author: Hale Chan <halechan@>*Date: 2011-11-24*/#include "HTetrisPiece.h"#include <QtCore>static const int coordsTable[8][4][2] = {{{0, 0}, {0, 0}, {0, 0}, {0, 0}},{{0, -1}, {0, 0}, {0, 1}, {0, 2}},{{-1, 0}, {0, 0}, {1, 0}, {0, 1}},{{0, -1}, {0, 0}, {0, 1}, {-1, 1}},{{0, -1}, {0, 0}, {0, 1}, {1, 1}},{{0, 0}, {1, 0}, {1, 1}, {0, 1}},{{-1, -1}, {0, -1}, {0, 0}, {1, 0}},{{1, -1}, {0, -1}, {0, 0}, {-1, 0}}};void HTetrisPiece::setRandomShape(){setShape((HTetrisPieceShape)(qrand() % 7 + 1));}void HTetrisPiece::setShape(HTetrisPieceShape shape) {for (int i=0; i<4; i++){coords[i][0] = coordsTable[shape][i][0];coords[i][1] = coordsTable[shape][i][1];}pieceShape = shape;}int HTetrisPiece::minX()const{int min = coords[0][0];for (int i = 1; i < 4; ++i)min = qMin(min, coords[i][0]);return min;}int HTetrisPiece::maxX()const{int max = coords[0][0];for (int i = 1; i < 4; ++i)max = qMax(max, coords[i][0]);return max;}int HTetrisPiece::minY()const{int min = coords[0][1];for (int i = 1; i < 4; ++i)min = qMin(min, coords[i][1]);return min;}int HTetrisPiece::maxY()const{int max = coords[0][1];for (int i = 1; i < 4; ++i)max = qMax(max, coords[i][1]);return max;}void HTetrisPiece::setRotate(HTetrisPieceRotate rotate) {switch(rotate){case HTetrisPieceRotate90:for(int i=0; i<4; i++){int tmp = x(i);setX(i,-y(i));setY(i, tmp);}break;case HTetrisPieceRotate180:for(int i=0; i<4; i++){setX(i,-x(i));setY(i, -y(i));}break;case HTetrisPieceRotate270:for(int i=0; i<4; i++){int tmp = x(i);setX(i,y(i));setY(i, -tmp);}break;default:break;}}HTetrisPiece HTetrisPiece::pieceFromRotatedLeft()const {if (pieceShape == HTetrisPieceShapeO)return *this;HTetrisPiece result;result.pieceShape = pieceShape;for (int i = 0; i < 4; ++i) {result.setX(i, y(i));result.setY(i, -x(i));}return result;}HTetrisPiece HTetrisPiece::pieceFromRotatedRight()const {if (pieceShape == HTetrisPieceShapeO)return *this;HTetrisPiece result;result.pieceShape = pieceShape;for (int i = 0; i < 4; ++i) {result.setX(i, -y(i));result.setY(i, x(i));}return result;}/**Filename: HTetrisBoard.h*Author: Hale Chan <halechan@>*Date: 2011-11-24*/#ifndef HTetrisBOARD_H#define HTetrisBOARD_H#include <QBasicTimer>#include <QFrame>#include <QPointer>#include "HTetrisPiece.h"class QLabel;#define HTetrisBoardWidth 10#define HTetrisBoardHeight 20class HTetrisBoard : public QFrame{Q_OBJECTpublic:HTetrisBoard(QWidget *parent = 0);void setNextPieceLabel(QLabel *label);QSize sizeHint() const;QSize minimumSizeHint() const;public slots:void start();void pause();void moveRight();void moveLeft();void moveDown();void rotateRight();void rotateLeft();signals:void scoreChanged(int score);void levelChanged(int level);protected:void paintEvent(QPaintEvent *event);void keyPressEvent(QKeyEvent *event);void timerEvent(QTimerEvent *event);private:HTetrisPieceShape &shapeAt(int x, int y) { return board[(y * HTetrisBoardWidth) + x]; } int timeoutTime() { return 1000 / level; }int squareWidth() { return contentsRect().width() / HTetrisBoardWidth; }int squareHeight() { return contentsRect().height() / HTetrisBoardHeight; }void clearBoard();void dropDown();void oneLineDown();void pieceDropped(int dropHeight);void removeFullLines();void newPiece();void showNextPiece();bool tryMove(const HTetrisPiece &newPiece, int newX, int newY);void drawSquare(QPainter &painter, int x, int y, HTetrisPieceShape shape);QBasicTimer timer;QPointer<QLabel> nextPieceLabel;bool isStarted;bool isPaused;bool isWaitingAfterLine;bool gameOver;HTetrisPiece curPiece;HTetrisPiece nextPiece;int curX;int curY;int score;int level;int exp;HTetrisPieceShape board[HTetrisBoardWidth * HTetrisBoardHeight]; };#endif // HTetrisBOARD_H/**Filename: HTetrisBoard.cpp*Author: Hale Chan <halechan@>*Date: 2011-11-24*/#include <QtGui>#include "HTetrisBoard.h"static const QRgb colorTable[8] = {0x000000,0x00F0F0,0xA000F0,0x0000F0,0xF0A000,0xF0F000,0xF00000,0x00F000};HTetrisBoard::HTetrisBoard(QWidget *parent): QFrame(parent){setFrameStyle(QFrame::Panel | QFrame::Sunken);setFocusPolicy(Qt::StrongFocus);isStarted = false;isPaused = false;gameOver = false;clearBoard();nextPiece.setRandomShape();nextPiece.setRotate((HTetrisPieceRotate)(qrand()%4));}void HTetrisBoard::setNextPieceLabel(QLabel *label){nextPieceLabel = label;}QSize HTetrisBoard::sizeHint() const{return QSize(HTetrisBoardWidth * 15 + frameWidth() * 2,HTetrisBoardHeight * 15 + frameWidth() * 2);}QSize HTetrisBoard::minimumSizeHint() const{return QSize(HTetrisBoardWidth * 5 + frameWidth() * 2,HTetrisBoardHeight * 5 + frameWidth() * 2);}void HTetrisBoard::start(){if (isPaused)return;isStarted = true;gameOver = false;isWaitingAfterLine = false;score = 0;level = 1;clearBoard();emit scoreChanged(score);emit levelChanged(level);newPiece();timer.start(timeoutTime(), this);}void HTetrisBoard::pause(){if (!isStarted){start();return;}isPaused = !isPaused;if (isPaused) {timer.stop();} else {timer.start(timeoutTime(), this);}update();}void HTetrisBoard::paintEvent(QPaintEvent *event){QFrame::paintEvent(event);QPainter painter(this);QRect rect = contentsRect();int boardTop = rect.bottom() - HTetrisBoardHeight*squareHeight();for (int i = 0; i < HTetrisBoardHeight; ++i) {for (int j = 0; j < HTetrisBoardWidth; ++j) {HTetrisPieceShape shape = shapeAt(j, HTetrisBoardHeight - i - 1); if (shape != HTetrisPieceShapeNone)drawSquare(painter, rect.left() + j * squareWidth(),boardTop + i * squareHeight(), shape);}}if (curPiece.shape() != HTetrisPieceShapeNone) {for (int i = 0; i < 4; ++i) {int x = curX + curPiece.x(i);int y = curY - curPiece.y(i);drawSquare(painter, rect.left() + x * squareWidth(),boardTop + (HTetrisBoardHeight - y - 1) * squareHeight(), curPiece.shape());}}painter.setPen(QColor(255, 0, 0));if (isPaused) {painter.drawText(rect, Qt::AlignCenter, tr("Paused"));}if (gameOver){painter.drawText(rect, Qt::AlignCenter, tr("Game Over"));}}void HTetrisBoard::keyPressEvent(QKeyEvent *event){if (!isStarted || isPaused || curPiece.shape() == HTetrisPieceShapeNone) { if(isPaused && event->key() == Qt::Key_Up){pause();}QFrame::keyPressEvent(event);return;}switch (event->key()) {case Qt::Key_Left:tryMove(curPiece, curX - 1, curY);break;case Qt::Key_Right:tryMove(curPiece, curX + 1, curY);break;case Qt::Key_Down:oneLineDown();break;case Qt::Key_Up:pause();break;case Qt::Key_A:tryMove(curPiece.pieceFromRotatedLeft(), curX, curY);break;case Qt::Key_B:tryMove(curPiece.pieceFromRotatedRight(), curX, curY);break;default:QFrame::keyPressEvent(event);}}void HTetrisBoard::timerEvent(QTimerEvent *event){if (event->timerId() == timer.timerId()) {if (isWaitingAfterLine) {isWaitingAfterLine = false;newPiece();timer.start(timeoutTime(), this);} else {oneLineDown();}} else {QFrame::timerEvent(event);}}void HTetrisBoard::clearBoard(){for (int i = 0; i < HTetrisBoardHeight * HTetrisBoardWidth; ++i) board[i] = HTetrisPieceShapeNone;}void HTetrisBoard::dropDown(){int dropHeight = 0;int newY = curY;while (newY > 0) {if (!tryMove(curPiece, curX, newY - 1))break;--newY;++dropHeight;}pieceDropped(dropHeight);}void HTetrisBoard::oneLineDown(){if (!tryMove(curPiece, curX, curY - 1))pieceDropped(0);}void HTetrisBoard::pieceDropped(int dropHeight){for (int i = 0; i < 4; ++i) {int x = curX + curPiece.x(i);int y = curY - curPiece.y(i);shapeAt(x, y) = curPiece.shape();}exp += 1;score += dropHeight+1;emit scoreChanged(score);removeFullLines();if(exp%50 == 0){level++;timer.start(timeoutTime(), this);emit levelChanged(level);}if (!isWaitingAfterLine)newPiece();}void HTetrisBoard::removeFullLines(){int numFullLines = 0;for (int i = HTetrisBoardHeight - 1; i >= 0; --i) {bool lineIsFull = true;for (int j = 0; j < HTetrisBoardWidth; ++j) {if (shapeAt(j, i) == HTetrisPieceShapeNone) {lineIsFull = false;break;}}if (lineIsFull) {++numFullLines;for (int k = i; k < HTetrisBoardHeight - 1; ++k) {for (int j = 0; j < HTetrisBoardWidth; ++j)shapeAt(j, k) = shapeAt(j, k + 1);}for (int j = 0; j < HTetrisBoardWidth; ++j)shapeAt(j, HTetrisBoardHeight - 1) = HTetrisPieceShapeNone; }}if (numFullLines > 0) {switch(numFullLines){case 1:exp += 1;score += 10;break;case 2:exp += 2;score += 20;break;case 3:exp += 3;score += 30;break;case 4:exp += 5;score += 50;break;}emit scoreChanged(score);timer.start(500, this);isWaitingAfterLine = true;curPiece.setShape(HTetrisPieceShapeNone);update();}}void HTetrisBoard::newPiece(){curPiece = nextPiece;nextPiece.setRandomShape();nextPiece.setRotate((HTetrisPieceRotate)(qrand()%4));showNextPiece();curX = HTetrisBoardWidth / 2;curY = HTetrisBoardHeight - 1 + curPiece.minY();if (!tryMove(curPiece, curX, curY)) {curPiece.setShape(HTetrisPieceShapeNone);timer.stop();isStarted = false;gameOver = true;update();}}void HTetrisBoard::showNextPiece(){if (!nextPieceLabel)return;int dx = nextPiece.maxX() - nextPiece.minX() + 1;int dy = nextPiece.maxY() - nextPiece.minY() + 1;QPixmap pixmap(dx * squareWidth(), dy * squareHeight());QPainter painter(&pixmap);painter.fillRect(pixmap.rect(), nextPieceLabel->palette().background());for (int i = 0; i < 4; ++i) {int x = nextPiece.x(i) - nextPiece.minX();int y = nextPiece.y(i) - nextPiece.minY();drawSquare(painter, x * squareWidth(), y * squareHeight(),nextPiece.shape());}nextPieceLabel->setPixmap(pixmap);}bool HTetrisBoard::tryMove(const HTetrisPiece &newPiece, int newX, int newY){for (int i = 0; i < 4; ++i) {int x = newX + newPiece.x(i);int y = newY - newPiece.y(i);if (x < 0 || x >= HTetrisBoardWidth || y < 0 || y >= HTetrisBoardHeight)return false;if (shapeAt(x, y) != HTetrisPieceShapeNone)return false;}curPiece = newPiece;curX = newX;curY = newY;update();return true;}void HTetrisBoard::drawSquare(QPainter &painter, int x, int y, HTetrisPieceShape shape) {QColor color = colorTable[(int)(shape)];painter.fillRect(x + 1, y + 1, squareWidth() - 2, squareHeight() - 2,color);painter.setPen(color.light());painter.drawLine(x, y + squareHeight() - 1, x, y);painter.drawLine(x, y, x + squareWidth() - 1, y);painter.setPen(color.dark());painter.drawLine(x + 1, y + squareHeight() - 1,x + squareWidth() - 1, y + squareHeight() - 1); painter.drawLine(x + squareWidth() - 1, y + squareHeight() - 1, x + squareWidth() - 1, y + 1);}void HTetrisBoard::moveLeft(){tryMove(curPiece, curX - 1, curY);}void HTetrisBoard::moveRight(){tryMove(curPiece, curX + 1, curY);}void HTetrisBoard::moveDown(){oneLineDown();}void HTetrisBoard::rotateLeft(){tryMove(curPiece.pieceFromRotatedLeft(), curX, curY);}void HTetrisBoard::rotateRight(){tryMove(curPiece.pieceFromRotatedRight(), curX, curY);}。

相关文档
最新文档