📄 tetris.java
字号:
package homeTask_14_tetris;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Label;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.font.FontRenderContext;
import java.awt.geom.Rectangle2D;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import javax.swing.JButton;
import javax.swing.JFrame;
public class Tetris {
static ScheduledFuture<?> firstGameHandler ;
static ScheduledFuture<?> secondGameHandler ;
static ScheduledFuture<?> thirdGameHandler ;
static ScheduledFuture<?> fourthGameHandler ;
static ScheduledFuture<?> fifthGameHandler ;
public static void main(String[] args) {
final Model model = new Model();
model.init();
final JFrame frame = new JFrame("Tetris");
frame.setSize(400, 660);
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
frame.dispose();
System.exit(0);
}
});
frame.setVisible(true);
frame.setLayout(new BorderLayout());
final JButton buttonStart = new JButton("StartTetris");
final Label labelPoints = new Label("points:");
final Label labelLevel = new Label("level:");
final Label labelLines = new Label("lines:");
final Panel field = new Panel();
final Panel secondPanel = new Panel();
labelPoints.setBackground(Color.blue);
labelLevel.setBackground(Color.blue);
field.setBackground(Color.black);
secondPanel.setBackground(Color.blue);
model.addListener(new ModelListener(){
@Override
public void update(State state) {
labelPoints.setText("points : "+state.getPoints());
labelLevel.setText("level : " +state.getLevel());
labelLines.setText("lines : " +state.getWholeRemoveRows());
}
});
frame.add(field,BorderLayout.CENTER);
frame.add(secondPanel,BorderLayout.EAST);
frame.add(labelPoints, BorderLayout.NORTH);
frame.add(labelLevel, BorderLayout.SOUTH);
secondPanel.setLayout(new BorderLayout());
secondPanel.add(buttonStart,BorderLayout.NORTH);
secondPanel.add(labelLines,BorderLayout.CENTER);
model.addListener(new ModelListener() {
@Override
public void update(State state) {
Graphics gr = field.getGraphics();
final int widField = field.getBounds().width;
final int heigField = field.getBounds().height;
// create image for unblinking field
Image im = field.createImage(widField, heigField);
Graphics g = im.getGraphics();
final int countCols = State.WIDTH;
final int countRows = State.HEIGHT;
Graphics2D g2 = (Graphics2D) gr;
String message ="Game Over";
// showing that game was stop
if (state.getStateOfGame()==1){
Font f = new Font("Serif",Font.ITALIC,40);
g2.setFont(f);
FontRenderContext context = g2.getFontRenderContext();
Rectangle2D bounds = f.getStringBounds(message, context);
double x = (field.getWidth()-bounds.getWidth())/2;
double y = (field.getHeight()-bounds.getHeight())/2;
double ascent = -bounds.getY();
double baseY = y +ascent;
g2.setColor(Color.white);
g2.drawString(message, (int)x, (int)baseY);
return;
}
for (int cols = 0; cols < countCols; cols++)
{
for (int rows = 0; rows < countRows; rows++)
{
int figure_part = state.getField()[cols][rows];
if (figure_part != 0)
{
g.setColor(model.setFigureColor(figure_part));
g.fillRect((cols*(widField)/countCols) , (rows*(heigField)/countRows) , ( widField/ countCols)+1 , (heigField / countRows) );
g.setColor(Color.black);
g.drawRect((cols*(widField)/countCols) , (rows*(heigField)/countRows) , ( widField/ countCols)+1 , (heigField / countRows) );
}
}
}
gr.drawImage(im, 0, 0, widField, heigField, null);
g.dispose();
gr.dispose();
}
});
final Runnable timerTask = new Runnable() {
@Override
public void run() {
model.sendNextAndCheck();
model.moveDown();
}
};
final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
ActionListener acListener = (new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
model.ClearResults();
firstGameHandler = scheduler.scheduleAtFixedRate(timerTask, 800,800 , TimeUnit.MILLISECONDS);
frame.requestFocus();
buttonStart.setEnabled(false);
}
});
buttonStart.addActionListener(acListener);
model.addListener(new ModelListener() {
@Override
public void update(State state) {
int StateOfGame =state.getStateOfGame();
int level = state.getLevel();
if ((StateOfGame==1) ){
switch(level){
case 0: firstGameHandler.cancel(true);break;
case 1: secondGameHandler.cancel(true);break;
case 2: thirdGameHandler.cancel(true);break;
case 3: fourthGameHandler.cancel(true);break;
case 4: fifthGameHandler.cancel(true);break;
}
buttonStart.setEnabled(true);
}
}
});
model.addListener(new ModelListener() {
@Override
public void update(State state) {
int level = state.getLevel();
if (level ==1 && !(firstGameHandler.isCancelled())){
firstGameHandler.cancel(true);
secondGameHandler = scheduler.scheduleAtFixedRate(timerTask, 600, 600, TimeUnit.MILLISECONDS);
}
if (level ==2 && !(secondGameHandler.isCancelled())){
secondGameHandler.cancel(true);
thirdGameHandler = scheduler.scheduleAtFixedRate(timerTask, 500, 400, TimeUnit.MILLISECONDS);
}
if (level ==3 &&!(thirdGameHandler.isCancelled())){
thirdGameHandler.cancel(true);
fourthGameHandler = scheduler.scheduleAtFixedRate(timerTask, 500, 250, TimeUnit.MILLISECONDS);
}
if (level ==4 &&!(fourthGameHandler.isCancelled())){
fourthGameHandler.cancel(true);
fifthGameHandler = scheduler.scheduleAtFixedRate(timerTask, 500, 150, TimeUnit.MILLISECONDS);
}
}
});
frame.addKeyListener(new KeyListener(){
@Override
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode())
{
case KeyEvent.VK_LEFT : model.moveLeft();
break;
case KeyEvent.VK_RIGHT : model.moveRight();
break;
case KeyEvent.VK_UP : model.rotate();
break;
case KeyEvent.VK_DOWN : model.moveDown();
break;
case KeyEvent.VK_SHIFT : model.dropDown();
break;
case KeyEvent.VK_ESCAPE: System.exit(0);
break;
}
}
@Override
public void keyReleased(KeyEvent e) {
}
@Override
public void keyTyped(KeyEvent e) {
}
});
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -