为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

基于android环境的俄罗斯方块_毕业设计

2019-01-22 20页 doc 661KB 14阅读

用户头像 个人认证

不系舟红枫

从教近30年,经验丰富,教学水平较高

举报
基于android环境的俄罗斯方块_毕业设计 1、 绪论 1.1. 项目背景 本题目将设计一个俄罗斯方块(Tetris, 俄文:Тетрис)。它是一款风靡全球的电视游戏机和掌上游戏机游戏,由俄罗斯人阿列克谢·帕基特诺夫发明,故得此名。俄罗斯方块的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。由于上手简单、老少皆宜,从而家喻户晓,风靡世界。 1.2. 开发平台 此项目基于android 环境进行开发,使用的编程工具为eclipse,它是以android语言作为其基本语言的一种可视化编程工具。 Android 是G...
基于android环境的俄罗斯方块_毕业设计
1、 绪论 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生命周期 2、 项目规则及设计思路 1.1. 项目规则 玩家通过点触虚拟键盘,左右控制方块左右移动,按上代表旋转,按下代表加速向下移动,每满一行消除,获得相应积分100,积分每增长2000,等级加1,游戏速度加快 1.2. 实现思路 1.1.1. 界面设计 注:游戏界面中,利用二维数组进行保存,其值为1代表该点有方块占用,值为0代表空白,根据值绘制整张游戏窗口。 1.1.2. 功能设计 从游戏的基本玩法出发,主要算法在于俄罗斯方块的形状和旋转。在游戏设计中,方块采用最基本的7种造型,包括长条型,正方型,正S型,反S型,正7型,反7型,T型,每种造型又可以通过逆时针旋转变化出4种形状,因此利用三维数组保存28种方块形状,并且编号为K~K+3(K=0,1…7)的四个形状为一组。方块采用4*4的二维数组的数据结构,以此在界面中根据其数组对应值进行方块绘制。在旋转过程进行之前,先判断在该位置能否进行旋转,若能,则将其在三维数组中的编号K,编号为K+(K+1)%4的形状即为旋转结果。 游戏过程中,利用随机函数在一个预览窗体中提前展示形状供用户参考,然后将展示的形状复制到游戏窗体中进行摆放,在游戏窗体中用户就可以使用键盘的方向键来控制方块的运动,然后对每一行进行判断,如果有某行的方块是满的,则消除这行的方块,并且使上面的方块自由下落,其中,方块向下的速度通过调用函数进行控制。同时用户也可以使用向下键加快下落速度,定义一个变量,对消除的行数进行记录,最后得出用户的分数,用条件语句对分数进行判断,达到一定的积分就可以升级到下一个等级。 3、 程序流程图 1.1. 总流程 1.2. 底部到达的判断与销行的实现: 将新的下坠物放置到游戏区域中去,这时可能出现马上到达底部的情况,因此需要对它进行判断,如果是到达底部,则进行销行处理,并且修改相应的数据状态。而判断是否已经到达了底部,可以通过当前下坠物件所对应的接触面的方块位置为被占用状态来确定。 统计分数:在消行处理里面有一个专门用来统计消行数的变量,然后根据变量的值决定分数的多少。如果总分数达到过关条件就过关,改变游戏速度,开启新的一关,然后再加载方块。没有达到过关分数或者没有满行,则加载下一个方块继续游戏。 SHAPE \* MERGEFORMAT 1.3. 随机方块的产生 4、 部分截图 5.1初始界面 5.2游戏界面 5.3帮助界面 5.4排行界面 5、 关键代码 1.1. ActivityGame.java package 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(); //释放游戏占用的资源 } } 1.2. ActivityHelp.java package 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); //初始化帮助窗口的界面 } } 1.3. ActivityMain.java package com.HDU.tetris; // Author: HDU // 2010.3 import 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() { //按钮上的点击监听器类 @Override public 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; //等级减1 level = (level-1+TetrisView.MAX_LEVEL) % TetrisView.MAX_LEVEL;//避免等级益处范围,形成循环设置 ++level;//等级加1,从0~5 改为标准的1~6 s = 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;//等级减1 level = (level+1) % TetrisView.MAX_LEVEL; //避免等级益处标准范围,形成循环设置 ++level;//等级加1,从0~5 改为标准的1~6 s = 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(); //保存当前设置 } } 1.4. ActivityRank.java package 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); //设置窗口初始化信息 } } 1.5. Court.java package 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 int[COURT_WIDTH][COURT_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;i= COURT_WIDTH) //超出行边界线出错 return false; if (posY < 0 || posY >= COURT_HEIGHT) //超出列边界线出错 return false; if(0 == mCourt[posX][posY]) //对应数组的值为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 (tile[i][j] != 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 < 4; j++) { if (tile.mTile[i][j] != 0) //没有被占据 {//窗口中该点的位置放置相应的方块 mCourt[tile.getOffsetX() + i][tile.getOffsetY() + j] = tile.getColor(); } } } } public int removeLines() //消除完成了的一整行 { int high = 0; int low = COURT_HEIGHT; // 初始最低点 high = highestFullRowIndex(); //得到可消除的最高行数 low = lowestFullRowIndex(); //得到可消除的最低行数 int lineCount = low - high +1; //可消除的总行数 if(lineCount > 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++) {//将待消除行上方的方块整体向下移动,覆盖待消除的行 mCourt[j][i] = mCourt[j][i-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;j 0; i--)//将待消除行上方的方块全部向下移动一行 { for (j = 0; j < COURT_WIDTH; j++) { mCourt[j][i] = mCourt[j][i - 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 (mCourt[i][j] != 0) {//画出各个小方格 canvas.drawBitmap(mRs.getBlock(mCourt[i][j] - 1), BEGIN_DRAW_X + i * Court.BLOCK_WIDTH, BEGIN_DRAW_Y + j * Court.BLOCK_WIDTH, paint); } } } } public int[][] getMatrix() //得到游戏窗口的数组 { return mCourt; } } 1.6. DrawTool.java package com.HDU.tetris; import android.graphics.Bitmap; import android.graphics.Canvas; public class DrawTool { public static void paintImage(Canvas canvas,Bitmap bitmap,int x,int y) { canvas.drawBitmap(bitmap,x,y,null); //在指定位置绘制图象 } } 1.7. MusicPlayer.java package 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(); } } 1.8. RankDatabase.java package 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"; //id public 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 SQLiteOpenHelper { public DatabaseHelper(Context context)//管理相应的数据库 { super(context, DB_NAME, null, DB_VERSION); } @Override public void onCreate(SQLiteDatabase db) //创建活动 { db.execSQL(DB_CREATE); //执行数据库语句 } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)//数据库升级 { } } public void open() //打开数据库 { mHelper = new DatabaseHelper(mContext);//建立数据库管理 mDatabase = mHelper.getWritableDatabase();//得到可写数据库 } public void close() //关闭数据库 { mHelper.close();//关闭数据库管理 } } 1.9. RefreshHandle.java package com.HDU.tetris; import android.os.Handler; import android.os.Message; import android.util.Log; class RefreshHandler extends Handler { final static int MESSAGE_REFRESH = 0xeeeeeeee; final static int DELAY_MILLIS = 100; //延迟时间 TetrisView mV = null; //游戏视图 boolean mIsPaused = false; //暂停标记 public RefreshHandler(TetrisView v) //构造函数 { super(); mV = v; } public void handleMessage(Message ms) //信息处理 { if( !mIsPaused ) //不是暂停状态 { if(ms.what == MESSAGE_REFRESH) //消息编码更新时 { mV.logic(); // mV.invalidate(); //重绘游戏窗口 } } } public void pause() //暂停活动 { mIsPaused = true; //标记为暂停 } public void resume() //恢复运行 { mIsPaused = false; //改变暂停标记 } } 1.10. ResourceStore.java package com.HDU.tetris; import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; // ResourceStore是一个Singleton public class ResourceStore { private static Bitmap mBackground = null; //背景图片 private static Bitmap[] mBlocks = null; //方块图片 private static Bitmap mMenuBackground = null; //菜单背景图片 private static Bitmap mMenu = null; //菜单图片 private static Bitmap mSpeed = null; //速度 private static Bitmap mLine = null; // private static Bitmap mScore = null; //分数 private static Bitmap mGameover = null; //游戏结束 private Context mContext = null; //应用环境全局信息 private Resources mR = null; //资源 public ResourceStore(Context context) { mContext = context; mR = mContext.getResources();//得到资源 //创建各个图片 if(mBackground == null) mBackground = createImage(mR.getDrawable(R.drawable.courtbg), Court.COURT_WIDTH*Court.BLOCK_WIDTH, TetrisView.SCREEN_HEIGHT ); if(mMenuBackground == null) mMenuBackground = createImage(mR.getDrawable(R.drawable.menubg),TetrisView.SCREEN_WIDTH,TetrisView.SCREEN_HEIGHT ); if(mMenu == null) mMenu = createImage(mR.getDrawable(R.drawable.menu),200,100 ); if(mSpeed == null) mSpeed = createImage(mR.getDrawable(R.drawable.speed),200,100); if(mLine == null) mLine = createImage(mR.getDrawable(R.drawable.line),200,100); if(mScore == null) mScore = createImage(mR.getDrawable(R.drawable.score),200,100); if(mGameover == null) mGameover = createImage(mR.getDrawable(R.drawable.gameover),200,100); if(mBlocks == null) //装载方块图片 { mBlocks = new Bitmap[8]; for(int i = 0;i<8;i++) { mBlocks[i] = createImage(mR.getDrawable(R.drawable.block0+i),Court.BLOCK_WIDTH,Court.BLOCK_WIDTH); } } } public Bitmap getCourtBackground() //获取游戏场地背景图片信息 { return mBackground; //返回对应图片ID } public Bitmap getMenuBackground() //获取菜单背景图片信息 { return mMenuBackground; } public Bitmap getMenu() //获取菜单图片信息 { return mMenu; } public Bitmap getBlock(int index) //获取方块图片信息 { return mBlocks[index]; } public Bitmap getGameover() //获取游戏结束图片信息 { return mGameover; } public void loadImage(int index,Bitmap bitmap) //根据索引值装载图片 { //获取资源中的图片 bitmap = ( (BitmapDrawable)mContext.getResources().getDrawable(index) ).getBitmap(); } public static Bitmap createImage(Drawable tile, int w, int h) { //根据参数创建新位图 Bitmap bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); // 以bitmap对象创建一个画布,则将内容都绘制在bitmap上 Canvas canvas = new Canvas(bitmap); tile.setBounds(0, 0, w, h); //对可画的对象设置大小 tile.draw(canvas); //将可画对象显示到画布上 return bitmap; } } 1.11. TerisView.java package com.HDU.tetris; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.Properties; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.os.Message; import android.util.AttributeSet; import android.util.Log; import android.view.KeyEvent; import android.view.View; public class TetrisView extends View implements Runnable{ final static int SCREEN_WIDTH = 320;//设置游戏界面的宽为320像素 final static int SCREEN_HEIGHT = 455;//设置游戏界面的高为455像素 final int STATE_MENU = 0;//设置菜单的状态值为0 final int STATE_PLAY = 1;//设置开始游戏的状态值为1 final int STATE_PAUSE = 2;//设置暂停的状态值为2 final int STATE_OVER = 3;//设置游戏结束的状态值为3 public static final int MAX_LEVEL = 6;//最大游戏等级为6 //初始化两个字符串 public static final String TAG = "TetrisView";// public static final String DATAFILE = "save.dt";//文件名 int mGamestate = STATE_PLAY;//设置当前的游戏状态为开始状态 int mScore = 0;//初始化得分为0 int mSpeed = 1;//初始化速度等级为1 int mDeLine = 0;//初始化被消去的行数为0 boolean mIsCombo = false; //初始化:是否连击:否 boolean mIsPaused = false;//初始化:是否暂停:否 boolean mIsVoice = true;//初始化:是否打开声音:是 long mMoveDelay = 600;//移动延时为600ms long mLastMove = 0;//最近移动时间 private Context mContext = null;//应用环境的全局信息初始化为null private Paint mPaint = new Paint();//创建一个Paint的对象mPaint RefreshHandler mRefreshHandler = null;//刷新线程 TileView mCurrentTile = null;//当前的方块,置空 TileView mNextTile = null;//下一个方块,置空 Court mCourt = null;//置游戏窗口为空 ResourceStore mResourceStore = null;//初始化资源 MusicPlayer mMPlayer = null;//置响应声音为空 public TetrisView(Context context) { super(context); init(context);//调用protected void init(Context context } protected void init(Context context)//初始化 { //相应的变量赋值 mContext = context; mCurrentTile = new TileView(context); Log.i("tetris","mCurrentTile builed");//记录日志文件 mNextTile = new TileView(context); mCourt = new Court(context); mRefreshHandler = new RefreshHandler(this); mResourceStore = new ResourceStore(context); mMPlayer = new MusicPlayer(context); setLevel(1);//设置当前的等级为1 mPaint.setAntiAlias(true);//设置画笔的锯齿效果 mPaint.setColor(Color.RED);//设置画笔的颜色 setFocusable(true);//可获取焦点 new Thread(this).start();//执行当前线程 } public void logic() { switch(mGamestate) { case STATE_MENU://当游戏的当前状态为STATE_MENU // mGamestate = STATE_PLAY;//将游戏的当前状态转为STATE_PLAY break; case STATE_PLAY://当游戏的当前状态为STATE_PLAY //startGame(); playGame();//调用开始游戏函数 break; case STATE_PAUSE://当游戏的当前状态为STATE_PAUSE,不改变游戏状态 break; case STATE_OVER://当游戏的当前状态为STATE_OVER,不改变游戏状态 break; default:; } } public void startGame()//开始游戏 { mGamestate = STATE_PLAY;//将当前的游戏状态改为STATE_PLAY状态 mCourt.clearCourt();//清空游戏窗口 mCurrentTile = new TileView(mContext);//将当前的方块信息保存在mCurrentTile变量中 mNextTile = new TileView(mContext);//将下一块方块信息保存在mNextTile变量中 //初始化相关信息 setLevel(1); mScore = 0; mDeLine = 0; mIsPaused = false; mIsCombo = false; playGame(); } public void playGame()//进入玩游戏 { long now = System.currentTimeMillis();//以毫秒保存当前的系统时间 if(now - mLastMove > mMoveDelay)//当前时间与最近移动时间间隔大于mMoveDelay时,移动方块的位置 { if(mIsPaused)//若当前游戏状态为暂停,直接返回 { return; } if(mIsCombo)//方块到达最低点 { mCourt.placeTile(mCurrentTile);//在游戏窗体中显示当前的方块 mMPlayer.playMoveVoice();//播放方块移动的声音 if(mCourt.isGameOver() )//若游戏结束 { mGamestate = STATE_OVER; return; } int line = mCourt.removeLines();//将一次消去的行数保存在line变量中 if(line > 0 )//若有消去,播放响应声音 { mMPlayer.playBombVoice(); } mDeLine += line;//更改总的消去的行数 countScore(line);//积分 mCurrentTile = mNextTile;//将下一个方块设置为当前的方块 mNextTile = new TileView(mContext);//获取下一个方块 mIsCombo = false;//置方块到达最低点为false } moveDown();//方块向下运行 mLastMove = now;//更新最近移动时间 } } private void countScore(int line)//积分 { switch(line) {//根据一次消去的行数累加相应的分数 case 1: mScore += 100;break; case 2: mScore += 300;break; case 3: mScore += 600;break; case 4: mScore += 1000;break; default: ; } //根据当前的得分情况,相应的更改游戏等级 if(mScore >= 2000 && mScore <4000) { setLevel(2); } else if(mScore >= 4000 && mScore < 6000) { setLevel(3); } else if(mScore >= 6000 && mScore < 8000) { setLevel(4); } else if(mScore >= 8000 && mScore < 10000) { setLevel(5); } else if(mScore >= 10000) { setLevel(6); } } protected void onDraw(Canvas canvas)//根据游戏不同的状态绘制出游戏界面 { switch(mGamestate) { case STATE_MENU: paintMenu(canvas);//绘制出菜单页 break; case STATE_PLAY: paintGame(canvas);//绘制出游戏游戏开始的界面 break; case STATE_PAUSE: paintPause(canvas);//绘制出暂停游戏页 break; case STATE_OVER: paintOver(canvas);//绘制出游戏结束的界面 break; default:; } } public boolean isGameOver()//判断游戏是否结束 { return mCourt.isGameOver(); } public boolean onKeyDown(int keyCode,KeyEvent event)//对用户按键作出反应 { switch(keyCode) { case KeyEvent.KEYCODE_DPAD_UP://当按下“↑” if(mGamestate == STATE_PLAY) {//若当前状态为STATE_PLAY,且方块没有到达最低时,翻转方块 if(!mIsPaused) { rotate(); mMPlayer.playMoveVoice();//播放方块移动的响应声音 } } //如果当前的游戏状态为STATE_PAUSE或STATE_MENU,不做出反应 else if(mGamestate == STATE_PAUSE) { } else if(mGamestate == STATE_MENU) { } break; case KeyEvent.KEYCODE_DPAD_DOWN://当按下“↓” if(mGamestate == STATE_PLAY) {//若当前状态为STATE_PLAY,且方块没有到达最低时 if(!mIsPaused) { moveDown();//向下移动 mMPlayer.playMoveVoice();//播放方块移动的响应声音 } } //如果当前的游戏状态为STATE_PAUSE或STATE_MENU,不做出反应 else if(mGamestate == STATE_PAUSE) { } else if(mGamestate == STATE_MENU) { } break; case KeyEvent.KEYCODE_DPAD_LEFT://当按下“←” if(mGamestate == STATE_PLAY) {//若当前状态为STATE_PLAY,且方块没有到达最低时 if(!mIsPaused) { moveLeft();//向左移动 mMPlayer.playMoveVoice();//播放方块移动的响应声音 } } //如果当前的游戏状态为STATE_PAUSE或STATE_MENU,不做出反应 else if(mGamestate == STATE_PAUSE) { } else if(mGamestate == STATE_MENU) { } break; case KeyEvent.KEYCODE_DPAD_RIGHT://当按下“→” if(mGamestate == STATE_PLAY) {//若当前状态为STATE_PLAY,且方块没有到达最低时 if(!mIsPaused) { moveRight();//向右移动 mMPlayer.playMoveVoice();//播放方块移动的响应声音 } } //如果当前的游戏状态为STATE_PAUSE或STATE_MENU,不做出反应 else if(mGamestate == STATE_PAUSE) { } else if(mGamestate == STATE_MENU) { } break; case KeyEvent.KEYCODE_ENTER: ;//按下回车键,不做出反应 case KeyEvent.KEYCODE_DPAD_CENTER://按下中间确定键 if(mGamestate == STATE_PLAY) {//若当前状态为STATE_PLAY,且方块没有到达最低时 if(!mIsPaused) { fastDrop();//快速向下移动 mMPlayer.playMoveVoice();//播放方块移动的响应声音 } } //如果当前的游戏状态为STATE_PAUSE或STATE_MENU,不做出反应 else if(mGamestate == STATE_PAUSE) { } else if(mGamestate == STATE_MENU) { } break; // case KeyEvent.KEYCODE_S://若按下S键 if(mGamestate == STATE_PLAY) {//若当前的游戏状态为STATE_PLAY,置暂停状态为true mIsPaused = true; } else if(mGamestate == STATE_PAUSE) {//若当前的游戏状态已经为暂停,置暂停状态为false mIsPaused = false; } else if(mGamestate == STATE_MENU) {//若当前的游戏状态为STATE_MENU,不做出反应 } break; case KeyEvent.KEYCODE_SPACE://若按下空格键 mIsPaused = !mIsPaused;//更改暂停状态标志 if(mIsPaused) {//若为暂停 mRefreshHandler.pause();//中断线程 } else { mRefreshHandler.resume();//否则继续执行线程 } break; default: ; } return super.onKeyDown(keyCode,event);////继续执行父类的其他点击事件 } private void rotate()//翻转方块 { if(!mIsCombo)//若没有到达最低点 mCurrentTile.rotateOnCourt(mCourt);//调用TileView的相应方法 } private void moveDown()//方块向下运动 { if(!mIsCombo)//若没有到达最低点 { if( ! mCurrentTile.moveDownOnCourt(mCourt) )//调用TileView的相应方法 mIsCombo = true;//到达最低点,则mIsCombo置为true } } private void moveLeft()//方块向左运动 { if(!mIsCombo)//若没有到达最低点 { mCurrentTile.moveLeftOnCourt(mCourt);//调用TileView的相应方法 } } private void moveRight()//方块向右运动 { if(!mIsCombo)//若没有到达最低点 { mCurrentTile.moveRightOnCourt(mCourt);//调用TileView的相应方法 } } private void fastDrop()//方块快速向下运动 { if(!mIsCombo)//若没有到达最低点 { mCurrentTile.fastDropOnCourt(mCourt);//调用TileView的相应方法 mIsCombo = true;//到达最低点,则mIsCombo置为true } } private void paintMenu(Canvas canvas)//画出菜单界面 { DrawTool.paintImage(canvas,mResourceStore.getMenuBackground(),0,0);//画出背景 DrawTool.paintImage(canvas,mResourceStore.getMenu(),0,SCREEN_HEIGHT/2 - mResourceStore.getMenu().getHeight()/2 );//画出菜单 } private void paintGame(Canvas canvas)//画出游戏界面 { //画出游戏窗口,当前的方块,下一个方块,分数等等 mCourt.paintCourt(canvas); mCurrentTile.paintTile(canvas); mPaint.setTextSize(20); paintNextTile(canvas); paintSpeed(canvas); paintScore(canvas); paintDeLine(canvas); } private void paintNextTile(Canvas canvas)//画出下一个方块 { int i,j; //在4*4的方格里绘制出方块的形状 for(i = 0;i<4;i++) { for(j = 0;j<4;j++) { if(mNextTile.mTile[i][j] != 0) { DrawTool.paintImage( canvas,mResourceStore.getBlock(mNextTile.getColor()-1), (int)(Court.BEGIN_DRAW_X+getBlockDistance(Court.COURT_WIDTH) + getBlockDistance((float) (i+0.5)) ), (int)( getBlockDistance((float)(j+0.5) ) ) ); } } } } private void paintSpeed(Canvas canvas)//显示当前速度 { mPaint.setColor(Color.BLUE); canvas.drawText("等级:",getBlockDistance(Court.COURT_WIDTH)+getRightMarginToCourt(), getBlockDistance(9),mPaint); mPaint.setColor(Color.RED); canvas.drawText(String.valueOf(mSpeed),getBlockDistance(Court.COURT_WIDTH)+ 2*getRightMarginToCourt(), getBlockDistance(11),mPaint); } private void paintScore(Canvas canvas)//显示当前得分 { mPaint.setColor(Color.BLUE); canvas.drawText("得分:",getBlockDistance(Court.COURT_WIDTH)+getRightMarginToCourt(), getBlockDistance(13),mPaint); mPaint.setColor(Color.RED); canvas.drawText(String.valueOf(mScore),getBlockDistance(Court.COURT_WIDTH)+ 2*getRightMarginToCourt(), getBlockDistance(15),mPaint); } private void paintDeLine(Canvas canvas)//显示当前消去的行数 { mPaint.setColor(Color.BLUE); canvas.drawText("消去行数:",getBlockDistance(Court.COURT_WIDTH)+getRightMarginToCourt(), getBlockDistance(17),mPaint); mPaint.setColor(Color.RED); canvas.drawText(String.valueOf(mDeLine),getBlockDistance(Court.COURT_WIDTH)+2*getRightMarginToCourt(), getBlockDistance(19),mPaint); } private float getBlockDistance(float blockNum) { return blockNum * Court.BLOCK_WIDTH; } private float getRightMarginToCourt()//返回右边界与游戏窗体的边界 { return (float)10.0; } private void paintPause(Canvas canvas) { } private void paintOver(Canvas canvas)//绘制出游戏结束的界面 { paintGame(canvas); Paint paint = new Paint(); paint.setTextSize(40);//设置字体大小 paint.setAntiAlias(true);//抗锯齿 paint.setARGB(0xe0,0xff,0x00,0x00);//设置画笔的颜色和透明度 canvas.drawText("Game Over",getBlockDistance(1),getBlockDistance(Court.COURT_HEIGHT/2-2),paint);//输出"Game Over" //DrawTool.paintImage(canvas,mResourceStore.getGameover(),0,SCREEN_HEIGHT/2 - mResourceStore.getGameover().getHeight()/2 ); } public void run() { // TODO Auto-generated method stub while(!Thread.currentThread().isInterrupted() ) { Message ms = new Message(); ms.what = RefreshHandler.MESSAGE_REFRESH; this.mRefreshHandler.sendMessage(ms); try { Thread.sleep(/*RefreshHandler.DELAY_MILLIS*/mMoveDelay);//延时 } catch(InterruptedException e)//捕捉错误 { Thread.currentThread().interrupt(); } } } public void setLevel(int level)//设置游戏等级 { //根据游戏的等级设置方块移动的速度 mSpeed = level; mMoveDelay = (long) (600*(1.0 - (double)mSpeed / 7.0 ) ); } public void setVoice(boolean isVoice)//设置声音 { mIsVoice = isVoice; mMPlayer.setMute(!mIsVoice); } public void restoreGame()//恢复游戏 { Properties pro = new Properties();//创建一个文本文件对象 try { FileInputStream in = mContext.openFileInput(DATAFILE);//读取数据库文件,若不存在则创建 pro.load(in);//载入信息到pro in.close();//关闭in } catch(IOException e)//否则将错误信息写入日志文件 { Log.i(TAG,"file open failed in restoreGame()"); return; } //将pro中的信息保存在各个变量中 mGamestate = Integer.valueOf(pro.get("gamestate").toString() ); mSpeed = Integer.valueOf(pro.get("speed").toString() ); setLevel(mSpeed); mScore = Integer.valueOf(pro.get("score").toString() ); mDeLine = Integer.valueOf(pro.get("deLine").toString() ); mIsVoice = Boolean.valueOf(pro.get("isVoice").toString() ); mIsCombo = Boolean.valueOf(pro.get("isCombo").toString() ); mIsPaused = Boolean.valueOf(pro.get("isPaused").toString() ); restoreCourt(pro);//恢复游戏窗口 restoreTile(pro,mCurrentTile);//恢复当前的方块 restoreTile(pro,mNextTile);//恢复下一个方块 } private void restoreCourt(Properties pro)//恢复游戏窗口 { int[][] matrix = mCourt.getMatrix();//创建游戏窗口矩阵 int i,j; for(i = 0;i 0) {//数组中每4个为一种图形 tempShape--; } else { tempShape += 3; //循环 } for (int i = 0; i < 4; i++) { //复制出新方块的形状 for (int j = 0; j < 4; j++) { tempTile[i][j] = TileStore.store[tempShape][i][j]; } } tempX = mOffsetX; tempY = mOffsetY; boolean canTurn = false; //表示是否能旋转 //判断该格子能否放方块,若能,则标记可以 if( court.availableForTile(tempTile,tempX,tempY) )//当前点 { canTurn = true; } else if(court.availableForTile(tempTile,tempX-1,tempY) )//上方第一个点 { canTurn = true; tempX--; } else if(court.availableForTile(tempTile,tempX-2,tempY) )//上方第二个点 { canTurn =true; tempX -=2; } else if(court.availableForTile(tempTile,tempX+1,tempY) )//下方第一个点 { canTurn = true; tempX++; } else if(court.availableForTile(tempTile,tempX+2,tempY) )//下方第二个点 { canTurn = true; tempX += 2; } if (canTurn) { //若可以旋转 mShape = tempShape; mOffsetX = tempX; mOffsetY = tempY; for (int i = 0; i < 4; i++) { //复制出新方块的形状 for (int j = 0; j < 4; j++) { mTile[i][j] = tempTile[i][j];//拷贝数组 } } return true; } return false; } public boolean moveRightOnCourt(Court court) {//方块右移 Log.i("tetris","here is moveRightOnCourt"); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { if (mTile[i][j] != 0) {//图形中有小方块的点 if ( !court.isSpace(mOffsetX + i + 1, mOffsetY + j) ) {//若右边的空间已有方块 return false; //不能移动 } } } } ++mOffsetX; //当前方块的横坐标加1 return true; } public boolean moveLeftOnCourt(Court court) {//方块左移 int i,j; for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { if (mTile[i][j] != 0) { //图形中有小方块的点 if (!court.isSpace(mOffsetX + i - 1, mOffsetY + j)) {//若左边的空间已有方块 return false; //不能移动 } } } } mOffsetX--;//当前方块的横坐标减 1 return true; } public boolean moveDownOnCourt(Court court) {//方块下移 int i,j; for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { if (mTile[i][j] != 0) { //图形中有小方块的点 if (!court.isSpace(mOffsetX + i, mOffsetY + j + 1)//若下方的空间已有方块 || isUnderBaseline(mOffsetY+j+1) ) {//或者遇到底边 return false; //不能下移 } } } } mOffsetY++; //当前方块的纵坐标减加1 return true; } public boolean fastDropOnCourt(Court court) { // 快速下移 int i,j,k; int step = Court.COURT_HEIGHT; //游戏窗口最大距离 for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { if (mTile[i][j] != 0) {//图形中有小方块的点 for (k = mOffsetY + j; k < Court.COURT_HEIGHT; k++) { if (!court.isSpace(mOffsetX + i, k + 1) || isUnderBaseline(k+1) ) { if (step > k - mOffsetY - j) { step = k - mOffsetY - j;//将方块持续下降到最低位置 } } } } } } mOffsetY += step; if (step > 0) return true; return false; } private boolean isUnderBaseline(int posY ) // 是否超过游戏窗口的底边 { if(posY >= Court.COURT_HEIGHT) //方块的纵坐标〉底边的坐标 return true; return false; } public int getOffsetX() //获取方块横坐标 { return mOffsetX; } public void setOffsetX(int offsetX) //设置方块的横坐标 { mOffsetX = offsetX; } public int getOffsetY() //获取方块纵坐标 { return mOffsetY; } public void setOffsetY(int offsetY) //设置方块的纵坐标 { mOffsetY = offsetY; } public int getColor() //获取方块颜色 { return mColor; } public void paintTile(Canvas canvas) //画方块 { ResourceStore rs = new ResourceStore(mContext); Paint paint = new Paint(); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { if (mTile[i][j] != 0) //图形中有小方块的点 { canvas.drawBitmap(mRs.getBlock(mColor -1), Court.BEGIN_DRAW_X + (i + mOffsetX) * Court.BLOCK_WIDTH, Court.BEGIN_DRAW_Y + (j + mOffsetY) * Court.BLOCK_WIDTH, paint); } } } } public int[][] getMatrix() //获取方块对应的数组 { return mTile; } public int getShape() { //获取方块的形状 // TODO Auto-generated method stub return mShape; } public void setColor(int color) //设置方块的颜色 { mColor = color; } public void setShape(int shape) //设置方块的形状 { mShape = shape; } } 6、 总结 本次的短学期时间有限,加上之前对于android系统方面的知识学习的很少,所以这次的题目的难度对于我们来说还是挺大的。在环境配置方面就遇到了诸多的问题,看代码写代码也进行得很困难,但通过查资料、与同学交流,初步了解了基于android环境的编程,最终在规定时间内完成了任务。 本次实验是基于android环境的俄罗斯方块游戏的设计。对俄罗斯方块游戏本身其实非常熟悉,这是一个非常经典的益智类游戏。之前对于用其它语言编写的该游戏有过涉猎,比较容易上手。 制作的整个过程比较艰辛,期间好多不懂的,都得从头开始学起。但整个过程下来,确确实实对自身能力的提高是非常有帮助的。不仅加强了我们的编码能力,同时也锻炼了我们的学习新知识的能力。虽然设计的不是很完美,但通过这次的能力拓展训练让我们受益匪浅。 毕业设计(论文)原创性声明和使用说明 原创性声明 本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得 及其它教育机构的学位或学历而使用过的材料。对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。 作 者 签 名:       日  期:        ​​​​​​​​​​​​ 指导教师签名:        日  期:        使用授权说明 本人完全了解 大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。 作者签名:        日  期:        ​​​​​​​​​​​​ 学位论文原创性声明 本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。本人完全意识到本声明的法律后果由本人承担。 作者签名: 日期: 年 月 日 学位论文版权使用授权书 本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。本人授权      大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。 涉密论文按学校规定处理。 作者签名: 日期: 年 月 日 导师签名: 日期: 年 月 日 指导教师评阅书 指导教师评价: 一、撰写(设计)过程 1、学生在论文(设计)过程中的治学态度、工作精神 □ 优 □ 良 □ 中 □ 及格 □ 不及格 2、学生掌握专业知识、技能的扎实程度 □ 优 □ 良 □ 中 □ 及格 □ 不及格 3、学生综合运用所学知识和专业技能分析和解决问题的能力 □ 优 □ 良 □ 中 □ 及格 □ 不及格 4、研究方法的科学性;技术线路的可行性;设计的合理性 □ 优 □ 良 □ 中 □ 及格 □ 不及格 5、完成毕业论文(设计)期间的出勤情况 □ 优 □ 良 □ 中 □ 及格 □ 不及格 二、论文(设计)质量 1、论文(设计)的整体结构是否符合撰写规范? □ 优 □ 良 □ 中 □ 及格 □ 不及格 2、是否完成指定的论文(设计)任务(包括装订及附件)? □ 优 □ 良 □ 中 □ 及格 □ 不及格 三、论文(设计)水平 1、论文(设计)的理论意义或对解决实际问题的指导意义 □ 优 □ 良 □ 中 □ 及格 □ 不及格 2、论文的观念是否有新意?设计是否有创意? □ 优 □ 良 □ 中 □ 及格 □ 不及格 3、论文(设计)所体现的整体水平 □ 优 □ 良 □ 中 □ 及格 □ 不及格 建议成绩:□ 优 □ 良 □ 中 □ 及格 □ 不及格 (在所选等级前的□内画“√”) 指导教师: (签名) 单位: (盖章) 年 月 日 评阅教师评阅书 评阅教师评价: 一、论文(设计)质量 1、论文(设计)的整体结构是否符合撰写规范? □ 优 □ 良 □ 中 □ 及格 □ 不及格 2、是否完成指定的论文(设计)任务(包括装订及附件)? □ 优 □ 良 □ 中 □ 及格 □ 不及格 二、论文(设计)水平 1、论文(设计)的理论意义或对解决实际问题的指导意义 □ 优 □ 良 □ 中 □ 及格 □ 不及格 2、论文的观念是否有新意?设计是否有创意? □ 优 □ 良 □ 中 □ 及格 □ 不及格 3、论文(设计说明书)所体现的整体水平 □ 优 □ 良 □ 中 □ 及格 □ 不及格 建议成绩:□ 优 □ 良 □ 中 □ 及格 □ 不及格 (在所选等级前的□内画“√”) 评阅教师: (签名) 单位: (盖章) 年 月 日 教研室(或答辩小组)及教学系意见 教研室(或答辩小组)评价: 一、答辩过程 1、毕业论文(设计)的基本要点和见解的叙述情况 □ 优 □ 良 □ 中 □ 及格 □ 不及格 2、对答辩问题的反应、理解、表达情况 □ 优 □ 良 □ 中 □ 及格 □ 不及格 3、学生答辩过程中的精神状态 □ 优 □ 良 □ 中 □ 及格 □ 不及格 二、论文(设计)质量 1、论文(设计)的整体结构是否符合撰写规范? □ 优 □ 良 □ 中 □ 及格 □ 不及格 2、是否完成指定的论文(设计)任务(包括装订及附件)? □ 优 □ 良 □ 中 □ 及格 □ 不及格 三、论文(设计)水平 1、论文(设计)的理论意义或对解决实际问题的指导意义 □ 优 □ 良 □ 中 □ 及格 □ 不及格 2、论文的观念是否有新意?设计是否有创意? □ 优 □ 良 □ 中 □ 及格 □ 不及格 3、论文(设计说明书)所体现的整体水平 □ 优 □ 良 □ 中 □ 及格 □ 不及格 评定成绩:□ 优 □ 良 □ 中 □ 及格 □ 不及格 (在所选等级前的□内画“√”) 教研室主任(或答辩小组组长): (签名) 年 月 日 教学系意见: 系主任: (签名) 年 月 日 学位论文原创性声明 本人郑重声明:所呈交的学位论文,是本人在导师的指导下进行的研究工作所取得的成果。尽我所知,除文中已经特别注明引用的内容和致谢的地方外,本论文不包含任何其他个人或集体已经发表或撰写过的研究成果。对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式注明并表示感谢。本人完全意识到本声明的法律结果由本人承担。 学位论文作者(本人签名): 年 月 日 学位论文出版授权书 本人及导师完全同意《中国博士学位论文全文数据库出版章程》、《中国优秀硕士学位论文全文数据库出版章程》(以下简称“章程”),愿意将本人的学位论文提交“中国学术期刊(光盘版)电子杂志社”在《中国博士学位论文全文数据库》、《中国优秀硕士学位论文全文数据库》中全文发表和以电子、网络形式公开出版,并同意编入CNKI《中国知识资源总库》,在《中国博硕士学位论文评价数据库》中使用和在互联网上传播,同意按“章程”规定享受相关权益。 论文密级: □公开 □保密(___年__月至__年__月)(保密的学位论文在解密后应遵守此协议) 作者签名:_______ 导师签名:_______ _______年_____月_____日 _______年_____月_____日 独 创 声 明 本人郑重声明:所呈交的毕业设计(论文),是本人在指导老师的指导下,独立进行研究工作所取得的成果,成果不存在知识产权争议。尽我所知,除文中已经注明引用的内容外,本设计(论文)不含任何其他个人或集体已经发表或撰写过的作品成果。对本文的研究做出重要贡献的个人和集体均已在文中以明确方式标明。 本声明的法律后果由本人承担。   作者签名: 二〇一〇年九月二十日   毕业设计(论文)使用授权声明 本人完全了解滨州学院关于收集、保存、使用毕业设计(论文)的规定。 本人愿意按照学校要求提交学位论文的印刷本和电子版,同意学校保存学位论文的印刷本和电子版,或采用影印、数字化或其它复制手段保存设计(论文);同意学校在不以营利为目的的前提下,建立目录检索与阅览服务系统,公布设计(论文)的部分或全部内容,允许他人依法合理使用。 (保密论文在解密后遵守此规定)   作者签名: 二〇一〇年九月二十日 致 谢 时间飞逝,大学的学习生活很快就要过去,在这四年的学习生活中,收获了很多,而这些成绩的取得是和一直关心帮助我的人分不开的。 首先非常感谢学校开设这个课题,为本人日后从事计算机方面的工作提供了经验,奠定了基础。本次毕业设计大概持续了半年,现在终于到结尾了。本次毕业设计是对我大学四年学习下来最好的检验。经过这次毕业设计,我的能力有了很大的提高,比如操作能力、分析问题的能力、合作精神、严谨的工作作风等方方面面都有很大的进步。这期间凝聚了很多人的心血,在此我表示由衷的感谢。没有他们的帮助,我将无法顺利完成这次设计。 首先,我要特别感谢我的知道郭谦功老师对我的悉心指导,在我的论文书写及设计过程中给了我大量的帮助和指导,为我理清了设计思路和操作方法,并对我所做的课题提出了有效的改进方案。郭谦功老师渊博的知识、严谨的作风和诲人不倦的态度给我留下了深刻的印象。从他身上,我学到了许多能受益终生的东西。再次对周巍老师表示衷心的感谢。 其次,我要感谢大学四年中所有的任课老师和辅导员在学习期间对我的严格要求,感谢他们对我学习上和生活上的帮助,使我了解了许多专业知识和为人的道理,能够在今后的生活道路上有继续奋斗的力量。 另外,我还要感谢大学四年和我一起走过的同学朋友对我的关心与支持,与他们一起学习、生活,让我在大学期间生活的很充实,给我留下了很多难忘的回忆。 最后,我要感谢我的父母对我的关系和理解,如果没有他们在我的学习生涯中的无私奉献和默默支持,我将无法顺利完成今天的学业。 四年的大学生活就快走入尾声,我们的校园生活就要划上句号,心中是无尽的难舍与眷恋。从这里走出,对我的人生来说,将是踏上一个新的征程,要把所学的知识应用到实际工作中去。 回首四年,取得了些许成绩,生活中有快乐也有艰辛。感谢老师四年来对我孜孜不倦的教诲,对我成长的关心和爱护。 学友情深,情同兄妹。四年的风风雨雨,我们一同走过,充满着关爱,给我留下了值得珍藏的最美好的记忆。 在我的十几年求学历程里,离不开父母的鼓励和支持,是他们辛勤的劳作,无私的付出,为我创造良好的学习条件,我才能顺利完成完成学业,感激他们一直以来对我的抚养与培育。 最后,我要特别感谢我的导师赵达睿老师、和研究生助教熊伟丽老师。是他们在我毕业的最后关头给了我们巨大的帮助与鼓励,给了我很多解决问题的思路,在此表示衷心的感激。老师们认真负责的工作态度,严谨的治学精神和深厚的理论水平都使我收益匪浅。他无论在理论上还是在实践中,都给与我很大的帮助,使我得到不少的提高这对于我以后的工作和学习都有一种巨大的帮助,感谢他耐心的辅导。在论文的撰写过程中老师们给予我很大的帮助,帮助解决了不少的难点,使得论文能够及时完成,这里一并表示真诚的感谢。 毕业设计(论文)原创性声明和使用授权说明 原创性声明 本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得 及其它教育机构的学位或学历而使用过的材料。对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。 作 者 签 名:       日  期:        ​​​​​​​​​​​​ 指导教师签名:        日  期:        使用授权说明 本人完全了解 大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。 作者签名:        日  期:        ​​​​​​​​​​​​ 学位论文原创性声明 本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。本人完全意识到本声明的法律后果由本人承担。 作者签名: 日期: 年 月 日 学位论文版权使用授权书 本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。本人授权      大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。 涉密论文按学校规定处理。 作者签名: 日期: 年 月 日 导师签名: 日期: 年 月 日 独 创 声 明 本人郑重声明:所呈交的毕业设计(论文),是本人在指导老师的指导下,独立进行研究工作所取得的成果,成果不存在知识产权争议。尽我所知,除文中已经注明引用的内容外,本设计(论文)不含任何其他个人或集体已经发表或撰写过的作品成果。对本文的研究做出重要贡献的个人和集体均已在文中以明确方式标明。 本声明的法律后果由本人承担。   作者签名: 年 月 日   毕业设计(论文)使用授权声明 本人完全了解**学院关于收集、保存、使用毕业设计(论文)的规定。 本人愿意按照学校要求提交学位论文的印刷本和电子版,同意学校保存学位论文的印刷本和电子版,或采用影印、数字化或其它复制手段保存设计(论文);同意学校在不以营利为目的的前提下,建立目录检索与阅览服务系统,公布设计(论文)的部分或全部内容,允许他人依法合理使用。 (保密论文在解密后遵守此规定)   作者签名: 年 月 日 基本要求:写毕业论文主要目的是培养学生综合运用所学知识和技能,理论联系实际,独立分析,解决实际问题的能力,使学生得到从事本专业工作和进行相关的基本训练。毕业论文应反映出作者能够准确地掌握所学的专业基础知识,基本学会综合运用所学知识进行科学研究的方法,对所研究的题目有一定的心得体会,论文题目的范围不宜过宽,一般选择本学科某一重要问题的一个侧面。 毕业论文的基本教学要求是: 1、培养学生综合运用、巩固与扩展所学的基础理论和专业知识,培养学生独立分析、解决实际问题能力、培养学生处理数据和信息的能力。2、培养学生正确的理论联系实际的工作作风,严肃认真的科学态度。3、培养学生进行社会调查研究;文献资料收集、阅读和整理、使用;提出论点、综合论证、总结写作等基本技能。 毕业论文是毕业生总结性的独立作业,是学生运用在校学习的基本知识和基础理论,去分析、解决一两个实际问题的实践锻炼过程,也是学生在校学习期间学习成果的综合性总结,是整个教学活动中不可缺少的重要环节。撰写毕业论文对于培养学生初步的科学研究能力,提高其综合运用所学知识分析问题、解决问题能力有着重要意义。 毕业论文在进行编写的过程中,需要经过开题报告、论文编写、论文上交评定、论文答辩以及论文评分五个过程,其中开题报告是论文进行的最重要的一个过程,也是论文能否进行的一个重要指标。 撰写意义:1.撰写毕业论文是检验学生在校学习成果的重要措施,也是提高教学质量的重要环节。大学生在毕业前都必须完成毕业论文的撰写任务。申请学位必须提交相应的学位论文,经答辩通过后,方可取得学位。可以这么说,毕业论文是结束大学学习生活走向社会的一个中介和桥梁。毕业论文是大学生才华的第一次显露,是向祖国和人民所交的一份有份量的答卷,是投身社会主义现代化建设事业的报到书。一篇毕业论文虽然不能全面地反映出一个人的才华,也不一定能对社会直接带来巨大的效益,对专业产生开拓性的影响。但是,实践证明,撰写毕业论文是提高教学质量的重要环节,是保证出好人才的重要措施。 2.通过撰写毕业论文,提高写作水平是干部队伍“四化”建设的需要。党中央要求,为了适应现代化建设的需要,领导班子成员应当逐步实现“革命化、年轻化、知识化、专业化”。这个“四化”的要求,也包含了对干部写作能力和写作水平的要求。 3.提高大学生的写作水平是社会主义物质文明和精神文明建设的需要。在新的历史时期,无论是提高全族的科学文化水平,掌握现代科技知识和科学管理方法,还是培养社会主义新人,都要求我们的干部具有较高的写作能力。在经济建设中,作为领导人员和机关的办事人员,要写指示、通知、总结、调查报告等应用文;要写说明书、广告、解说词等说明文;还要写科学论文、经济评论等议论文。在当今信息社会中,信息对于加快经济发展速度,取得良好的经济效益发挥着愈来愈大的作用。写作是以语言文字为信号,是传达信息的方式。信息的来源、信息的收集、信息的储存、整理、传播等等都离不开写作。 论文种类:毕业论文是学术论文的一种形式,为了进一步探讨和掌握毕业论文的写作规律和特点,需要对毕业论文进行分类。由于毕业论文本身的内容和性质不同,研究领域、对象、方法、表现方式不同,因此,毕业论文就有不同的分类方法。 按内容性质和研究方法的不同可以把毕业论文分为理论性论文、实验性论文、描述性论文和设计性论文。后三种论文主要是理工科大学生可以选择的论文形式,这里不作介绍。文科大学生一般写的是理论性论文。理论性论文具体又可分成两种:一种是以纯粹的抽象理论为研究对象,研究方法是严密的理论推导和数学运算,有的也涉及实验与观测,用以验证论点的正确性。另一种是以对客观事物和现象的调查、考察所得观测资料以及有关文献资料数据为研究对象,研究方法是对有关资料进行分析、综合、概括、抽象,通过归纳、演绎、类比,提出某种新的理论和新的见解。 按议论的性质不同可以把毕业论文分为立论文和驳论文。立论性的毕业论文是指从正面阐述论证自己的观点和主张。一篇论文侧重于以立论为主,就属于立论性论文。立论文要求论点鲜明,论据充分,论证严密,以理和事实服人。驳论性毕业论文是指通过反驳别人的论点来树立自己的论点和主张。如果毕业论文侧重于以驳论为主,批驳某些错误的观点、见解、理论,就属于驳论性毕业论文。驳论文除按立论文对论点、论据、论证的要求以外,还要求针锋相对,据理力争。 按研究问题的大小不同可以把毕业论文分为宏观论文和微观论文。凡届国家全局性、带有普遍性并对局部工作有一定指导意义的论文,称为宏观论文。它研究的面比较宽广,具有较大范围的影响。反之,研究局部性、具体问题的论文,是微观论文。它对具体工作有指导意义,影响的面窄一些。 另外还有一种综合型的分类方法,即把毕业论文分为专题型、论辩型、综述型和综合型四大类: 1.专题型论文。这是分析前人研究成果的基础上,以直接论述的形式发表见解,从正面提出某学科中某一学术问题的一种论文。如本书第十二章例文中的《浅析领导者突出工作重点的方法与艺术》一文,从正面论述了突出重点的工作方法的意义、方法和原则,它表明了作者对突出工作重点方法的肯定和理解。2.论辩型论文。这是针对他人在某学科中某一学术问题的见解,凭借充分的论据,着重揭露其不足或错误之处,通过论辩形式来发表见解的一种论文。3.综述型论文。这是在归纳、总结前人或今人对某学科中某一学术问题已有研究成果的基础上,加以介绍或评论,从而发表自己见解的一种论文。4.综合型论文。这是一种将综述型和论辩型两种形式有机结合起来写成的一种论文。如《关于中国民族关系史上的几个问题》一文既介绍了研究民族关系史的现状,又提出了几个值得研究的问题。因此,它是一篇综合型的论文。 写作步骤:毕业论文是高等教育自学考试本科专业应考者完成本科阶段学业的最后一个环节,它是应考者的 总结 性独立作业,目的在于总结学习专业的成果,培养综合运用所学知识解决实际 问题 的能力。从文体而言,它也是对某一专业领域的现实问题或 理论 问题进行 科学 研究 探索的具有一定意义的论说文。完成毕业论文的撰写可以分两个步骤,即选择课题和研究课题。 首先是选择课题。选题是论文撰写成败的关键。因为,选题是毕业论文撰写的第一步,它实际上就是确定“写什么”的问题,亦即确定科学研究的方向。如果“写什么”不明确,“怎么写”就无从谈起。 教育部自学考试办公室有关对毕业论文选题的途径和要求是“为鼓励理论与工作实践结合,应考者可结合本单位或本人从事的工作提出论文题目,报主考学校审查同意后确立。也可由主考学校公布论文题目,由应考者选择。毕业论文的总体要求应与普通全日制高等学校相一致,做到通过论文写作和答辩考核,检验应考者综合运用专业知识的能力”。但不管考生是自己任意选择课题,还是在主考院校公布的指定课题中选择课题,都要坚持选择有科学价值和现实意义的、切实可行的课题。选好课题是毕业论文成功的一半。 第一、要坚持选择有科学价值和现实意义的课题。科学研究的目的是为了更好地认识世界、改造世界,以推动社会的不断进步和发展 。因此,毕业论文的选题,必须紧密结合社会主义物质文明和精神文明建设的需要,以促进科学事业发展和解决现实存在问题作为出发点和落脚点。选题要符合科学研究的正确方向,要具有新颖性,有创新、有理论价值和现实的指导意义或推动作用,一项毫无意义的研究,即使花很大的精力,表达再完善,也将没有丝毫价值。具体地说,考生可从以下三个方面来选题。首先,要从现实的弊端中选题,学习了专业知识,不能仅停留在书本上和理论上,还要下一番功夫,理论联系实际,用已掌握的专业知识,去寻找和解决工作实践中急待解决的问题。其次,要从寻找科学研究的空白处和边缘领域中选题,科学研究。还有许多没有被开垦的处女地,还有许多缺陷和空白,这些都需要填补。应考者应有独特的眼光和超前的意识去思索,去发现,去研究。最后,要从寻找前人研究的不足处和错误处选题,在前人已提出来的研究课题中,许多虽已有初步的研究成果,但随着社会的不断发展,还有待于丰富、完整和发展,这种补充性或纠正性的研究课题,也是有科学价值和现实指导意义的。 第二、要根据自己的能力选择切实可行的课题。毕业论文的写作是一种创造性劳动,不但要有考生个人的见解和主张,同时还需要具备一定的客观条件。由于考生个人的主观、客观条件都是各不相同的,因此在选题时,还应结合自己的特长、兴趣及所具备的客观条件来选题。具体地说,考生可从以下三个方面来综合考虑。首先,要有充足的资料来源。“巧妇难为无米之炊”,在缺少资料的情况下,是很难写出高质量的论文的。选择一个具有丰富资料来源的课题,对课题深入研究与开展很有帮助。其次,要有浓厚的研究兴趣,选择自己感兴趣的课题,可以激发自己研究的热情,调动自己的主动性和积极性,能够以专心、细心、恒心和耐心的积极心态去完成。最后,要能结合发挥自己的业务专长,每个考生无论能力水平高低,工作岗位如何,都有自己的业务专长,选择那些能结合自己工作、发挥自己业务专长的课题,对顺利完成课题的研究大有益处。 致 谢 这次论文的完成,不止是我自己的努力,同时也有老师的指导,同学的帮助,以及那些无私奉献的前辈,正所谓你知道的越多的时候你才发现你知道的越少,通过这次论文,我想我成长了很多,不只是磨练了我的知识厚度,也使我更加确定了我今后的目标:为今后的计算机事业奋斗。在此我要感谢我的指导老师——***老师,感谢您的指导,才让我有了今天这篇论文,您不仅是我的论文导师,也是我人生的导师,谢谢您!我还要感谢我的同学,四年的相处,虽然我未必记得住每分每秒,但是我记得每一个有你们的精彩瞬间,我相信通过大学的历练,我们都已经长大,变成一个有担当,有能力的新时代青年,感谢你们的陪伴,感谢有你们,这篇论文也有你们的功劳,我想毕业不是我们的相处的结束,它是我们更好相处的开头,祝福你们!我也要感谢父母,这是他们给我的,所有的一切;感谢母校,尽管您不以我为荣,但我一直会以我是一名农大人为荣。 通过这次毕业设计,我学习了很多新知识,也对很多以前的东西有了更深的记忆与理解。漫漫求学路,过程很快乐。我要感谢信息与管理科学学院的老师,我从他们那里学到了许多珍贵的知识和做人处事的道理,以及科学严谨的学术态度,令我受益良多。同时还要感谢学院给了我一个可以认真学习,天天向上的学习环境和机会。 即将结束*大学习生活,我感谢****大学提供了一次在**大接受教育的机会,感谢院校老师的无私教导。感谢各位老师审阅我的论文。 游戏菜单界面 游戏结束界面 游戏运行界面 排行榜 界面 帮助界面 到达底部部 到底游戏结束 到达底部部 结束 销行操作 生成下一个下坠物 将新生的下坠物代替旧的“下一 个下坠物“ 将旧的“下一个下坠物”用作当前 下坠物 销行操作 游戏结束处理 下降一个单位 开始 是 否 堆积方块,判断接触面状态及是否得分 2.统计分数 判断是否过关 关数增加,游戏速度将变快。开始新的一关,继续游戏 游戏窗口重绘 1.判断行满、处理销行、堆积方块向下移动 是 否 是 否 否 是 是 否 接上图1点 底行 判断当前行是否为空 判断当前行是否为满 判断是否有满行 判断移动行方块是否为空 当前行向上推动一行 将要移动行所有数据移至当前行 将当前行的所有数据初始化 统计连续几行为满 如果有销行,则刷新游戏区域。接上图2点 是 否 7 6 5 4 3 2 1 随机抽取一个数 随机数 一字形 田字形 L 形 J 形 T 形 S 形 Z字形 型 游戏是否结束 保存当前方块坐标 显示方块于屏幕上 游戏结束 保存信息 关数初始化 返回开始界面
/
本文档为【基于android环境的俄罗斯方块_毕业设计】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索