




已阅读5页,还剩28页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
电子科技大学成都学院云计算系实践专周设计报告课 程 名 称: JAVA实践专周 设 计 题 目: 贪吃蛇设计 指导 教师 组: 黄曼绮 陈虹君 学生姓名学号:_ 屈太源 1341310131 _ 云计算系制2014年12月目录目 录实践专周设计报告1第1章贪吃蛇游戏项目概述11.1 问题分析11.2 设计目标11.2.1 基本功能11.2.2 扩展功能21.3 研究思路2第2章总体设计32.1 程序功能结构图32.2 程序的功能分析3第3章详细设计43.1 数据库分析与设计43.2 模块功能43.2.1 列表显示模块43.2.2 音乐播放模块43.2.3 歌词显示模块53.2.4 后台播放模块5第4章系统实现641 播放器加载界面642 音乐列表显示743 歌曲扫描界面944 音乐播放界面1145 歌词滚动显示1846 Appwidget2047 通知栏界面23第5章测试和总结265.1 系统存在的问题及解决方案265.2 收获与心得26参考文献27致谢2829第1章 贪吃蛇游戏项目概述第1章 贪吃蛇游戏项目概述1.1 设计思路贪吃蛇游戏设计与实现,主要分为以下二个模块:游戏主界面模块和游戏控制模块。在此只实现游戏的游戏主界面模块、游戏控制模块。并且只是实现移动速度、暂停、重新开始等功能。游戏主界面模块:游戏的主界面是进入游戏后,能够给玩家第一感官的部分,主要包括游戏图形区域界面、游戏的速度选择更新界面、新生方块的预览、暂停游戏按钮、重新开始游戏按钮。从很大程度上决定了玩家对游戏的兴趣问题,因此,游戏的主界面应该力求美观,爽心悦目。游戏控制模块:这个模块是游戏的中心环节,主要完成控制游戏的开始、暂停、重新开始等功能。为了能够给玩家一个很好的游戏环境,这部分应该做到易懂、易操作。本设计所开发的是基于Java的一个贪吃蛇游戏软件,主要实现游戏的速度控制、游戏的暂停、游戏的退出等功能,分为: 游戏主界面模块、游戏控制模块以二个模块。1.2 程序概述本程序是一个利用Java应用软件制作的贪食蛇小游戏。在游戏过程中,用户通过点击小键盘区的方向键来控制蛇的运行方向;游戏运行过程中,如果想暂停,只需要按F3键即可。重新开始游戏的按键为F2。当蛇没有吃到食物且碰到墙壁或自己的身体时游戏结束。本程序的另一个功能是在程序运行窗口的左上角显示,用户在游戏过程中的移动和长度。1.3 程序流程图单击“F2”按钮, 游戏开始,蛇开始随机。键盘操作: 向上左移右移向下没有吃到食物且蛇碰到边界单击“确定”游戏结束游戏中途欲中断,稍后继续游戏单击“F3暂停游戏”游戏暂停进入游戏画面再次单击开始F3按钮,游戏恢复图1.1 贪吃蛇游戏功能图第2章 总体设计第2章 总体设计2.1 程序设计模块的划分根据游戏需求中游戏所要实现的功能,整个游戏分为二个模块进行具体的设计如图2-1所示。贪吃蛇游戏游戏主界面模块游戏控制模块图2-1 设计总模块游戏控制模块的主要框架如图2-2所示。游戏控制模块游戏的暂停功能游戏的重新开始游戏的退出图2-2 控制模块框架游戏暂停控制:点击“F3”按钮,游戏暂停;再单击,游戏继续。游戏重新开始控制:点击“F2”键后,点击确定,即游戏重新开始。游戏退出控制:点击“F4”键好,点击确定,退出游戏界面。 2.2 类说明此工程共有9个类,2个文件。这9个类的作用如下:Direction类:表示方向的类,其中定义了方向的属性。Foot类:表示食物的类,定义了随机产生食物坐标、画食物等行为。Game类:其中只有一个方法,即程序入口。GameFrame类:表示游戏界面的类,定义了游戏界面的设计和一些行为,如制作菜单、判定游戏结束、记录分数等。GameThread类:表示游戏线程类,定义了继续游戏、暂停游戏、设置速度档等行为。KeyMonittor类:表示键盘按键的适配器类,定义了处理按键事件的行为。Map类:表示地图的类,定义了根据地图模式画出地图的行为。Node类:表示蛇中的一个节点,定义构造节点,画节点等行为。Snake类:表示蛇的类,定义了初始化蛇,蛇移动、加尾、去尾、加头、吃食物、判断蛇死、画蛇等行为。Help.txt:游戏说明文件。Record.txt:记录分数信息的文件。第3章 游戏说明第3章 游戏说明3.1 游戏说明1、 游戏规则说明1) 运行程序出现游戏界面,蛇头自动向右移动。2) 食物随机产生,但不能再障碍物中生成。3) 蛇吃到食物,则蛇的身体变长一节。4) 蛇每吃一个食物加3分。5) 默认每三十分提升一个档次。6) 蛇吃到自己的身体游戏结束。7) 蛇不能穿越自己的身体运行。8) 默认每个速度都走完后更换地图并速度恢复默认值,积分归零。3.2 单及菜单单项说明1. “游戏”菜单。1) 开始/重新开始2) 暂停/继续3) 保存分数4) 查看分数记录5) 退出2. “设置模式”菜单速度选择。6) 地图切换7) 蛇身模式切换8) 游戏模式切换3. “帮助”菜单游戏说明3.3 工具键说明1) 按键盘的“上”、“下”、“左”、“右”键控制蛇头的移动方向。2) 按“F1”键重新开始。3) 按“空格”键暂停/继续。4) 按数字键设计蛇的移动速度,逐渐加快。5) 按“F2”键更换地图。6) 按“F3”键切换普通蛇/彩蛇,默认普通蛇身。7) 按“F4”键更换游戏模式,蛇撞墙死还是从另一端出现,默认撞墙不死。第4章 运行效果41 播放器加载界面主界面运行效果如图4-1所示。图4-1 加载界面效果本图分为程序加载页面,后台实现启动service,读取数据库等操作,为音乐播放做准备。42 音乐列表显示音乐列表显示界面运行效果如图4-2所示。图4-2 音乐列表显示界面运行效果本界面为音乐列表界面,点击音乐即可播放音乐并跳转到音乐播放页面。核心代码如下:public void listload()lv=(ListView) findViewById(R.id.mm_lv1);Cursor c=db.rawQuery(select _id, title , singer from menu, null);startManagingCursor(c);mAdapter=new Listadapter(Musicmenu_do.this, c);lv.setAdapter(mAdapter);ItemClickListener ItemClickListener=new ItemClickListener();lv.setOnItemClickListener(ItemClickListener);if(position!=-1)lv.setSelection(position);mAdapter.setpic(position);mAdapter.notifyDataSetChanged();public class ItemClickListener implements AdapterView.OnItemClickListenerOverridepublic void onItemClick(AdapterView arg0, View arg1, int arg2,long arg3) / TODO 自动生成的方法存根String msg=playmusic;Intent intent1=new Intent(Musicmenu_do.this,Music_service.class);intent1.putExtra(position, arg2);intent1.putExtra(msg, msg);startService(intent1);Intent intent2=new Intent(Musicmenu_do.this,Musicplay_do.class);startActivity(intent2);curriv = (ImageView) arg1.findViewById(R.id.mm_iv);curriv.setBackgroundResource(R.drawable.listplay);43 歌曲扫描界面歌曲扫描界面运行效果如图4-3所示。图4-3 歌曲扫描界面运行效果本界面为音乐扫描界面,扫描完成后点击完成按钮返回列表页面并更新列表。核心代码如下:public class progress implements Runnableint n = 0;int max;public void run() db.delete(menu, null, null);ContentResolver contentresolver=getContentResolver();Cursor c=contentresolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, null);max = c.getCount();max = max0?max:1;if(c=null|!c.moveToFirst()Toast.makeText(Musicmenu_do.this, SD卡中没有歌曲, Toast.LENGTH_SHORT).show();elseint idColumn=c.getColumnIndexOrThrow(BaseColumns._ID);int titleColumn=c.getColumnIndexOrThrow(MediaColumns.TITLE);int albumColumn=c.getColumnIndexOrThrow(AudioColumns.ALBUM);int singerColumn=c.getColumnIndexOrThrow(AudioColumns.ARTIST);int dataColumn=c.getColumnIndexOrThrow(MediaColumns.DATA);int durationColumn=c.getColumnIndexOrThrow(AudioColumns.DURATION);int sizeColumn=c.getColumnIndexOrThrow(MediaColumns.SIZE);do+n;int id=c.getInt(idColumn);String album=c.getString(albumColumn);title1=c.getString(titleColumn);String singer=c.getString(singerColumn);String data=c.getString(dataColumn);int duration=c.getInt(durationColumn);int size=c.getInt(sizeColumn);db.execSQL(insert into menu values(null,?,?,?,?,?,?,?),new Objectid,title1,album,singer,data,duration,size);Message msg = new Message();msg.arg1 = max;msg.arg2 = n;msg.what =1;handler.sendMessage(msg);while(c.moveToNext();Message msg = new Message();msg.arg2 = n;msg.what =2;handler.sendMessage(msg);44 音乐播放界面音乐播放界面运行效果如图4-4所示。图4-4 音乐播放界面运行效果图本界面是音乐播放界面,用户可以点击上面的按钮对音乐播放进行控制,同时两行歌词也显示在这一目录,向右滑动可进入歌词滚动显示页面。核心代码如下: public class ClickListener implements OnClickListenerIntent intent=new Intent(Musicplay_do.this,Music_service.class);Overridepublic void onClick(View v) switch(v.getId()case R.id.mp1_bt_menu:Intent intent0 = new Intent(Musicplay_do.this,Musicmenu_do.class);intent0.putExtra(position, position);Musicplay_do.this.startActivity(intent0);overridePendingTransition(R.anim.in_from_right, R.anim.out_to_left);break;case R.id.mp_bt_play:if (isPause) bt_play.setBackgroundResource(R.drawable.bt_pause_press); msg=play; intent.putExtra(msg, msg); startService(intent); isPause = false;else bt_play.setBackgroundResource(R.drawable.bt_play_press); msg=pause; intent.putExtra(msg, msg); startService(intent); isPause = true; ;break;case R.id.mp_bt_next:bt_play.setBackgroundResource(R.drawable.bt_pause_press); msg=nextmusic;intent.putExtra(msg, msg);startService(intent); isPause = false; break;case R.id.mp_bt_up:bt_play.setBackgroundResource(R.drawable.bt_pause_press); msg=upmusic;intent.putExtra(msg, msg);startService(intent); isPause = false; break;case R.id.mp1_bt_circle:if(circle=1)bt_circle.setBackgroundResource(R.drawable.bt_circle2_press);circle = 2;msg = ; intent.putExtra(circle, circle); intent.putExtra(msg, msg); startService(intent); Toast.makeText(Musicplay_do.this, 顺序播放, Toast.LENGTH_SHORT).show(); else if(circle=2)bt_circle.setBackgroundResource(R.drawable.bt_circle3_press);circle = 3;msg = ; intent.putExtra(circle, circle); intent.putExtra(msg, msg);startService(intent); Toast.makeText(Musicplay_do.this, 随机播放, Toast.LENGTH_SHORT).show(); else if(circle=3)bt_circle.setBackgroundResource(R.drawable.bt_circle4_press);circle = 4;msg = ; intent.putExtra(circle, circle); intent.putExtra(msg, msg);startService(intent); Toast.makeText(Musicplay_do.this, 单曲循环, Toast.LENGTH_SHORT).show(); else if(circle=4)bt_circle.setBackgroundResource(R.drawable.bt_circle1_press);circle = 1;msg = ; intent.putExtra(circle, circle); intent.putExtra(msg, msg);startService(intent); Toast.makeText(Musicplay_do.this, 列表循环, Toast.LENGTH_SHORT).show(); ;break;45 歌词滚动显示歌词滚动显示界面运行效果如图4-5所示。图4-5歌词滚动显示页面运行效果本界面为歌词滚动显示页面,歌词根据音乐播放进度不断更新歌词显示。核心代码如下:protected void onDraw(Canvas canvas) super.onDraw(canvas);if(canvas = null) return;if(lrc!=null)index =lrcIndex(currtime); try setText();canvas.drawText(lrc.get(index).getLrc(), width / 2, height / 2, currentPaint);float tempY = height / 2;/画出本句之前的句子for(int i = index - 1; i = 0; i-) /向上推移tempY = tempY - textHeight;canvas.drawText(lrc.get(i).getLrc(), width / 2, tempY, notCurrentPaint);tempY = height / 2;/画出本句之后的句子for(int i = index + 1; i lrc.size(); i+) /往下推移tempY = tempY + textHeight;canvas.drawText(lrc.get(i).getLrc(), width / 2, tempY, notCurrentPaint); catch (Exception e) canvas.drawText(没有歌词可以显示, width / 2, height / 2, currentPaint);elsecanvas.drawText(没有歌词可以显示, width / 2, height / 2, currentPaint);46 Appwidgetappwidget界面运行效果如图4-6所示。图4-6appwidget运行效果本界面为appwidget,上面有三个按钮用于控制音乐播放,同时可以显示当前播放音乐的歌名及歌手名。核心代码如下:public void onEnabled(Context context) / TODO 自动生成的方法存根RemoteViews remote = new RemoteViews(context.getPackageName(),R.layout.appwidget2);remote.setImageViewResource(R.id.app_bt_play, R.drawable.bt_play_press);remote.setTextViewText(R.id.app_musicname, musicname);remote.setTextViewText(R.id.app_singname, singer);AppWidgetManager appwm = AppWidgetManager.getInstance(context);ComponentName con = new ComponentName(context,Appwidget.class);appwm.updateAppWidget(con, remote);super.onEnabled(context);Overridepublic void onReceive(Context context, Intent intent) / TODO 自动生成的方法存根super.onReceive(context, intent);RemoteViews remote = new RemoteViews(context.getPackageName(),R.layout.appwidget2);if(intent.getAction().equals(update_UI)isPause = intent.getBooleanExtra(isPause, true);musicname = intent.getStringExtra(title);singer = intent.getStringExtra(singer);remote.setTextViewText(R.id.app_musicname, musicname);remote.setTextViewText(R.id.app_singname, singer);if(isPause)remote.setImageViewResource(R.id.app_bt_play, R.drawable.bt_play_press);elseremote.setImageViewResource(R.id.app_bt_play, R.drawable.bt_pause_press);AppWidgetManager appwm = AppWidgetManager.getInstance(context);ComponentName con = new ComponentName(context,Appwidget.class);appwm.updateAppWidget(con, remote);Overridepublic void onUpdate(Context context, AppWidgetManager appWidgetManager,int appWidgetIds) / TODO 自动生成的方法存根super.onUpdate(context, appWidgetManager, appWidgetIds);Intent intent1 = new Intent();Intent intent2 = new Intent();Intent intent3 = new Intent();/Intent intent4 = new Intent();intent1.setAction(actionup);intent2.setAction(actionplay);intent3.setAction(actionnext);/intent4.setAction(com.example.musicplay.Comein_do);PendingIntent pintent1 = PendingIntent.getBroadcast(context, 0, intent1, 0);PendingIntent pintent2 = PendingIntent.getBroadcast(context, 0, intent2, 0);PendingIntent pintent3 = PendingIntent.getBroadcast(context, 0, intent3, 0);/PendingIntent pintent4 = PendingIntent.getActivity(context, 0, intent4, 0);RemoteViews remote = new RemoteViews(context.getPackageName(),R.layout.appwidget2);remote.setTextViewText(R.id.app_musicname, musicname);remote.setTextViewText(R.id.app_singname, singer);remote.setImageViewResource(R.id.app_bt_play, R.drawable.bt_play_press);remote.se
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【正版授权】 ISO 4064-5:2025 EN Water meters for cold potable water and hot water - Part 5: Installation requirements
- 自由搏击活动方案
- 航材考试题及答案
- 广联达钢筋考试题及答案
- 全新劳务用工书面合同
- 心中那份感动抒情文15篇
- 防疫技能考试题及答案
- 法语高考试题及答案
- 企业人力资源优化策略和员工关系协调表
- (正式版)DB15∕T 3383-2024 《呼伦贝尔羊羔羊育肥全混合颗粒日粮配制与饲养技术规程》
- ISO9001:2024版质量手册资料
- 2024年高校红十字应急救护大赛理论考试题库(含答案)
- 餐厅厨房装修改造工程施工组织设计方案
- 2024玻璃钢贮罐拆除解体施工合同
- 2022年中国居民膳食指南
- 2024-2030年中国病理检查市场专题研究及市场前景预测评估报告
- 第3章 即时定位与地图构建技术课件讲解
- 汽车用品采购合同
- P.E.T.父母效能训练
- 《研学旅行课程设计》课件-了解研学旅行概念
- 传统中医针灸技术操作规范
评论
0/150
提交评论