




已阅读5页,还剩47页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于android环境的俄罗斯方块一、 绪论1.1. 项目背景本题目将设计一个俄罗斯方块(tetris, 俄文:)。它是一款风靡全球的电视游戏机和掌上游戏机游戏,由俄罗斯人阿列克谢帕基特诺夫发明,故得此名。俄罗斯方块的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。由于上手简单、老少皆宜,从而家喻户晓,风靡世界。1.2. 开发平台 此项目基于android 环境进行开发,使用的编程工具为eclipse,它是以android语言作为其基本语言的一种可视化编程工具。android 是google开发的基于linux平台的开源手机操作系统. android四大基本组件分别是activity,service服务,content provider内容提供者,broadcastreceiver广播接收器。应用程序中,一个activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。activity之间通过intent进行通信。你的应用可以使用它对外部事件进行过滤只对感兴趣的外部事件(如当电话呼入时,或者数据网络可用时)进行接收并做出响应。广播接收器没有用户界面。然而,它们可以启动一个activity或serice 来响应它们收到的信息,或者用notificationmanager 来通知用户。一个service 是一段长生命周期的,没有用户界面的程序,可以用来开发如监控类程序。android平台提供了content provider使一个应用程序的指定数据集提供给其他应用程序。注:activity生命周期二、 项目规则及设计思路. 项目规则 玩家通过点触虚拟键盘,左右控制方块左右移动,按上代表旋转,按下代表加速向下移动,每满一行消除,获得相应积分100,积分每增长2000,等级加1,游戏速度加快2.2. 实现思路..1. 界面设计游戏菜单界面游戏结束界面游戏运行界面排行榜界面帮助界面 注:游戏界面中,利用二维数组进行保存,其值为1代表该点有方块占用,值为0代表空白,根据值绘制整张游戏窗口。2.2.2. 功能设计 从游戏的基本玩法出发,主要算法在于俄罗斯方块的形状和旋转。在游戏设计中,方块采用最基本的7种造型,包括长条型,正方型,正s型,反s型,正7型,反7型,t型,每种造型又可以通过逆时针旋转变化出4种形状,因此利用三维数组保存28种方块形状,并且编号为kk+3(k=0,17)的四个形状为一组。方块采用4*4的二维数组的数据结构,以此在界面中根据其数组对应值进行方块绘制。在旋转过程进行之前,先判断在该位置能否进行旋转,若能,则将其在三维数组中的编号k,编号为k+(k+1)%4的形状即为旋转结果。 游戏过程中,利用随机函数在一个预览窗体中提前展示形状供用户参考,然后将展示的形状复制到游戏窗体中进行摆放,在游戏窗体中用户就可以使用键盘的方向键来控制方块的运动,然后对每一行进行判断,如果有某行的方块是满的,则消除这行的方块,并且使上面的方块自由下落,其中,方块向下的速度通过调用函数进行控制。同时用户也可以使用向下键加快下落速度,定义一个变量,对消除的行数进行记录,最后得出用户的分数,用条件语句对分数进行判断,达到一定的积分就可以升级到下一个等级。三、 程序流程图.1. 总流程到达底部部到底游戏结束到达底部部结束销行操作生成下一个下坠物将新生的下坠物代替旧的“下一个下坠物“将旧的“下一个下坠物”用作当前 下坠物销行操作游戏结束处理下降一个单位开始3.2. 底部到达的判断与销行的实现:是否堆积方块,判断接触面状态及是否得分2.统计分数判断是否过关关数增加,游戏速度将变快。开始新的一关,继续游戏游戏窗口重绘1.判断行满、处理销行、堆积方块向下移动 将新的下坠物放置到游戏区域中去,这时可能出现马上到达底部的情况,因此需要对它进行判断,如果是到达底部,则进行销行处理,并且修改相应的数据状态。而判断是否已经到达了底部,可以通过当前下坠物件所对应的接触面的方块位置为被占用状态来确定。 统计分数:在消行处理里面有一个专门用来统计消行数的变量,然后根据变量的值决定分数的多少。如果总分数达到过关条件就过关,改变游戏速度,开启新的一关,然后再加载方块。没有达到过关分数或者没有满行,则加载下一个方块继续游戏。是否是否否是是否接上图1点底行判断当前行是否为空判断当前行是否为满判断是否有满行判断移动行方块是否为空当前行向上推动一行将要移动行所有数据移至当前行将当前行的所有数据初始化统计连续几行为满如果有销行,则刷新游戏区域。接上图2点.. 随机方块的产生是否7654321随机抽取一个数随机数一字形田字形l 形j 形t 形s 形z字形型游戏是否结束保存当前方块坐标显示方块于屏幕上游戏结束保存信息关数初始化返回开始界面四、 部分截图5.1初始界面5.2游戏界面 5.3帮助界面5.4排行界面.5. 五、 关键代码.. activitygame.javapackage com.hdu.tetris;import android.app.activity;import android.app.alertdialog;import android.app.dialog;import android.app.alertdialog.builder;import android.content.intent;import android.os.bundle;import android.util.log;import android.view.window;public class activitygame extends activity /总游戏窗口private static final string tag = activitygame;tetrisview mtetrisview = null;/处理游戏进程的类public void oncreate(bundle saved)/创建活动super.oncreate(saved);/启动窗体的拓展特性requestwindowfeature(window.feature_no_title);init();private void init()mtetrisview = new tetrisview(this);intent intent = getintent();/得到当前的intent/获取额外信息等级int level = intent.getintextra(activitymain.level,1);mtetrisview.setlevel(level);/设置等级int flag = intent.getflags();/得到当前intent的标记符if(flag = activitymain.flag_continue_last_game)/当遇到继续上次游戏事件mtetrisview.restoregame();/恢复上次游戏/得到当前声音设置boolean isvoice = intent.getbooleanextra(activitymain.voice,true);mtetrisview.setvoice(isvoice);/设置声音setcontentview(mtetrisview);/设定当前使用的视图public void onpause()/暂停活动mtetrisview.onpause();super.onpause();public void onresume()/执行活动super.onresume();mtetrisview.onresume();public void onstop()/停止活动super.onstop();mtetrisview.savegame();/保存游戏mtetrisview.freeresources();/释放游戏占用的资源6.2. activityhelp.javapackage com.hdu.tetris;import android.app.activity;import android.os.bundle;public class activityhelp extends activity /帮助窗口public void oncreate(bundle saved) /开始super.oncreate(saved);setcontentview(r.layout.help);/初始化帮助窗口的界面6.3. activitymain.javapackage com.hdu.tetris;/ author: hdu/ 2010.3import android.app.activity;import android.content.intent;import android.content.sharedpreferences;import android.os.bundle;import android.view.view;import android.widget.button;import android.widget.checkbox;import android.widget.textview;public class activitymain extends activity public static final int flag_new_game = 0;/开始新游戏public static final int flag_continue_last_game = 1;/继续上一次的游戏public static final string filename = settinginfo; /文件名public static final string level = level;/游戏级别public static final string voice = voice;/游戏声音private int mlevel = 1;/当前游戏等级private button btnewgame = null;/新游戏按钮private button btcontinue = null;/继续游戏按钮private button bthelp = null;/帮助按钮private button btrank = null;/排名按钮private button btpre = null;/等级下降按钮private button btnext = null;/等级上升按钮private button btexit = null;/退出按钮private textview tvlevel = null;/等级编辑框private checkbox cbvoice = null;/声音选项 /* called when the activity is first created. */ override public void oncreate(bundle savedinstancestate) /创建,程序执行时的第一步 super.oncreate(savedinstancestate); setcontentview(r.layout.menu);/设置开始界面的菜单 btnewgame = (button)findviewbyid(r.id.bt_new); /通过id查找新游戏按钮在view子控件 btcontinue = (button)findviewbyid(r.id.bt_continue);/继续游戏按钮控件 bthelp = (button)findviewbyid(r.id.bt_help);/帮助按钮控件 btrank = (button)findviewbyid(r.id.bt_rank);/排名按钮控件 btpre = (button)findviewbyid(r.id.bt_pre);/等级下降按钮控件 btnext = (button)findviewbyid(r.id.bt_next);/等级上升 按钮控件 btexit = (button)findviewbyid(r.id.bt_exit);/退出按钮控件 tvlevel = (textview)findviewbyid(r.id.tv_speed);/等级编辑框控件 cbvoice = (checkbox)findviewbyid(r.id.cb_voice);/声音选项框控件 btnewgame.setonclicklistener(buttonlistener); / 在新游戏按钮上设置点击监听器 btcontinue.setonclicklistener(buttonlistener);/ 在继续游戏按钮上设置点击监听器 bthelp.setonclicklistener(buttonlistener);/ 在帮助按钮上设置点击监听器 btrank.setonclicklistener(buttonlistener);/ 在排名按钮上设置点击监听器 btpre.setonclicklistener(buttonlistener);/ 在等级下降按钮设置点击监听器 btnext.setonclicklistener(buttonlistener);/ 在等级上升按钮上设置点击监听器 btexit.setonclicklistener(buttonlistener);/ 在退出按钮上设置点击监听器 restoresettings();/恢复初始设置 private button.onclicklistener buttonlistener = new button.onclicklistener() /按钮上的点击监听器类overridepublic void onclick(view v) /按钮点击时的处理程序if(v = btnewgame)/当被点击的按钮为新游戏按钮时intent intent = new intent(activitymain.this,activitygame.class);/在两个activity类之间传输数据intent.setflags(flag_new_game);/设置标记符intent.putextra(voice,cbvoice.ischecked();/添加声音的附加信息intent.putextra(level,mlevel);/添加等级的附加信息startactivity(intent);/将此intent类传入相应的activity中return;if(v = btcontinue)/继续游戏按钮处理程序intent intent = new intent(activitymain.this,activitygame.class);/建立intent类intent.setflags(flag_continue_last_game); /设置标记符intent.putextra(voice,cbvoice.ischecked();/添加声音选项的附加信息startactivity(intent);/将此intent类传入相应的activity中return;if(v = bthelp)/帮助按钮的处理程序intent intent = new intent(activitymain.this,activityhelp.class);/建立intent类startactivity(intent);/将此intent类传入相应的activity中return;if(v = btrank)/排名按钮的处理程序intent intent = new intent(activitymain.this,activityrank.class);/建立intent类startactivity(intent);/将此intent类传入相应的activity中return;if(v = btpre)/等级下降按钮的才护理程序btpre.setbackgroundcolor(0xffc0c0c0); /设置背景颜色string s = tvlevel.gettext().tostring();/从等级编辑框中获取信息,传入字符串中int level = integer.parseint(s);/将获取的字符串转化为数字-level;/等级减1level = (level-1+tetrisview.max_level) % tetrisview.max_level;/避免等级益处标准范围,形成循环设置+level;/等级加1,从05 改为标准的16s = string.valueof(level);/将数字转化为字符串,传回tvlevel.settext(s); /等级编辑框的内容显示为新的等级数mlevel = level; /当前等级改为设置的等级btpre.setbackgroundcolor(0x80cfcfcf);/设置背景颜色return;if(v = btnext)/等级上升按钮的处理程序btnext.setbackgroundcolor(0xffc0c0c0); /设置背景颜色string s = tvlevel.gettext().tostring();/从等级编辑框中获取信息,传入字符串中int level = integer.parseint(s);/将获取的字符串转化为数字-level;/等级减1level = (level+1) % tetrisview.max_level;/避免等级益处标准范围,形成循环设置+level;/等级加1,从05 改为标准的16s = string.valueof(level);/将数字转化为字符串,传回tvlevel.settext(s);/等级编辑框的内容显示为新的等级数mlevel = level;/当前等级改为设置的等级btnext.setbackgroundcolor(0x80cfcfcf);/设置背景颜色return;if(v = btexit)/退出按钮的处理程序activitymain.this.finish();/结束该活动 ; private void savesettings()/保存设置方法 /sharedpreferences是轻量级的存储类,主要是保存一些常用的配置 sharedpreferences settings = getsharedpreferences(filename,0);/得到当前设置信息 settings.edit() .putint(level,mlevel) .putboolean(voice,cbvoice.ischecked() .commit();/将各种信息保存如settings中,完成更新设置 private void restoresettings()/恢复初始设置 sharedpreferences settings = getsharedpreferences(filename,0);/得到当前设置信息 mlevel = settings.getint(level,1);/等级恢复为1 boolean hasvoice = settings.getboolean(voice,true); tvlevel.settext(string.valueof(mlevel);/显示初始等级到等级编辑框中 cbvoice.setchecked(hasvoice);/声音设置为开启 public void onstop()/活动停止方法 super.onstop(); savesettings();/保存当前设置 6.4. activityrank.javapackage com.hdu.tetris;import android.app.activity;import android.os.bundle;import android.widget.listview;import android.widget.simpleadapter;import android.widget.simplecursoradapter;public class activityrank extends activity /排名窗口private rankdatabase mdatabase = null;/数据库信息/通过listview控件,可将项目组成带有或不带有列标头的列,并显示伴随的图标和文本。private listview mlistview = null;public void oncreate(bundle saved)/创建该活动super.oncreate(saved);settitle(排行榜);/显示标题setcontentview(r.layout.rank);/设置窗口初始化信息6.5. court.javapackage com.hdu.tetris;import android.content.context;import android.graphics.canvas;import android.graphics.color;import android.graphics.paint;public class court /游戏窗口public final static int court_width = 11; /窗口的宽度public final static int court_height = 23+4;/窗口的高度public final static int block_width = 20;/每个格子的宽度public final static int block_height = 20;/每个格子的高度public final static int above_visible_top = 4;/允许显示的最高点public final static int begin_draw_x = 0;/开始画图的坐标public final static int begin_draw_y = tetrisview.screen_height - court.block_width * court.court_height;private int mcourt = new intcourt_widthcourt_height; /保存窗口信息的数组private context mcontext = null;/context的作用,就是android应用连接service的桥梁。private resourcestore mrs = null; /应用环境中的资源信息public court(context context)mcontext = context;/保存应用环境全局信息mrs = new resourcestore(context);/获取应用环境中的资源信息clearcourt();/清空游戏窗口public void clearcourt()/清除窗口信息int i,j;for(i=0;icourt_width;i+)/遍历窗口所有的点for(j=0;jcourt_height;j+)mcourtij = 0; /将相应数组信息清空public boolean isgameover()/判断游戏是否结束for(int i=0;icourt_width;i+)/其中某一行的方块到达可允许显示的最高点,则游戏结束if(mcourtiabove_visible_top != 0) return true;return false;public boolean isspace(int posx,int posy) /判断该点是否为空if (posx = court_width) /超出行边界线出错return false;if (posy = court_height) /超出列边界线出错return false;if(0 = mcourtposxposy) /对应数组的值为0 ,即为空return true;return false;public boolean availablefortile(int tile,int x,int y) /判断该格子能否放方块for (int i = 0; i 4; i+) /遍历所有点for (int j = 0; j 4; j+) if (tileij != 0) if (!isspace(x + i, y + j) /该点已经有方块占据return false;return true;public void placetile(tileview tile) /放置方块int i,j;for (i = 0; i 4; i+)for (j = 0; j 0)/存在可消除的行eliminaterows(high,linecount);/消除找到的可消除的行return linecount;/返回消除的行数return 0;private void eliminaterows(int highrow,int rowamount)/消除已完成的行上的方块int i,j;for(i = highrow+rowamount-1;i = rowamount;i-)for(j = 0;j court_width;j+)/将待消除行上方的方块整体向下移动,覆盖待消除的行mcourtji = mcourtji-rowamount;private int highestfullrowindex() /查找已完成行的最高行数int result = 0;boolean removeable = true;/标记是否可以消除int i,j;for(i = 0;i court_height;i+)/从上往下遍历removeable = true;for(j = 0;j= 0;i-)/从下往上遍历removeable = true;for(j = 0;jcourt_width & removeable;j+)if(isspace(j,i) )/该点上没有方块result-;removeable = false;/标记该行不可消除if(removeable)/可消除,则找到结果,退出break;return result;private void removesingleline(int lineindex,int time) /消除单行int t,i,j;for(t = 0;t 0; i-)/将待消除行上方的方块全部向下移动一行for (j = 0; j court_width; j+)mcourtji = mcourtji - 1;/上一行覆盖下一行public void paintcourt(canvas canvas)/根据画布信息画游戏窗口/paint 中包含了很多方法对其属性进行设置,绘制时所使用的画笔paint paint = new paint();paint.setalpha(0x60);/ 设置alpha值/对图片添加透明效果canvas.drawbitmap(mrs.getcourtbackground(),0, 0, paint);paint.setalpha(0xee);for (int i = 0; i court.court_width; i+) for (int j = 0; j court.court_height; j+)if (mcourtij != 0) /画出各个小方格canvas.drawbitmap(mrs.getblock(mcourtij - 1), begin_draw_x + i* court.block_width, begin_draw_y + j * court.block_width, paint);public int getmatrix()/得到游戏窗口的数组return mcourt;6.6. drawtool.javapackage com.hdu.tetris;import android.graphics.bitmap;import android.graphics.canvas;public class drawtoolpublic static void paintimage(canvas canvas,bitmap bitmap,int x,int y)canvas.drawbitmap(bitmap,x,y,null);/在指定位置绘制图象6.7. musicplayer.javapackage com.hdu.tetris;import android.content.context;import android.media.mediaplayer;public class musicplayer private mediaplayer mmovevoice = null;/创建移动时的声音类private mediaplayer mbombvoice = null;/创建炸毁时的声音类private boolean mismute = false;public musicplayer(context context)mmovevoice = mediaplayer.create(context,r.raw.move); /指定相应的音乐mbombvoice = mediaplayer.create(context,r.raw.bomb);public void playmovevoice()if(mismute)return;mmovevoice.start();/开始播放音乐public void playbombvoice()if(mismute) return;mbombvoice.start(); /开始播放音乐public void setmute(boolean b) /设置变量的值mismute = b;public void free() /释放mmovevoice.release();/结束该类的生命周期mbombvoice.release();6.8. rankdatabase.javapackage com.hdu.tetris;import android.content.context;import android.database.cursor;import android.database.sqlite.sqlitedatabase;import android.database.sqlite.sqliteopenhelper;import android.database.sqlite.sqlitedatabase.cursorfactory;public class rankdatabase private static final string tag = rankdatabase;/标记private static final string db_name = rank.db;/数据库名private static final string db_table = table1;/数据库表格private static final int db_version = 1;/数据库视图private static final string key_id = _id;/idpublic static final string key_rank = rank;/排名public static final string key_score = score;/成绩public static final string key_name = name;/用户名字private static final string db_create = create table + db_table + (+ key_id + integer primary_key,+ key_rank + integer,+ key_score + integer+ key_name + text);/数据库查询语句private context mcontext = null;/应用环境全局信息private sqlitedatabase mdatabase = null;/用于管理和操作sqlite数据库private databasehelper mhelper = null;/数据库连接字符串public void rankdatabase(context context)mcontext = context;/保存应用环境private static class databasehelper extends sqliteopenhelperpublic databasehelper(context context)/管理相应的数据库super(context, db_name, null, db_version);overridepublic void oncreate(sqlitedatabase db)/创建活动db.execsql(db_create);/执行数据库语句overridepu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 宜昌市社区工作者招聘真题2024
- 中国海洋集团石油有限公司招聘真题2024
- 短视频帧内编码算法研究-全面剖析
- 天津优念高级中学教师招聘真题2024
- 宁波图书馆选聘工作人员真题2024
- 乡村教育课程改革-全面剖析
- 园区环境风险评估与管理-全面剖析
- 2025年软件设计师专业考试模拟试卷:软件测试与缺陷定位试题
- 梅毒患者生活质量-全面剖析
- 2025-2030全球及中国电池供电烟雾探测器行业市场现状供需分析及市场深度研究发展前景及规划可行性分析研究报告
- 中小学国家教育智慧平台
- 生产车间5S管理制度
- 2025交管12123学法减分考试题库和答案
- T-JDFA 02-2024 江苏省转型融资主体认定评价标准
- 2025年开封大学单招职业倾向性测试题库汇编
- 2023学年杭州市余杭区七年级语文下学期期中考试卷附答案解析
- 贵州省县中新学校计划项目2025届高三下学期开学联考语文试题及答案
- 2023-2024年护师类之护师初级基础试题库和答案要点
- 加快形成农业新质生产力
- 演员经纪合同法律风险-洞察分析
- 综合实践项目 制作细胞模型 教学实录-2024-2025学年人教版生物七年级上册
评论
0/150
提交评论