package slidingblocks;
import java.util.Random;
//import java.util.Vector;
import javax.microedition.lcdui.*;
public class BlocksCanvas extends Canvas implements Runnable{
private int blocks_case=0;//方块种类,设计五种。
boolean isChange=false;//是否翻转
private final static int DIRECTION_UP=1;
private final static int DIRECTION_DOWN=2;
private final static int DIRECTION_LEFT=3;
private final static int DIRECTION_RIGHT=4;
int direction;
int width;
int height;
int blocksX;
int blocksY;
int rotateNum=0;//方块翻转case设置
int[][] blocksArr=new int[4][4];//存放要落下的block
int[][] screenArr=new int[36][24];//存放显示屏幕已落下的blocks
int[] blocksTop=new int[24];//存放screenArr中每列最上方的block
int[] rightBlocks=new int[4];
int[] leftBlocks=new int[4];
int[] bottomBlocks=new int[4];
int[] blocksBuffI=new int[4];
int[] blocksBuffJ=new int[4];
private final byte BLOCKSWIDTH=8;
private int score=0;
private int marks=0;
boolean isPaused=false;
boolean isRun=true;
boolean isLeft=false;
boolean isRight=false;
boolean isFirst;
boolean isBottom=false;
boolean isLineFull=false;
boolean isGameOver=false;
private int SLEEP_TIME=300;
Random random=new Random();
// Vector vectorI = new Vector(4);
// Vector vectorJ = new Vector(4);
public BlocksCanvas(){
width=BLOCKSWIDTH*24;
height=BLOCKSWIDTH*36;
blocksX=width/2;
blocksY=0;
isFirst=true;
init();
initblocksBuff();
clearscreenArr();
new Thread(this).start();
}
private void init(){
switch(blocks_case){
case 0:
blocksArr[0][0]=blocksArr[0][1]=blocksArr[1][0]=blocksArr[1][1]=1;
break;
case 1:
blocksArr[0][0]=blocksArr[0][1]=blocksArr[1][1]=blocksArr[1][2]=1;
break;
case 2:
blocksArr[0][0]=blocksArr[0][1]=blocksArr[0][2]=blocksArr[1][2]=1;
break;
case 3:
blocksArr[0][1]=blocksArr[1][0]=blocksArr[1][1]=blocksArr[1][2]=1;
break;
case 4:
blocksArr[0][0]=blocksArr[0][1]=blocksArr[0][2]=blocksArr[0][3]=1;
break;
}
}
private void initblocksBuff(){
int k=0;
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
if(blocksArr[i][j]==1){
blocksBuffI[k]=i;
blocksBuffJ[k]=j;
k++;
}
}
}
}
protected void paint(Graphics g) {
// TODO Auto-generated method stub
g.setColor(0xffffff);
g.fillRect(0, 0, getWidth(),getHeight());
g.setColor(0xff0000);
g.drawLine(width, 0, width, height);
g.setFont(Font.getDefaultFont());
g.drawString("Sore",width+(getWidth()-width)/2,BLOCKSWIDTH*2,g.HCENTER|g.BASELINE);
g.drawString(""+score,width+(getWidth()-width)/2,BLOCKSWIDTH*4,g.HCENTER|g.BASELINE);
if(!isGameOver){
for(int k=0;k<4;k++){
g.setColor(0);
g.fillRect(blocksX+blocksBuffJ[k]*BLOCKSWIDTH, blocksY+blocksBuffI[k]*BLOCKSWIDTH, BLOCKSWIDTH, BLOCKSWIDTH);
// System.out.println("i="+i+" ,j="+j);
}
for(int i=35;i>=0;i--){
for(int j=0;j<24;j++){
if(screenArr[i][j]==1){
g.setColor(0);
g.fillRect(j*BLOCKSWIDTH, i*BLOCKSWIDTH, BLOCKSWIDTH, BLOCKSWIDTH);
}
}
}
}
else{
g.drawString("GameOver ", width/2, height/5*3, Graphics.HCENTER|Graphics.BASELINE);
}
}
private void move(){
// blocksY+=BLOCKSWIDTH;
blocksY+=BLOCKSWIDTH;
state(direction);
// System.out.println("dir3:"+direction);
direction=0;
// System.out.println("dir4:"+direction);
// System.out.println(blocksY);
for(int k=0;k<4;k++){
if(blocksY+(blocksBuffI[k])*BLOCKSWIDTH>=height){
isBottom=true;
saveblocks();
linefull();
if(isLineFull){
isLineFull=false;
getscore();
repaint();
}
generateBlocks();
// isFirst=false;
}
}
if(!isBottom&&collide(2)){//下落方块下边有方块
// System.out.println("aaa");
saveblocks();
linefull();
if(isLineFull){
isLineFull=false;
getscore();
repaint();
}
if(blocksY==BLOCKSWIDTH){
isGameOver=true;
}
generateBlocks();
}
}
private void getscore(){
switch(marks){
case 1:
score=score+100;
break;
case 2:
score=score+300;
break;
case 3:
score=score+700;
break;
case 4:
score=score+1500;
break;
}
marks=0;
//return score;
}
// System.out.println("end");
private void linefull(){
for(int i=35;i>=0;i--){
while(screenArr[i][0]==1&&screenArr[i][1]==1&&screenArr[i][2]==1&&screenArr[i][3]==1&&screenArr[i][4]==1&&screenArr[i][5]==1&&screenArr[i][6]==1&&screenArr[i][7]==1&&screenArr[i][8]==1&&screenArr[i][9]==1&&screenArr[i][10]==1&&screenArr[i][11]==1&&screenArr[i][12]==1&&screenArr[i][13]==1&&screenArr[i][14]==1&&screenArr[i][15]==1&&screenArr[i][16]==1&&screenArr[i][17]==1&&screenArr[i][18]==1&&screenArr[i][19]==1&&screenArr[i][20]==1&&screenArr[i][21]==1&&screenArr[i][22]==1&&screenArr[i][23]==1){
marks++;
for(int j=0;j<24;j++){
screenArr[i][j]=0;
for(int k=i;k>=1;k--){
screenArr[k][j]=screenArr[k-1][j];
}
}
isLineFull=true;
}
}
}
/*
private boolean collide(){
int[] blocksI=new int[4];
int[] blocksJ=new int[4];
int[] screenI=new int[24];
int k=0;
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
if(blocksArr[i][j]==1){
// System.out.println("i:"+i+" ,j:"+j);
blocksI[k]=i;
blocksJ[k]=j;
k++;
}
}
}
int m=0;
for(int j=0;j<24;j++){
for(int i=35;i>=0;i--){
if(screenArr[i][j]==1){
screenI[m]=i;
// System.out.println("screenI:"+screenI[m]+"m:"+m);
}
}
m++;
}
// System.out.println("b");
for(int j=0;j<24;j++){
for(int i=0;i<4;i++){
if(blocksX/BLOCKSWIDTH+blocksJ[i]==j&&blocksY/BLOCKSWIDTH+blocksI[i]==screenI[j])//下落方块下边有已落下方块
return true;
}
}
return false;
}
*/
/*
private void initCheckBlock(){
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
if(blocksArr[i][j]==1){
rightBlocks[i]=j;
}
}
//System.out.println("rightBlocks["+i+"]:"+rightBlocks[i]);
}
for(int i=3;i>=0;i--){
for(int j=3;j>=0;j--){
if(blocksArr[i][j]==1){
leftBlocks[i]=j;
}
}
// System.out.println("leftBlocks["+i+"]:"+leftBlocks[i]);
}
for(int j=0;j<4;j++){
for(int i=0;i<4;i++){
if(blocksArr[i][j]==1){
bottomBlocks[j]=i;
}
}
// System.out.println("bottomBlocks["+j+"]:"+bottomBlocks[j]);
}
}
*/
private void saveblocks(){
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
if(blocksArr[i][j]==1){
screenArr[blocksY/BLOCKSWIDTH+i-1][blocksX/BLOCKSWIDTH+j]=1;
}
}
}
}
/*
private boolean collide(){//检查下落方块左右两边是否有方块
while(true){
for(int k=0;k<4;k++){
if(screenArr[blocksY/BLOCKSWIDTH+blocksBuffI[k]][blocksX/BLOCKSWIDTH+blocksBuffJ[k]]==1){//右边有方块
return true;
}
}
break;
}
return false;
}
*/
private boolean collide(int key){//检查下落方块左右两边是否有方块
// System.out.println("asdfasdf");
switch(key){
case 0:
for(int k=0;k<4;k++){
if(screenArr[blocksY/BLOCKSWIDTH+blocksBuffI[k]][blocksX/BLOCKSWIDTH+blocksBuffJ[k]]==1){//右边有方块
return true;
}
}
break;
case 1:
for(int k=0;k<4;k++){
if(screenArr[blocksY/BLOCKSWIDTH+blocksBuffI[k]][blocksX/BLOCKSWIDTH+blocksBuffJ[k]]==1){//左边有方块
return true;
}
}
break;
case 2:
// System.out.println("case 2:下边有方块");
for(int k=0;k<4;k++){
if(screenArr[blocksY/BLOCKSWIDTH+blocksBuffI[k]][blocksX/BLOCKSWIDTH+blocksBuffJ[k]]==1){//下边有方块
return true;
}
}
break;
}
return false;
}
private void generateBlocks(){
//将小方块数组中为1的值添加到大屏幕数组中
// for(int k=0;k<24;k++){
// System.out.println("sreenArr["+35+"]["+k+"]:
j2me手机游戏实例之--俄罗斯方块
5星 · 超过95%的资源 需积分: 3 60 浏览量
2010-08-18
18:04:12
上传
评论
收藏 22KB RAR 举报
aniuaniuaniuaniu
- 粉丝: 2
- 资源: 9
最新资源
- 使用Dockerfile配置Springboot应用服务发布Docker镜像-源码
- 万维考试系统-C语言题库-含题目-程序设计题导出-113道.doc
- Alibaba SpringCloud集成Nacos、openFeign实现负载均衡-源码
- 用户研究系列之Persona介绍(用户画像)
- Image_1715110604427.jpg
- mYzh..trashed-1716951334-.jpg
- Alibaba SpringCloud集成nacos实现配置中心
- 那些好的不像话的心流体验
- 基于pytorch的卷积神经网络识别是否为奥特曼的项目python源码+文档说明+数据集(课程设计)
- 基于卷积神经网络的图像风格迁移python源码+文档说明+界面图片(课程设计)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈