p align="left"> } public int getWidth() { return pat[0].length; } public int getCell(int i, int j) public void draw(Graphics g) { for (int i=0; i<pat.length; i++) { for (int j=0; j<pat[i].length; j++) if (pat[i][j]!=0){ g.setColor(COLORS[pat[i][j]]); g.fillRect((x+j)*30+11,(i+y)*30+1,28,28); } } drawNext(g,350,50); } public void drawNext(Graphics g, int px, int py) { int[][] p = new int[PATTERN[nextType].length][PATTERN[nextType][0].length]; for (int i=0; i<p.length; i++) { for (int j=0; j<p[0].length; j++) { p[i][j] = PATTERN[nextType][i][j]; } } for (int kr=0; kr<nextRot; kr++){ int[][] p2 = new int[p[0].length][p.length]; for (int i=0; i<p.length; i++) { for (int j=0; j<p[0].length; j++) { p2[j][i] = p[i][j]; } } p = new int[p2.length][p2[0].length]; for (int i=0; i<p.length; i++) for (int j=0; j<p[0].length; j++) { p[i][j] = p2[p.length-i-1][j]; } } for (int i=0; i<4; i++) for (int j=0; j<4; j++) { g.setColor(COLORS[0]); g.fillRect(j*30+px, i*30+py, 28,28); } for (int i=0; i<p.length; i++) for(int j=0; j<p[0].length; j++) { g.setColor(COLORS[p[i][j]]); g.fillRect(j*30+px, i*30+py, 28,28); } } public void rotate() { int[][] newPat = new int[pat[0].length][pat.length]; for (int i=0; i<pat.length; i++) for (int j=0; j<pat[0].length; j++) { newPat[j][i] = pat[i][j]; } pat = new int[newPat.length][newPat[0].length]; for (int i=0; i<pat.length; i++) for (int j=0; j<pat[0].length; j++) { pat[i][j] = newPat[pat.length-i-1][j]; } } public boolean canDown(Glass stakan) { int[][] a = new int[21][10]; for (int i = 0; i<stakan.getHeight(); i++) { for (int j = 0; j<stakan.getWidth(); j++) { a[i][j] = stakan.getCell(i,j); } } for (int i=0; i<pat.length; i++) { for (int j=0; j<pat[i].length; j++) { int xx = x+j, yy = y+i+1; if (pat[i][j]>0 && a[yy][xx]>0) { return false; } } } return true; } public void moveDown() { y++; } public boolean canLeft(Glass stakan) { if (x==0) return false; int [][] s = new int[pat.length][pat[0].length]; for (int i=0; i<s.length; i++) for (int j=0; j<s[0].length; j++) { s[i][j] = stakan.getCell(y+i,j+x-1); } for (int i=0; i<s.length; i++) for (int j=0; j<s[0].length; j++) { if (s[i][j]*pat[i][j]>0) { return false; } } return true; } public boolean canRight(Glass stakan) { if (x==stakan.getWidth()-pat[0].length) return false; int [][] s = new int[pat.length][pat[0].length]; for (int i=0; i<s.length; i++) for (int j=0; j<s[0].length; j++) { s[i][j] = stakan.getCell(y+i,j+x+1); } for (int i=0; i<s.length; i++) for (int j=0; j<s[0].length; j++) { if (s[i][j]*pat[i][j]>0) { return false; } } return true; } public boolean canRotate(Glass stakan) { if (x+pat.length>stakan.getWidth()) return false; int[][] tmpPat = new int[pat[0].length][pat.length]; for (int i=0; i<pat.length; i++) for (int j=0; j<pat[0].length; j++) { tmpPat[j][i] = pat[i][j]; } int[][] tPat = new int[tmpPat.length][tmpPat[0].length]; for (int i=0; i<tPat.length; i++) for (int j=0; j<tPat[0].length; j++) { tPat[i][j] = tmpPat[tPat.length-i-1][j]; } int [][] s = new int[tPat.length][tPat[0].length]; for (int i=0; i<s.length; i++) for (int j=0; j<s[0].length; j++) { s[i][j] = stakan.getCell(y+i,j+x); } for (int i=0; i<s.length; i++) for (int j=0; j<s[0].length; j++) { if (s[i][j]*tPat[i][j]>0) { return false; } } return true; } public void moveLeft() { if (x>0) { x--; } } public void moveRight() { if (x<10-pat[0].length) { x++; } } } Файл Glass.java package Tetr; import java.awt.*; /** * * @author irdis_13 */ public class Glass { private int[] x = {0, 10, 10, 310, 310, 320, 320, 0}; private int[] y = {0, 0, 600, 600, 0, 0, 610, 610}; private int[][] cells = new int[21][10]; public Glass() { clearGlass(); } public void clearGlass() { for (int i = 0; i<cells.length; i++) { for (int j = 0; j<cells[i].length; j++) { cells[i][j] = (i==cells.length-1) ? 10 : 0; } } } public int getHeight() { return cells.length; } public int getWidth() { return cells[0].length; } public int getCell(int i, int j) { return cells[i][j]; } public void draw(Graphics g) { g.setColor(Color.GRAY); g.fillRect(10,0,300,600); g.setColor(Color.BLUE); g.fillPolygon(x,y,x.length); for (int i = 0; i<cells.length-1; i++) { for (int j = 0; j<cells[i].length; j++) { drawCell(g,i,j); } } } public void drawCell(Graphics g, int i, int j) { g.setColor(Figure.COLORS[cells[i][j]]); g.fillRect(j*30+11,i*30+1,28,28); } public int acceptFigure(Figure f){ for (int i=0; i<f.getHeight(); i++) { for (int j=0; j<f.getWidth(); j++) { int xx = f.getX()+j, yy = f.getY()+i; if (f.getCell(i,j)!=0) { // клетка не пуста cells[yy][xx] = f.getCell(i,j); } } } int lines = clearFullLines(); if (lines>0) return lines; if (f.getY()==0) return -1; return 0; } private int clearFullLines() { int linesCount = 0; lineLoop: for (int i=1; i<20; i++){ for (int j=0; j<10; j++) { if (cells[i][j]==0) { continue lineLoop; } } linesCount++; for (int j=i; j>=1; j--) { cells[j]=cells[j-1]; } cells[0] = new int[10]; for (int j=0; j<10; j++) { cells[0][j]=0; } } return linesCount; } } Файл PlaySound.java package Tetr; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.sound.midi.*; import java.io.*; /** * * @author irdis_13 */ public class PlaySound implements ActionListener{ public PlaySound(String s){ play(s); } protected void play(String file) { try{ File f = new File(file); Sequencer sequencer = MidiSystem.getSequencer(); if (sequencer == null) { System.err.println("Sequenser not supported"); } sequencer.open(); Sequence seq = MidiSystem.getSequence(f); sequencer.setSequence(seq); sequencer.start(); sequencer.setLoopCount(1000); }catch(Exception e){ System.err.println(e); } } public void actionPerformed(ActionEvent e) { throw new UnsupportedOperationException("Not supported yet."); } } Файл TetrisFrame.java package Tetr; import Tetr.TetrisGamePanel; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; /** * * @author irdis_13 */ public class TetrisFrame extends javax.swing.JFrame { /** Creates new form TetrisFrame */ public TetrisFrame() { initComponents(); tetrisGamePanel1.grabFocus(); } // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { buttonPanel1 = buttonPanel1 = new ButtonPanel(this); menuBar = new javax.swing.JMenuBar(); jMenu1 = new javax.swing.JMenu(); menuNewGame = new javax.swing.JMenuItem(); menuPauseGame = new javax.swing.JMenuItem(); jSeparator1 = new javax.swing.JSeparator(); menuFileExit = new javax.swing.JMenuItem(); tetrisGamePanel1 = new Tetr.TetrisGamePanel(); menuBar1 = new javax.swing.JMenuBar(); jMenu2 = new javax.swing.JMenu(); menuNewGame1 = new javax.swing.JMenuItem(); menuPauseGame1 = new javax.swing.JMenuItem(); jSeparator2 = new javax.swing.JSeparator(); menuFileExit1 = new javax.swing.JMenuItem(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); setFocusable(false); jMenu1.setText("File"); menuNewGame.setText("Item"); jMenu1.add(menuNewGame); menuPauseGame.setText("Item"); jMenu1.add(menuPauseGame); jMenu1.add(jSeparator1); menuFileExit.setText("Item"); jMenu1.add(menuFileExit); menuBar.add(jMenu1); tetrisGamePanel1.addKeyListener(new java.awt.event.KeyAdapter() { public void keyPressed(java.awt.event.KeyEvent evt) { tetrisGamePanel1KeyPressed(evt); } }); menuBar1.setFocusable(false); jMenu2.setText("File"); jMenu2.setFocusable(false); menuNewGame1.setText("Start New Game"); menuNewGame1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { menuNewGame1ActionPerformed(evt); } }); jMenu2.add(menuNewGame1); menuPauseGame1.setText("Stop Game"); menuPauseGame1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { menuPauseGame1ActionPerformed(evt); } }); jMenu2.add(menuPauseGame1); jMenu2.add(jSeparator2); menuFileExit1.setText("Exit"); menuFileExit1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { menuFileExit1ActionPerformed(evt); } }); jMenu2.add(menuFileExit1); menuBar1.add(jMenu2); setJMenuBar(menuBar1); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(153, 153, 153) .addComponent(buttonPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(tetrisGamePanel1, javax.swing.GroupLayout.PREFERRED_SIZE, 485, javax.swing.GroupLayout.PREFERRED_SIZE))) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(buttonPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(18, 18, 18) .addComponent(tetrisGamePanel1, javax.swing.GroupLayout.PREFERRED_SIZE, 612, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); pack(); }// </editor-fold>//GEN-END:initComponents private void tetrisGamePanel1KeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_tetrisGamePanel1KeyPressed TetrisGamePanel p = (TetrisGamePanel)tetrisGamePanel1; switch (evt.getKeyCode()) { case KeyEvent.VK_LEFT: p.figureMoveLeft(); break; case KeyEvent.VK_RIGHT: p.figureMoveRight(); break; case KeyEvent.VK_UP: p.figureRotate(); break; case KeyEvent.VK_DOWN: p.figureMoveDown(); break; case KeyEvent.VK_F2: p.startNewGame(); break; case KeyEvent.VK_F3: p.gamePauseResume(); break; default: return; } repaint(); }//GEN-LAST:event_tetrisGamePanel1KeyPressed private void menuNewGame1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_menuNewGame1ActionPerformed TetrisGamePanel p = (TetrisGamePanel)tetrisGamePanel1; p.startNewGame(); }//GEN-LAST:event_menuNewGame1ActionPerformed private void menuPauseGame1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_menuPauseGame1ActionPerformed TetrisGamePanel p = (TetrisGamePanel)tetrisGamePanel1; p.stopGame(); }//GEN-LAST:event_menuPauseGame1ActionPerformed private void menuFileExit1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_menuFileExit1ActionPerformed System.exit(0); }//GEN-LAST:event_menuFileExit1ActionPerformed /** * @param args the command line arguments */ public void continueButtonPressed(ActionEvent evt) { TetrisGamePanel p = (TetrisGamePanel)tetrisGamePanel1; p.resumeGame(); } public void pauseButtonPressed(ActionEvent evt) { TetrisGamePanel p = (TetrisGamePanel)tetrisGamePanel1; p.pauseGame(); } // Variables declaration - do not modify//GEN-BEGIN:variables private Tetr.ButtonPanel buttonPanel1; private javax.swing.JMenu jMenu1; private javax.swing.JMenu jMenu2; private javax.swing.JSeparator jSeparator1; private javax.swing.JSeparator jSeparator2; private javax.swing.JMenuBar menuBar; private javax.swing.JMenuBar menuBar1; private javax.swing.JMenuItem menuFileExit; private javax.swing.JMenuItem menuFileExit1; private javax.swing.JMenuItem menuNewGame; private javax.swing.JMenuItem menuNewGame1; private javax.swing.JMenuItem menuPauseGame; private javax.swing.JMenuItem menuPauseGame1; private Tetr.TetrisGamePanel tetrisGamePanel1; } Файл TetrisGamePanel.java package Tetr; import java.awt.*; import java.awt.event.*; import javax.swing.*; /** * * @author irdis_13 */ public class TetrisGamePanel extends javax.swing.JPanel implements GamePanel,ActionListener { private Glass stakan; private Figure fig = null; private int score = 0; private int gameState; private int[] DELAY = {500, 450, 400, 350, 300, 250, 200, 150, 100, 50}; private int level = 1; Timer t = new javax.swing.Timer(DELAY[level], this); public TetrisGamePanel() { stakan = new Glass(); startNewGame(); t.start(); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); stakan.draw(g); fig.draw(g); g.setFont(new Font("Times New Roman", Font.BOLD, 24)); g.setColor(Color.BLACK); g.drawString("Счет: " + score, 350, 250); g.drawString("Уровень: " + level, 350, 300); } public int getScore() { return score; } public void startNewGame() { score = 0; level = 1; fig = new Figure(); stakan = new Glass(); gameState = PLAY; } public void pauseGame() { if (gameState == PLAY) { gameState = PAUSE; } } public void resumeGame() { if (gameState == PAUSE) { gameState = PLAY; } } public void stopGame() { gameState = STOP; } public int getState() { return gameState; } public void figureMoveRight(){ if (fig.canRight(stakan)& gameState==PLAY) fig.moveRight(); } public void figureMoveLeft(){ if (fig.canLeft(stakan)& gameState==PLAY) fig.moveLeft(); } public void figureMoveDown(){ t.setDelay(DELAY[level]/20); } public void figureRotate(){ if (fig.canRotate(stakan)& gameState==PLAY) fig.rotate(); } public void gamePauseResume(){ if (gameState==PLAY) { gameState = PAUSE; } else if (gameState==PAUSE) { gameState = PLAY; } } public void actionPerformed(ActionEvent e) { if (gameState != PLAY) { return; } int bonus; if (fig.canDown(stakan)) { fig.moveDown(); } else { if ((bonus = stakan.acceptFigure(fig)) < 0) { stopGame(); } if (bonus > 0) { switch (bonus) { case 4: score += 20; case 3: score += 15; case 2: score += 10; case 1: score += 5; } int newLevel = score / 100 + 1; if (newLevel > level && level < 9) { level++; } } if (gameState == PLAY) { fig = new Figure(); t.setDelay(DELAY[level]); } } repaint(); } // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGap(0, 400, Short.MAX_VALUE) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGap(0, 300, Short.MAX_VALUE) ); }// </editor-fold>//GEN-END:initComponents } Додаток Д Результат роботи програми Результат роботи програми зображено на рисунку 5 Рисунок 5 - Результат роботи програми
Страницы: 1, 2, 3
|