import java.awt.*;
import java.awt.event.*;/**
*
* @author Administrator
*/
public class NewClass extends java.awt.Frame implements KeyListener,Runnable{
Model model;
/**下次出现
*/
int bp;
Thread thr = new Thread(this);
/**是否是暂停游戏
*/
boolean push_game;
/**是否已结束游戏
*/
boolean game_over;
/**计时
*/
long sp_time = 0,length_time=0;
/**等级对应的速度,30级
*/
int leves[]={1200,1080,972,874,786,707,636,572,514,462,415,373,335,301,270,243,218,196,176,158,142,127,114,102,91,81,72,64,57,51,45,40,36,32,28};
/**游戏等级
*/
int leve=0;
/**销除N行对应的分数
*/
int counts[]={0,1,2,5,8};
/**销除的总行数
*/
int count=0;
/**产生随机数
*/
java.util.Random sjs=new java.util.Random();
/** Creates a new instance of NewClass */
public NewClass() {
setSize(420,480);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
addKeyListener(this);
start();
}
/**开始游戏,数据初始化
*/
void start(){
model = new Model();
if(thr==null||!thr.isAlive()){
thr=new Thread(this);
thr.start();
}
setTitle("");
leve=0;
push_game=false;
game_over=false;
sp_time = System.currentTimeMillis();
length_time=0;
count=0;
bp= (int)sjs.nextLong()%19;
if(bp<0)bp=-bp;
model.setType((int)sjs.nextLong()%19);
}
Image offScreenImage=null; public void update(Graphics g) { //双缓冲技术
if(offScreenImage==null){
offScreenImage=this.createImage(330,400+40+10);
}
Graphics goffScreen=offScreenImage.getGraphics();
Color c=goffScreen.getColor();
goffScreen.setColor(Color.black);
goffScreen.fillRect(0, 0, 210+10,440+10);
goffScreen.setColor(c);
paint(goffScreen);
g.drawImage(offScreenImage, 0, 0,null);
}
public void paint(Graphics g){
g.setColor(Color.BLUE);
g.fill3DRect(10 ,40,200-1,400-1,false);
g.setColor(Color.RED);
//主界面
for(int j=0;j<20;j++){
for(int i=0;i<10;i++){
if(model.data[j][i])
g.fill3DRect(10+20*i,40+20*(19-j),19,19,false);
}
}
//当前下落的形状
for(int i=0;i<4;i++){
int x=model.bh[model.getType()][i][0]+model.point.x;
int y=(model.bh[model.getType()][i][1]+model.point.y);
if(y<0||y>20)
continue;
g.fill3DRect(10+20*x,40+20*(19-y),19,19,false);
}
//小窗口,下次下落的形状
if(bp>=0){
g.setColor(Color.WHITE);
g.fill3DRect(230,40,80,80,false);
g.setColor(Color.RED);
for(int []p:model.bh[model.sx[bp][1]]){
g.fill3DRect(270+20*p[1],60+20*p[0],19,19,false);
}
}
//显示分数等
g.setColor(Color.YELLOW);
g.fill3DRect(230,180,80,80,true);
g.setColor(Color.BLACK);
g.drawString("leve:"+(leve+1),250,200);
g.drawString("count:"+(count),250,220);
g.drawString("time:"+(length_time/1000)+"(S)",250,240);
g.setColor(Color.RED);
g.drawString("A左,S加速,D右,J顺时间转动",230,300);
g.drawString("K逆顺时间转动,空格瞬间到底",230,320);
g.drawString("回车 暂停和开始,H重新开始游戏",230,340);
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new NewClass().setVisible(true);
}
});
}
public void keyTyped(KeyEvent e) {
if(e.getKeyChar()=='h'||e.getKeyChar()=='H'||e.getKeyCode()==e.VK_H){
start();
}
if(game_over)
return;
if(e.getKeyChar()=='A'||e.getKeyChar()=='a'||e.getKeyCode()==e.VK_A){
if(model.canMove(model.LIGHT)){
this.repaint();
}
}else if(e.getKeyChar()=='D'||e.getKeyChar()=='d'||e.getKeyCode()==e.VK_D){
if(model.canMove(model.RIGHT)){
this.repaint();
}
}else if(e.getKeyChar()==' '){
while(model.canMove(model.DROP));
drop();
}else if(e.getKeyChar()=='j'||e.getKeyChar()=='J'||e.getKeyCode()==e.VK_J){
if(model.canb(true)){
this.repaint();
}
}else if(e.getKeyChar()=='k'||e.getKeyChar()=='K'||e.getKeyCode()==e.VK_K){
if(model.canb(false)){
this.repaint();
}
}else if(e.getKeyChar()=='s'||e.getKeyChar()=='S'||e.getKeyCode()==e.VK_S){
if(model.canMove(model.DROP)){
this.repaint();
}
}else if(e.getKeyChar()=='\n'){
if(push_game){
setTitle("");
}else{
setTitle("暂停游戏");
}
push_game=!push_game;
}
}
public void keyPressed(KeyEvent e) {
} public void keyReleased(KeyEvent e) {
}
/**
*向下掉落
**/
void drop(){
if(model.canMove(model.DROP)){
}else if(model.getType()>-1){
for(int[] d:model.bh[model.getType()]){
model.data[d[1]+model.point.y][d[0]+model.point.x]=true;
} //销除行,检查point.y+1到point.y-2行
int js=0;
for(int i=1;i>-3;i--){
boolean flag=true;
if(model.point.y+i<20&&model.point.y+i>=0)
for(boolean b:model.data[model.point.y+i]){
if(!b){
flag=false;
break;
}
}else continue;
if(flag){//当前行可销除
//整体向下移
for(int j=model.point.y+i;j<20;j++){
model.data[j]=model.data[j+1];
}
model.data[20]=new boolean[10];
js++;
}
}
//游戏结束断定
if(model.data[19][4]||model.data[19][5]||model.data[19][6]||model.data[19][3]){
this.setTitle("GAME OVER!");
game_over=true;
return;
}
//更新数据
count+=counts[js];
leve=count/200;
model.point.x=4;
model.point.y=22;
model.setType(bp);
bp=(int)sjs.nextLong()%19;
if(bp<0)bp=-bp;
}
repaint();
}
public void run() {
while(true){
if(push_game){
sp_time=System.currentTimeMillis();
}else if(!game_over){
length_time += System.currentTimeMillis()-sp_time;
sp_time=System.currentTimeMillis();
drop();
}
try {
Thread.sleep(leves[leve]);
} catch (InterruptedException ex) {
}
}
}
}帖上得了多少分
import java.awt.event.*;/**
*
* @author Administrator
*/
public class NewClass extends java.awt.Frame implements KeyListener,Runnable{
Model model;
/**下次出现
*/
int bp;
Thread thr = new Thread(this);
/**是否是暂停游戏
*/
boolean push_game;
/**是否已结束游戏
*/
boolean game_over;
/**计时
*/
long sp_time = 0,length_time=0;
/**等级对应的速度,30级
*/
int leves[]={1200,1080,972,874,786,707,636,572,514,462,415,373,335,301,270,243,218,196,176,158,142,127,114,102,91,81,72,64,57,51,45,40,36,32,28};
/**游戏等级
*/
int leve=0;
/**销除N行对应的分数
*/
int counts[]={0,1,2,5,8};
/**销除的总行数
*/
int count=0;
/**产生随机数
*/
java.util.Random sjs=new java.util.Random();
/** Creates a new instance of NewClass */
public NewClass() {
setSize(420,480);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
addKeyListener(this);
start();
}
/**开始游戏,数据初始化
*/
void start(){
model = new Model();
if(thr==null||!thr.isAlive()){
thr=new Thread(this);
thr.start();
}
setTitle("");
leve=0;
push_game=false;
game_over=false;
sp_time = System.currentTimeMillis();
length_time=0;
count=0;
bp= (int)sjs.nextLong()%19;
if(bp<0)bp=-bp;
model.setType((int)sjs.nextLong()%19);
}
Image offScreenImage=null; public void update(Graphics g) { //双缓冲技术
if(offScreenImage==null){
offScreenImage=this.createImage(330,400+40+10);
}
Graphics goffScreen=offScreenImage.getGraphics();
Color c=goffScreen.getColor();
goffScreen.setColor(Color.black);
goffScreen.fillRect(0, 0, 210+10,440+10);
goffScreen.setColor(c);
paint(goffScreen);
g.drawImage(offScreenImage, 0, 0,null);
}
public void paint(Graphics g){
g.setColor(Color.BLUE);
g.fill3DRect(10 ,40,200-1,400-1,false);
g.setColor(Color.RED);
//主界面
for(int j=0;j<20;j++){
for(int i=0;i<10;i++){
if(model.data[j][i])
g.fill3DRect(10+20*i,40+20*(19-j),19,19,false);
}
}
//当前下落的形状
for(int i=0;i<4;i++){
int x=model.bh[model.getType()][i][0]+model.point.x;
int y=(model.bh[model.getType()][i][1]+model.point.y);
if(y<0||y>20)
continue;
g.fill3DRect(10+20*x,40+20*(19-y),19,19,false);
}
//小窗口,下次下落的形状
if(bp>=0){
g.setColor(Color.WHITE);
g.fill3DRect(230,40,80,80,false);
g.setColor(Color.RED);
for(int []p:model.bh[model.sx[bp][1]]){
g.fill3DRect(270+20*p[1],60+20*p[0],19,19,false);
}
}
//显示分数等
g.setColor(Color.YELLOW);
g.fill3DRect(230,180,80,80,true);
g.setColor(Color.BLACK);
g.drawString("leve:"+(leve+1),250,200);
g.drawString("count:"+(count),250,220);
g.drawString("time:"+(length_time/1000)+"(S)",250,240);
g.setColor(Color.RED);
g.drawString("A左,S加速,D右,J顺时间转动",230,300);
g.drawString("K逆顺时间转动,空格瞬间到底",230,320);
g.drawString("回车 暂停和开始,H重新开始游戏",230,340);
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new NewClass().setVisible(true);
}
});
}
public void keyTyped(KeyEvent e) {
if(e.getKeyChar()=='h'||e.getKeyChar()=='H'||e.getKeyCode()==e.VK_H){
start();
}
if(game_over)
return;
if(e.getKeyChar()=='A'||e.getKeyChar()=='a'||e.getKeyCode()==e.VK_A){
if(model.canMove(model.LIGHT)){
this.repaint();
}
}else if(e.getKeyChar()=='D'||e.getKeyChar()=='d'||e.getKeyCode()==e.VK_D){
if(model.canMove(model.RIGHT)){
this.repaint();
}
}else if(e.getKeyChar()==' '){
while(model.canMove(model.DROP));
drop();
}else if(e.getKeyChar()=='j'||e.getKeyChar()=='J'||e.getKeyCode()==e.VK_J){
if(model.canb(true)){
this.repaint();
}
}else if(e.getKeyChar()=='k'||e.getKeyChar()=='K'||e.getKeyCode()==e.VK_K){
if(model.canb(false)){
this.repaint();
}
}else if(e.getKeyChar()=='s'||e.getKeyChar()=='S'||e.getKeyCode()==e.VK_S){
if(model.canMove(model.DROP)){
this.repaint();
}
}else if(e.getKeyChar()=='\n'){
if(push_game){
setTitle("");
}else{
setTitle("暂停游戏");
}
push_game=!push_game;
}
}
public void keyPressed(KeyEvent e) {
} public void keyReleased(KeyEvent e) {
}
/**
*向下掉落
**/
void drop(){
if(model.canMove(model.DROP)){
}else if(model.getType()>-1){
for(int[] d:model.bh[model.getType()]){
model.data[d[1]+model.point.y][d[0]+model.point.x]=true;
} //销除行,检查point.y+1到point.y-2行
int js=0;
for(int i=1;i>-3;i--){
boolean flag=true;
if(model.point.y+i<20&&model.point.y+i>=0)
for(boolean b:model.data[model.point.y+i]){
if(!b){
flag=false;
break;
}
}else continue;
if(flag){//当前行可销除
//整体向下移
for(int j=model.point.y+i;j<20;j++){
model.data[j]=model.data[j+1];
}
model.data[20]=new boolean[10];
js++;
}
}
//游戏结束断定
if(model.data[19][4]||model.data[19][5]||model.data[19][6]||model.data[19][3]){
this.setTitle("GAME OVER!");
game_over=true;
return;
}
//更新数据
count+=counts[js];
leve=count/200;
model.point.x=4;
model.point.y=22;
model.setType(bp);
bp=(int)sjs.nextLong()%19;
if(bp<0)bp=-bp;
}
repaint();
}
public void run() {
while(true){
if(push_game){
sp_time=System.currentTimeMillis();
}else if(!game_over){
length_time += System.currentTimeMillis()-sp_time;
sp_time=System.currentTimeMillis();
drop();
}
try {
Thread.sleep(leves[leve]);
} catch (InterruptedException ex) {
}
}
}
}帖上得了多少分
final static int LIGHT=0,DROP=1,RIGHT=2;
/**坐标
*/
Point point=new Point(4,22);
/**容器
*/
boolean data[][]=new boolean[24][10];;
/**类型
*/
int type = 0;
/**形状相对point的偏移
*/
int[][][]bh={
{{0,0},{1,0},{0,-1},{1,-1}},//0
{{0,1},{0,0},{0,-1},{0,-2}},
{{-1,0},{0,0},{1,0},{2,0}},
{{-1,0},{0,0},{0,-1},{1,-1}},//3
{{0,1},{0,0},{-1,0},{-1,-1}},
{{-1,-1},{0,-1},{0,0},{1,0}},
{{0,1},{0,0},{1,0},{1,-1}},//6
{{0,1},{-1,0},{0,0},{1,0}},
{{0,1},{0,0},{0,-1},{1,0}},
{{-1,0},{0,0},{0,-1},{1,0}},//9
{{0,-1},{0,0},{0,1},{-1,0}},
{{-1,0},{0,0},{1,0},{1,-1}},
{{0,1},{0,0},{0,-1},{-1,-1}},//12
{{-1,1},{-1,0},{0,0},{1,0}},
{{0,1},{1,1},{0,0},{0,-1}},
{{-1,0},{0,0},{1,0},{-1,-1}},//15
{{-1,1},{0,1},{0,0},{0,-1}},
{{-1,0},{0,0},{1,0},{1,1}},
{{0,1},{0,0},{0,-1},{1,-1}}//18
};
//变换序号
int sx[][]={
//顺时针,逆
{0,0},//0
{2,2},
{1,1},
{4,4},//3
{3,3},
{6,6},
{5,5},//6
{8,10},
{9,7},
{10,8},//9
{7,9},
{12,14},
{13,11},//12
{14,12},
{11,13},
{16,18},//15
{17,15},
{18,16},
{15,17}//18
};
Model(){
}
void setType(int t){
if(t<0)
this.type=-type;
else
this.type=t;
}
int getType(){
return type;
}
/**变化 true 顺时针
* t 0 - 18
*/
boolean canb(boolean rl){
if(type==0)
return true;
int sp=0;
if(!rl)
sp=1;
if(!bz(sx[type][sp],point.x,point.y)){
type=sx[type][sp];
return true;
}
return false;
}
/**移动
*/
boolean canMove(int fx){
switch(fx){
case 0:
if(bz(type,point.x-1,point.y))
return false;
point.x=point.x-1;break;
case 1:
if(bz(type,point.x,point.y-1))
return false;
point.y=point.y-1;break;
case 2:
if(bz(type,point.x+1,point.y))
return false;
point.x=point.x+1;break;
}
return true;
}
/**出界或碰撞 返回true
*/
boolean bz(int t,int x,int y){
if(t==-1){
return true;
}
int ix,iy;
for(int i=0;i<4;i++){
ix=bh[t][i][0]+x;
iy=bh[t][i][1]+y;
if(ix<0||ix>9||iy<0||data[iy][ix]){
return true;
}
}
return false;
}
}
http://download.csdn.net/source/2086425