别踩百块儿游戏程序设计.docx
《别踩百块儿游戏程序设计.docx》由会员分享,可在线阅读,更多相关《别踩百块儿游戏程序设计.docx(15页珍藏版)》请在冰豆网上搜索。
别踩百块儿游戏程序设计
计
算
机
游
戏
程
序
设
计
计算机科学院
数字媒体技术
游戏名称:
别猜白块
开发工具:
eclipse
游戏平台:
夜神安卓模拟器
模拟器规格:
主频:
1.5GHz
内存:
1GB
操作系统:
安卓
开发语言:
java
游戏简介:
别踩白块儿,这就是这个游戏唯一的一个规则。
游戏简单易上手,并且有多重玩法,画面分为4行4列,每一行都只有一个黑色色块,你的任务就是按对他——游戏共三个模式,经典、街机、禅。
经典模式中玩家的目标是在最短的时间内按完50个黑方块,每按对一个画面会自动下降。
游戏特性
本游戏设计灵感来自于钢琴,但是之前也有类似的钢琴游戏比如《极品钢琴》
但是极品钢琴键位较多,难度较大,不适合业余玩家使用。
所以别踩百块就简化了操作,只保留了四个键位,可玩性得到了增强,而趣性也得到了保留
简单易玩,老少咸宜,可谓居家旅行+上班打发无聊得利器噢
5x3种好玩的模式
美妙的钢琴音效
顺畅的游戏体验
支持GameCenter排行榜(鄙视作弊的)
支持社交网络分享,可以随时炫耀自己得成绩
警告,这个游戏很容易上瘾,自制力不好的人慎玩!
游戏背景
自从越南的的独立游戏开发者——DongNguyen花了几个晚上为游戏界打了一针鸡血后,《疯狂的小鸟》(FlappyBird)带来的极简游戏风暴就一直没停歇过,事实上这股风暴根本停不下来。
紧随其后,《2048》再一次掀起了极简游戏风暴。
而《别踩百块》正是继承了这一极简风格。
极简游戏之所以如此风靡,其关键点就在于其操作的简单性。
操作的简单性导致了这个游戏对于任何人而言都很容易上手,不管是在校大学生、白领、甚至是老人小孩都很热衷于玩这款游戏。
由于极易上手,操作简便,模式简单,不管是对于开发者还是使用者都是意见好事儿。
对于开发者,简单的游戏更容易开发,也很容易受到欢迎甚至是风靡,对于使用者,人们可以利用碎片化的时间,无论是在地铁、公交课间休息,只要一个手机就可以玩了。
玩法评分★★★★★
《别踩白块儿》是一款非常考验反应速度的游戏,画面分为4行4列(某些模式除外),每一行都只有一个黑色色块,你的任务就是按对他——游戏共115个模式,其中耐玩性最高的就是经典、街机、限时模式了。
经典模式中玩家的目标是在最短的时间内按完20、50、100或200个黑方块,每按对一个画面会自动下降。
街机模式则没有时间限制,但画面会一刻不停的下落,而且速度越来越快,你要在这样的限制下,尽可能多的按对色块,漏掉或者按错游戏都会结束。
限时模式则是给玩家10、30、60或100秒钟,比拼谁能准确按完的色块最多。
画面评分★★★☆☆
本游戏的画面还算可以。
多彩的画面简洁而不繁琐。
新版的画面相比以前的可谓好了十万八千里,同时也增加了许多的元素。
音效评分★★☆☆☆
音效嘛,呵呵,也和画面一样精简。
整个游戏中除了按到方块时有一点声音外,没有任何音效音乐了。
操作评分★★★★★
作为考验反应力的游戏,《别踩白块儿》的操作响应是很完美,例如在高速的街机模式中,这种流畅感尤其能得到体现。
整体评分★★★★☆
代入感是本游戏的一大缺失。
《FlappyBird》有熟悉的马里奥背景坐镇,《2048朝代版》有上下五千年护航,如果《别踩白块儿》能加点网络流行的神兽图,或者暴走漫画表情等,一定还可以让人气更上一层。
游戏框架
启动流程:
一、打开eclipse
二、编写代码:
三、试运行
运行结束
操作指南
1、视线落在屏幕的中上方,为了预防不测。
你在按这个的同时眼睛已经看下一个了。
2、街机模式一旦开启,玩家必须注意黑白块儿下滑的速度。
初始是不快的,但是一旦玩家可以不断点击黑块,就会逐渐加速下滑的速度(增加不多,但是的确有)所以,建议大家,没有必要太过追求速度点击黑块,只要保证跟上初始下滑的速度即可。
3、把色块大致分成三种,第一种是单块,第二种是双,三,四块,第三种是场块,按的时候这三种在脑子里分别的用不同方法进行判定。
这样就不至于按到六七百的时候乱了。
4、放平心态。
早前一款超虐心游戏不知道牺牲掉了多少台手机,挂了摔手机的冲动也不是人人可以克制住。
所以,在玩这款游戏之前,还是建议大家放平了心态。
不要想着要刷多少分,休闲时,拿出手机来试一下手感,往往可以起到奇效。
5、眼睛一定不要盯着屏幕上的黑块,不然你会感觉手忙脚乱,把视野放到全局,虽然视线模糊了,但是不要慌,跟着感觉打就对了。
6、多手操作。
这个没有要讲的,如果玩大屏设备(例如iPad)的玩家肯定早都上两只手了,据说可以单手刷满500以上的,都是撸神。
双手操作,更容易跟上速度,不过需要注意协调性,往往会出现上下顺序点错的问题。
7、从下往上,分工进行。
意思就是,玩家在看下滑的方块时,因为黑色更加醒目,大部分的玩家在前面几乎不会出现失误。
往往到后面,长时间的眼睛色差疲劳,加上手指灵活性降低,一念之差就有可能功亏一篑。
所以,玩家可以试着,降慢速度,从下方跟着下滑到最底的黑块进行点击,左右手分工左右方,可以保证双手平摊工作,不会造成手部疲劳。
部分功能源码:
BaseProperty.java
packagecom.example.bcbk;
importandroid.graphics.Canvas;
importandroid.graphics.Paint;
importandroid.graphics.Rect;
importandroid.view.MotionEvent;
publicabstractclassBaseProperty{
publicPaintpaint;
intscreen_width=MainActivity.screen_width;
intscreen_height=MainActivity.screen_height;
publicabstractvoidonTouch(MotionEventevent);
}
gameMenu.java
packagecom.example.bcbk;
importandroid.graphics.Canvas;
importandroid.graphics.Color;
importandroid.graphics.Paint;
importandroid.graphics.Rect;
importandroid.util.Log;
importandroid.view.MotionEvent;
importandroid.widget.Toast;
//游戏菜单页面
publicclassGameMenuextendsBaseProperty{
RecttargetRect;
Stringstr="Play";
floatx_left;
floatx_right;
floaty_top;
floaty_botton;
changeStatechange;
publicGameMenu(){
paint=newPaint();
paint.setAntiAlias(true);
paint.setColor(Color.WHITE);
paint.setTextSize(70);
targetRect=newRect();
//返回包围整个字符串的最小的一个Rect区域
paint.getTextBounds(str,0,str.length(),targetRect);
}
publicvoidsetChange(changeStatechange){
this.change=change;
}
publicvoidondraw(Canvascanvas){
canvas.drawRGB(0,0,0);
inttextheight=targetRect.height();
inttextwidth=targetRect.width();
x_left=(screen_width-textwidth)/2;
x_right=(screen_width+textwidth)/2;
y_top=(screen_height-textheight)/2-textheight;
y_botton=(screen_height-textheight)/2;
canvas.drawText(str,x_left,(screen_height-textheight)/2,paint);
}
@Override
publicvoidonTouch(MotionEventevent){
floatx=event.getX();
floaty=event.getY();
switch(event.getAction()){
caseMotionEvent.ACTION_DOWN:
if(isStart(x,y)){
if(change!
=null){
change.execute(GameState.STATE_PLAY_INIT);
}
}
break;
default:
break;
}
}
publicbooleanisStart(floatx,floaty){
if(x>x_left&&xif(y>y_top&&yreturntrue;
}
}
returnfalse;
}
publicinterfacechangeState{
publicvoidexecute(intstate);
}
}
GameOver.java
packagecom.example.bcbk;
importandroid.graphics.Canvas;
importandroid.util.Log;
importandroid.view.MotionEvent;
importcom.example.bcbk.GameMenu.changeState;
publicclassGameOverextendsBaseProperty{
privatechangeStatechange;
privateDrawTexttext_score;//分数
privateDrawTexttext_Mkuai;//每秒块数
privateDrawTexttext_again;//重来
privateDrawTexttext_over;//结束
@Override
publicvoidonTouch(MotionEventevent){
//TODOAuto-generatedmethodstub
switch(event.getAction()){
caseMotionEvent.ACTION_DOWN:
if(text_again.onTouch(event)){
change.execute(GameState.STATE_PLAY_INIT);
}elseif(text_over.onTouch(event)){
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(0);
}
break;
default:
break;
}
}
publicGameOver(){
text_score=newDrawText();
text_score.setXY(screen_width/2,screen_height/2);
text_Mkuai=newDrawText();
text_Mkuai.setText(GameScore.SCORE+"分",60);
text_Mkuai.setXY(screen_width/4,screen_height/4);
text_again=newDrawText();
text_again.setText("重来",40);
text_again.setXY(screen_width/4,screen_height*3/4);
text_over=newDrawText();
text_over.setText("结束",40);
text_over.setXY(screen_width*3/4,screen_height*3/4);
}
publicvoidondraw(Canvascanvas){
text_score.setText(GameScore.SCORE+"分",60);
text_score.ondraw(canvas);
//text_Mkuai.ondraw(canvas);
text_again.ondraw(canvas);
text_over.ondraw(canvas);
}
publicvoidsetchange(changeStatechange){
//TODOAuto-generatedmethodstub
this.change=change;
}
publicvoidlogic(){
}
}
GamePlay.java
packagecom.example.bcbk;
importjava.util.ArrayList;
importjava.util.List;
importjava.util.Timer;
importjava.util.TimerTask;
importcom.example.bcbk.GameMenu.changeState;
importandroid.graphics.Canvas;
importandroid.util.Log;
importandroid.view.MotionEvent;
publicclassGamePlayextendsBaseProperty{
Listrowrects;
intk=-1;//判断第几个被点击
intSPEED=1;//游戏的速度
privatechangeStatechange;
publicbooleancan_click=true;//方块是否可以被点击
publicGamePlay(){
}
publicvoidinit(){
//创建5行,每一行中4个块,i代表第几行
rowrects=newArrayList();
for(inti=0;i<5;i++){
rowrects.add(newRowRect(i));
}
//初始化速度为1
SPEED=1;
//定时增加速度
GameScore.SCORE=0;
Timertimer=newTimer();
timer.schedule(newTimerTask(){
@Override
publicvoidrun(){
//TODOAuto-generatedmethodstub
SPEED=SPEED+1;
}
},3000,3000);//在1秒后执行此任务,每次间隔2秒,如果传递一个Data参数,就可以在某个固定的时间执行这个任务.
}
publicvoidsetchange(changeStatechange){
this.change=change;
}
publicvoidondraw(Canvascanvas){
//TODOAuto-generatedmethodstub
//对行进行绘画
for(inti=0;irowrects.get(i).ondraw(canvas);
}
}
@Override
publicvoidonTouch(MotionEventevent){
//TODOAuto-generatedmethodstub
switch(event.getAction()){
caseMotionEvent.ACTION_DOWN:
if(can_click){
for(inti=0;irowrects.get(i).onTouch(event);
}
can_click=false;
}
break;
caseMotionEvent.ACTION_UP:
can_click=true;
break;
}
}
publicvoidlogic(){
for(inti=0;i//判断游戏是否结束
if(rowrects.get(i).isGAME_STATE()){
change.execute(GameState.STATE_OVER);
}
//移动每一行Y值
rowrects.get(i).moveY(SPEED);
//判断行是否出屏,出屏死亡
if(rowrects.get(i).isDie()){
//死亡后取出此行,
RowRectrowrect=rowrects.get(i);
//吧此行从list集合中移除
rowrects.remove(i);
//重置此行为第0行
rowrect.setI(0);
//重置此行生命为false
rowrect.setDie(false);
//重置此行点击为false
rowrect.setClick(false);
//重新添加进list集合进行绘制
rowrects.add(0,rowrect);
}
}
}
}