java,
java,
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
//小方块类
class XFK {
int m; //横向的小格子的位置
int n; //纵向的小格子的位置
}
abstract class AbsFK{
XFK [] xfk = new XFK[4]; //小方块数组
int state; //状态
int [] [] map;
AbsFK (){ //构造函数,用来给小方块数组中的每一个对象开辟空间
for (int i = 0; i<4 ; i++){
xfk[i] = new XFK();
}
}
public void setMap(int [][] map){
this.map = map;
}
abstract public void reset(); //重置
abstract public void turn(); //旋转
abstract public boolean canTurn(); //是否能旋转
//是否能左移
public boolean canMoveLeft(){
for (int i =0; i<4; i++){
int m = xfk[i].m - 1;
int n = xfk[i].n;
if ( m<0 || m>11 || n<0 || n>17 || map [m][n] == 1 ){
return false;
}
}
return true;
}
//是否能右移
public boolean canMoveRight(){
for (int i =0; i<4; i++){
int m = xfk[i].m + 1;
int n = xfk[i].n;
if (m < 0 || m > 11 || n < 0 || n > 17 || map[m][n] == 1) {
return false;
}
}
return true;
}
//是否能下移
public boolean canMoveDown(){
for (int i = 0; i < 4; i++) {
int m = xfk[i].m ;
int n = xfk[i].n + 1;
if (m < 0 || m > 11 || n < 0 || n > 17 || map[m][n] == 1) {
return false;
}
}
return true;
}
public void moveLeft(){ //左移
for (int i = 0; i<4; i++){
xfk[i].m--;
}
}
public void moveRight(){ //右移
for (int i = 0; i<4; i++){
xfk[i].m++;
}
}
public void moveDown(){ //下移
for (int i = 0; i<4; i++){
xfk[i].n++;
}
}
}
class FK1 extends AbsFK{ //子类
public void reset(){ //实现从基类中继承下来的抽象方法
//给state赋一个随机数
state = (int)(Math.random()*2);
//根据state给小方块数组赋值
if (state == 0){ //横着摆放
for (int i = 0; i<4; i++){
xfk[i].m = 4+i;
xfk[i].n = 0;
}
}
else { //竖着摆放
for (int i = 0; i<4; i++){
xfk[i].m = 5;
xfk[i].n = i;
}
}
}
public void turn(){ //实现从基类继承下来的抽象方法
if (state == 0) { //横->竖
int m = xfk[0].m + 1;
int n = xfk[0].n - 1;
for (int i = 0; i<4; i++){
xfk[i].m = m;
xfk[i].n = n+i;
}
state = 1;
}else { //竖->横
int m = xfk[0].m - 1;
int n = xfk[0].n + 1;
for (int i = 0; i<4; i++){
xfk[i].m = m + i;
xfk[i].n = n;
}
state = 0;
}
}
public boolean canTurn() {
return true;
}
}
class RussiaPanel extends JPanel implements KeyListener{
FK1 dqfk = new FK1(); //基类引用引用子类对象,当前方块
static int time = 500; //线程调用重绘方法的时间间隔
static int [][] map = new int[12][18]; //12列,18行
RussiaPanel(){
dqfk.reset(); //重置当前方块
dqfk.setMap(map);
}
public FK1 getBlock()
{return dqfk;}
public void paint(Graphics g){ //绘制方法
super.paint(g);
//绘制网格
g.setColor(Color.blue);
//13条竖线
for (int i = 0; i<=12; i++){
g.drawLine(i*25,0,i*25,18*25);
}
//19条横线
for (int i = 0; i<=18; i++){
g.drawLine(0,i*25,12*25,i*25);
}
//绘制map中为的位置,障碍物
g.setColor(Color.cyan);
for (int i = 0; i<12 ; i++){
for (int j = 0; j < 18; j++) {
if (map[i][j] == 1) {
g.fill3DRect(i * 25, j * 25, 25, 25, true);
}
}
}
//绘制当前方块
g.setColor(Color.orange);
for (int i = 0; i<4; i++){ //绘制当前方块中的小方块数组中的每一个小方块
int m = dqfk.xfk[i].m;
int n = dqfk.xfk[i].n;
g.fill3DRect(m*25,n*25,25,25,true);
}
}
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
switch(key){
case KeyEvent.VK_UP:
//旋转
if(dqfk.canTurn())
dqfk.turn();
this.repaint(); //立刻刷新
break;
case KeyEvent.VK_DOWN:
//加速
time=100;
break;
case KeyEvent.VK_LEFT:
if (dqfk.canMoveLeft())
dqfk.moveLeft();
this.repaint(); //立刻刷新
break;
case KeyEvent.VK_RIGHT:
if (dqfk.canMoveRight())
dqfk.moveRight();
this.repaint(); //立刻刷新
break;
default:
break;
}
}
public void keyReleased(KeyEvent e) {
//还原速度
int key = e.getKeyCode();
if (key == KeyEvent.VK_DOWN)
time = 500;
}
public void keyTyped(KeyEvent e) {
}
public void deletefullline() //删除满行的方法
{ int fulllinenum=0;
for (int i = 0; i<18 ; i++){
boolean isfull = true;
for (int j = 0; j < 12; j++)
{if( map[j][i]!=1)
isfull=false;
}
if(isfull==true)
{fulllinenum++;
for(int j=0;j<12;j++)
map[j][i]=0;
for(int k=i+1;k<18;k++)
{if(map[k][i]==1)
map[k][i]=0;
map[k][i-1]=1;
}
}
}
RussiaFrame.score+=fulllinenum*10;
RussiaFrame.scoreField.setText(""+ RussiaFrame.score);
}
// boolean isgameover() //判断游戏是否结束
// { boolean []exit;
// for(int k=0;k<18;k++)
// {exit[k]=false;}
// for (int i = 0; i<18 ; i++)
// for (int j = 0; j < 12; j++)
// {
// if(map[j][i]==1)
// exit[i]=true;
// }
// for(int k=0;k<18;k++)
// {if(exit[k]==false)
// { break;
// return false;
//
// }
// else
// return true;
// }
// }
}
public class RussiaFrame extends JFrame
{
RussiaPanel p;
static int score;//记分
static int level; //级数
public static TextField scoreField,levelField;
public static MyTimer timer;
Button play_b,level_up_b,level_down_b,pause_b,exit_b;
//JPanel pa1,pa2;
RussiaFrame (){
setLayout(new GridLayout(1,2,10,10));
p = new RussiaPanel();
p.addKeyListener(p);
timer = new MyTimer(p);
timer.setDaemon(true);
timer.start();
timer.suspend();
add(p);
score=0;
level=1;
JPanel pa1=new JPanel();
//pa2=new Jpanel();
//pa2.add(p);
GridLayout gl=new GridLayout(9,1,1,5); //功能菜单的布局
pa1.setLayout(gl);
Label scorep = new Label("分数:",Label.LEFT); //分数的输出
Label levelp = new Label("级数:",Label.LEFT); //级数的输出
scoreField = new TextField(8);
levelField = new TextField(8);
scoreField.setEditable(false);
levelField.setEditable(false);
play_b = new Button("开始游戏"); //定义play按钮
play_b.setSize(new Dimension(50,200));
play_b.addActionListener(new Command(Command.button_play,p));
level_up_b = new Button("提升级数");//定义提升级数按钮;
level_up_b.setSize(new Dimension(50,200));
level_up_b.addActionListener(new Command(Command.button_levelup,p));
level_down_b = new Button("降低级数"); //定义降低级数按钮
level_down_b.setSize(new Dimension(50,200));
level_down_b.addActionListener(new Command(Command.button_leveldown,p));
pause_b = new Button("游戏暂停"); //定义游戏暂停按钮
pause_b.setSize(new Dimension(50,200));
pause_b.addActionListener(new Command(Command.button_pause,p));
exit_b = new Button("退出"); //定义游戏退出按钮
exit_b.setSize(new Dimension(50,200));
exit_b.addActionListener(new Command(Command.button_quit,p));
pa1.add(scorep);
pa1.add(scoreField);
pa1.add(levelp);
pa1.add(levelField);
pa1.add(play_b);
pa1.add( level_up_b);
pa1.add(level_down_b);
pa1.add(pause_b);
pa1.add( exit_b);
add(pa1);
setVisible(true);
p.requestFocus();
}
//Container con = this.getContentPane();
//con.setLayout(new GridLayout(1,2,10,10));
//con.add(p);
//给当前的窗体对象注册键盘监听器
//p.addKeyListener(p);
//开始线程
public static void main(String[] args) {
RussiaFrame f = new RussiaFrame();
f.setSize(700,500);
f.show();
}
}
class Command implements ActionListener //编辑菜单栏的功能
{
static final int button_play = 1; //给按钮分配编号
static final int button_levelup = 2;
static final int button_leveldown = 3;
static final int button_quit = 4;
static final int button_pause = 5;
static boolean pause_resume=true;
RussiaPanel rp;
int curbutton;
Command( int button,RussiaPanel rp)
{curbutton=button;
this.rp=rp;
}
public void actionPerformed (ActionEvent e)
{
switch(curbutton)
{
case button_play:
RussiaFrame.score=0;
RussiaFrame.scoreField.setText("0");
RussiaFrame.levelField.setText("1");
RussiaFrame.timer.resume();
break;
case button_levelup:
RussiaFrame.level++;
RussiaFrame.levelField.setText(""+RussiaFrame.level);
break;
case button_leveldown:
RussiaFrame.level--;
RussiaFrame.levelField.setText(""+RussiaFrame.level);
break;
case button_pause:
if(pause_resume)
{ RussiaFrame.timer.suspend();
pause_resume=false;
}
else
{RussiaFrame.timer.resume();
pause_resume=true;
}
break;
case button_quit:
System.exit(0);
}
}
}
class MyTimer extends Thread{ //定义线程
RussiaPanel scr;
public MyTimer( RussiaPanel scr){
this.scr = scr;
}
public void run() {
while (true){
if (scr.getBlock().canMoveDown())
{
scr.getBlock().moveDown();
scr.repaint();
}
//自动下落
else {
//记载当前方块的四个小方块的最终位置信息到二维数组上
for (int i = 0; i<4; i++){
int m =scr.getBlock().xfk[i].m;
int n =scr.getBlock().xfk[i].n;
scr.map[m][n] = 1;
scr.deletefullline();
}
//重新定位一个下落的方块
scr.getBlock().reset();
scr.repaint();
}
// if(isgameover()){
// suspend();
//
// }
try {
Thread.sleep((10- RussiaFrame.level + 1)*100);
} catch (InterruptedException ex) {
}
}
}
}
本文摘自: 编程十万个为什么(http://www.bcwhy.com) 详细出处请参考:http://www.bcwhy.com/thread-2562-1-1.html
相关文章
- 暂无相关文章
用户点评