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