您好,欢迎访问三七文档
LOGO答辩人:白凯瑟项目名称:SUDOKU小游戏制作项目简介九宫格数独,是一种源自18世纪末的瑞士,后在美国发展、并在日本得以发扬光大的数字谜题。数独盘面是个九宫,每一宫又分为九个小格。在这八十一格中给出一定的已知数字和解题条件,利用逻辑和推理,在其他的空格上填入1-9的数字。使1-9每个数字在每一行、每一列和每一宫中都只出现一次。这种游戏全面考验做题者观察能力和推理能力,虽然玩法简单,但数字排列方式却千变万化,所以不少教育者认为数独是训练头脑的绝佳方式。功能模块主界面实现横竖屏切换改变界面布局功能模块About界面风格设置:activityandroid:name=com.games.sudoku.AboutActandroid:label=@string/aboutAct_nameandroid:theme=@android:style/Theme.Dialog/activity功能模块NewGame界面实现方法:数据存储界面图片绘制随机覆盖数字填数字判断成功的算法计时返回键功能模块数据存储GameNumber(类)//保存界面的数据number[9][9](int)cover(int)//覆盖的数目coverNumber[cover](int)//覆盖数字的下标drawNumber[cover](DrawNumber类)//重画数字坐标和值type(int)//界面的难易级别MySavedView(类)//保存界面和时间gameView[3]//保存3种类型界面time[3]//保存3种界面对应的时间MyGameView(类,继承View)gameNumber(GameNumber)//游戏界面的所有数据DB_Ranking(数据库)//记录和显示排行榜功能模块绘制界面图片privateBitmappic;pic=BitmapFactory.decodeResource(getResources(),R.drawable.game_background6);Rectr=newRect(0,0,getWidth(),getHeight());canvas.drawBitmap(pic,null,r,null);随机覆盖数字(考虑随机数重复问题)number_cover=newint[cover];for(inti=0;icover;i++){inttemp=(int)(Math.random()*81);if(includedArray(temp,number_cover)!=-1)i--;elsenumber_cover[i]=temp;}功能模块填数字//记录1-9中的数字是否被覆盖,是否被重填int[]hintsArray=newint[block];//如果点击的位置不是可以填的直接返回if(GameNumber.includedArray(click_i*block+click_j,number_cover)==-1){returnfalse;}//分别按行、按列、按小九方格找到被覆盖的数和没有重填的数,并将结果记录在hintsArray数组中rowSearch(hintsArray,click_i);columnSearch(hintsArray,click_j);boxSearch(hintsArray,start_i,start_j);(判断条件:被覆盖且没有被重填)功能模块填数字//获得用户选择的数字intclick_num=data.getIntExtra(click_num,0);//修改View中draw_Number的值,调用invalidate()重新绘制界面intindex=GameNumber.includedArray(click_i*block+click_j,number_cover);draw_Number[index].setClick_num(click_num+);view.setDraw_number(draw_Number);view.invalidate();功能模块判断成功//判断填的数据和出题数据是否一致(一般情况可以判断)intcount=0;for(count=0;countdrawArray.length;count++){if(!drawArray[count].click_num.equals(String.valueOf(array[drawArray[count].click_i][drawArray[count].click_j])){break;}}if(count==drawArray.length)returntrue;功能模块判断成功//(特殊情况下判断,答案不唯一的情况)//找到填满后每一行的数据for(inti=0;iBLOCK;i++)for(intj=0;jBLOCK;j++){intj2;for(j2=0;j2drawArray.length;j2++){if(drawArray[j2].click_i==i&&drawArray[j2].click_j==j){row[i][j]=Integer.parseInt(drawArray[j2].click_num);break;}}if(j2==drawArray.length)row[i][j]=array[i][j];}功能模块判断成功//(特殊情况下判断)//找到填满后每一列的数据for(inti=0;iBLOCK;i++)for(intj=0;jBLOCK;j++)column[i][j]=row[j][i];//找到填满后每个小方格的数据intr=0;for(inti=0;iBLOCK;i=(int)(i+Math.sqrt(BLOCK)))for(intj=0;jBLOCK;j=(int)(j+Math.sqrt(BLOCK))){intc=0;for(intj2=i;j2i+Math.sqrt(BLOCK);j2++)for(intk=j;kj+Math.sqrt(BLOCK);k++)box[r][c++]=row[j2][k];r++;}功能模块判断成功//(特殊情况下判断)//如果行或列或小九方格出现重复,返回FALSE,否则返回TRUEfor(inti=0;iBLOCK;i++){if(checkRepeatOneLine(row[i]))returnfalse;if(checkRepeatOneLine(column[i]))returnfalse;if(checkRepeatOneLine(box[i]))returnfalse;}returntrue;}功能模块计时//开始计时的位置新游戏界面创建好之后(onCreate)//注意continue的时间初始值暂停游戏后重新开始弹出失败对话框后选择继续之前游戏(计时器从0开始)//结束计时的位置Activity结束(onStop)暂停游戏开始新游戏之前打开成功或失败的对话框之时功能模块返回键游戏界面按下返回键之后跳转到主界面,而非之前的某个游戏界面@OverridepublicbooleanonKeyDown(intkeyCode,KeyEventevent){if(keyCode==KeyEvent.KEYCODE_BACK){Intentintent=newIntent(this,SudokuAct.class);startActivity(intent);this.finish();}returnsuper.onKeyDown(keyCode,event);}退出按钮直接finish主界面的Activity不能保证程序一定退出实现方法:在开启新的Activity之后关闭当前Activity功能模块1、在游戏界面结束时保存当前的View2、点击Continue按钮,跳转到NewGame相同的界面,获取之前保存的界面,并将当前界面的值重新进行设置//保存界面MySavedView.setMyViews(view,this,type,mlCount);//初始化保存的界面view=newMyGameView(this,type);setContentView(view);MyGameViewoldView=MySavedView.getMyViews(this,type);view.setMyGameView(oldView);Continue界面功能模块通过TabHost将界面分成三种不同游戏级别的排行榜通过SimpleAdapter将数据库的查询结果显示到TabHost布局中的ListView布局中RankList界面菜单选项主要通过CheckBox的值改变音乐的开关和游戏界面的提示效果(一)、声音和提示菜单选项有提示(一)、声音和提示无提示菜单选项可以在游戏界面随时开始新游戏(二)、开始新游戏菜单选项主要通过View的可见性开进行控制(三)、暂停游戏菜单选项主要通过重置draw_Number的值来进行界面的重绘工作(四)、清空菜单选项主要通过菜单进行音乐的更换和列表的显示(五)、音乐总结收获:1、算法是程序的灵魂,数据结构是程序的骨架,数据结构的设计会影响到算法的实现;2、对ListView和自定义View的使用有了一定的掌握;3、能够进行横竖屏切换,表现不同的布局;4、数据库的使用得到更好的掌握;5、通过返回键和退出按钮有时不能真正退出程序;
本文标题:Sudoku
链接地址:https://www.777doc.com/doc-3870168 .html