程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java俄羅斯方塊小游戲

Java俄羅斯方塊小游戲

編輯:關於JAVA

Java俄羅斯方塊小游戲。本站提示廣大學習愛好者:(Java俄羅斯方塊小游戲)文章只能為提供參考,不一定能成為您想要的結果。以下是Java俄羅斯方塊小游戲正文


客歲就曾經學了這個技巧了,一向沒去寫,如今抽個時光寫了個俄羅斯方塊游戲。
只要簡略的新游戲,暫停,持續,積分功效。簡略的完成了俄羅斯的經典功效。
不引見了,有興致的本身運轉一下,前面貼出了圖片。

代碼:

package cn.hncu;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.Timer;

public class Tetris extends JFrame{
 public static void main(String[] args) {
 Tetris te = new Tetris();
 te.setVisible(true);
 //假如在界面中添加了編纂框等會搶占核心的控件,則須要用上面的代碼
 //te.requestFocus(true);//讓游戲面板取得核心--搶到鍵盤的監聽
 }
 private TetrisPanel tp;
 JMenuItem itemPause;
 JMenuItem itemContinue;

 public Tetris() {
 this.setDefaultCloseOperation(EXIT_ON_CLOSE);
 this.setLocation(700, 200);
 this.setSize(220, 275);
 this.setResizable(false);
 tp = new TetrisPanel();
 this.getContentPane().add(tp);

 //添加菜單
 JMenuBar menubar = new JMenuBar();
 this.setJMenuBar(menubar);
 JMenu menuGame = new JMenu("游戲");
 menubar.add(menuGame);

 JMenuItem itemNew = new JMenuItem("新游戲");
 itemNew.setActionCommand("new");
 itemPause = new JMenuItem("暫停");
 itemPause.setActionCommand("pause");

 itemContinue = new JMenuItem("持續");
 itemContinue.setActionCommand("continue");
 itemContinue.setEnabled(false);

 menuGame.add(itemNew);
 menuGame.add(itemPause);
 menuGame.add(itemContinue);

 MenuListener menuListener = new MenuListener();
 itemNew.addActionListener(menuListener);
 itemPause.addActionListener(menuListener);
 itemContinue.addActionListener(menuListener);


 //讓全部JFrame添加鍵盤監聽
 this.addKeyListener( tp.listener );
 }
 class MenuListener implements ActionListener{
 @Override
 public void actionPerformed(ActionEvent e) {
  //玩新游戲
  if(e.getActionCommand().equals("new")){
  tp.newGame();
  }
  if(e.getActionCommand().equals("pause")){
  timer.stop();
  itemContinue.setEnabled(true);
  itemPause.setEnabled(false);
  }
  if(e.getActionCommand().equals("continue")){
  timer.restart();
  itemContinue.setEnabled(false);
  itemPause.setEnabled(true);
  }
 }
 }

 private Timer timer;

 class TetrisPanel extends JPanel{
 // 方塊的外形:
  // 第一維代表方塊類型(包含7種:S、Z、L、J、I、O、T)
  // 第二維代表扭轉次數
  // 第三四維代表方塊矩陣
  // shapes[type][turnState][i] i--> block[i/4][i%4]
  int shapes[][][] = new int[][][] {
  /*
   * 模板 { {0,0,0,0,0,0,0,0, 0,0,0,0, 0,0,0,0}, {0,0,0,0,0,0,0,0, 0,0,0,0,
   * 0,0,0,0}, {0,0,0,0,0,0,0,0, 0,0,0,0, 0,0,0,0}, {0,0,0,0,0,0,0,0,
   * 0,0,0,0, 0,0,0,0} }
   */
   // I (※把版本1中的橫條從第1行換到第2行)
   { { 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
    { 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 },
    { 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
    { 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 } },
   // S
   { { 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
    { 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0 },
    { 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
    { 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0 } },
   // Z
   { { 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
    { 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 },
    { 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
    { 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 } },
   // J
   { { 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 },
    { 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
    { 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 },
    { 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
   // O
   { { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
    { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
    { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
    { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
   // L
   { { 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 },
    { 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
    { 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
    { 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
   // T
   { { 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
    { 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
    { 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
    { 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0 } }
    };

 private int blockType;//方塊類型
 private int turnState;//扭轉狀況
 private int x;//方塊的地位x--列的地位--列號
 private int y;//方塊的地位y--行的地位--行號

 private int map[][]=new int[13][23];//地圖:12列22行。為避免越界,數組開成:13列23行


 private int delay=1000;
 public TimerKeyLister listener=new TimerKeyLister(); 

 private int score=0;//分數

 public TetrisPanel(){
  newGame();
  nextBlock();
  //timer = new Timer(delay,listener);
  //timer.start();
 }

 public void newGame() {
  blockType = (int)(Math.random()*1000)%7;
  turnState = (int)(Math.random()*1000)%4;
  x=4;
  y=0;

  for( int i=0;i<12;i++){//走列
  for(int j=0;j<21;j++){//走行
   if(i==0 || i==11){//3為界面邊框的格
   map[i][j]=3;//按理只需用0和1之外的整數便可以,但這裡用3有特別感化--前面用
   }else{
   map[i][j]=0;
   }
  }
  map[i][21]=3;//3為界面邊框的格
  }

  if(timer!=null){
  timer.stop();
  }

  delay=1000;
  timer = new Timer(delay,listener);
  timer.start();
 }

 private void nextBlock() {
  blockType = (int)(Math.random()*1000)%7;
  turnState = (int)(Math.random()*1000)%4;
  x=4;
  y=0;
  //game Over
  if(crash(x,y,blockType,turnState)==0){
  timer.stop();
  int option = JOptionPane.showConfirmDialog(this,
   "Game Over!!,還敢來嗎...");
  if (option == JOptionPane.OK_OPTION) {
   newGame();
  } else if (option == JOptionPane.NO_OPTION) {
   System.exit(0);
  }
  }
 }

 private void down() {
  if( crash(x,y+1,blockType,turnState)==0 ){//留意,這裡用y+1,是斷定塊往下失落一格後,map中對應地位能否為聚積塊或框架
  add(x,y,blockType,turnState);//把以後方塊的信息保留到地圖
  nextBlock();
  }else{
  y++;
  }
  repaint();
 }
 private void left() {
  if(x>=0){
  x -= crash(x-1,y,blockType,turnState);
  }
  repaint();
 }
 private void right() {
  if(x<8){
  x += crash(x+1,y,blockType,turnState);
  }
  repaint();
 }
 private void turn() {
  if(crash(x,y,blockType,(turnState+1)%4)==1 ){
  turnState = (turnState+1)%4;
  }
  repaint();
 }

 private void add(int x, int y, int blockType, int turnState) {
  for( int a=0; a<4; a++){
  for(int b=0; b<4; b++){
   if( shapes[blockType][turnState][a*4+b] ==1 ){
   map[x+b+1][y+a] = 1;
   }
  }
  }
  tryDelLine();
 }

 //消行
 private void tryDelLine(){
  for(int b=0;b<21;b++){
  int c=1;
  for(int a=0;a<12;a++){
   c &= map[a][b];//全體是1,c的成果才是1
  }
  if(c==1){//有一行須要消
   //順次往下挪動一行
   for(int d=b; d>0; d--){
   for(int e=0;e<11;e++){
    map[e][d] = map[e][d-1];
   }
   }
   //加分
   score +=100;
   delay /=1.05;
   timer.setDelay(delay);
  }
  }

 }

 //參數例子: 4,3,2,3
 //斷定有沒有碰撞
 private int crash(int x, int y, int blockType, int turnState){
  for( int a=0; a<4; a++){
  for(int b=0; b<4; b++){
//   if( (shapes[blockType][turnState][a*4+b]==1 && map[x+b+1][y+a] ==1) ||
//    (shapes[blockType][turnState][a*4+b]==1 && map[x+b+1][y+a] ==3 ) ){
//   }
   if( (shapes[blockType][turnState][a*4+b] & map[x+b+1][y+a]) ==1 ){
   return 0;//碰撞
   }
  }
  }
  return 1;//沒有碰撞
 }

 @Override
 public void paint(Graphics g) {
//  blockType =6;
//  turnState = 3;
//  x=4;
//  y=6;
  super.paint(g);//清除殘影

  g.setColor(new Color(153,51,205));
  //畫以後方塊
  for(int j=0;j<16;j++){
  if(shapes[blockType][turnState][j]==1){
   g.fillRect((j%4+x+1)*10, (j/4+y)*10, 10, 10);
   g.setColor(Color.cyan);
   g.drawRect((j%4+x+1)*10, (j/4+y)*10, 10, 10);
   g.setColor(new Color(153,51,205));
  }
  }

  //畫界面框架 和 聚積塊---全部地圖
  g.setColor(Color.red);
  for( int i=0;i<12;i++){//走列
  for(int j=0;j<22;j++){//走行
   if(map[i][j]==3){
   g.drawRect(i*10, j*10, 10, 10);
   }else if(map[i][j]==1){
   g.fillRect(i*10, j*10, 10, 10);
   g.setColor(Color.GREEN);
   g.drawRect(i*10, j*10, 10, 10);
   g.setColor(Color.red);
   }
  }
  }

  //顯示分數,同時為版面雅觀,在界面上再加點器械
  // 畫方塊區右邊部門
  g.setColor(Color.red);
  g.setFont(new Font("aa", Font.BOLD, 11));
  g.drawString("score=" + score, 130, 20);

  g.setFont(new Font("aa", Font.PLAIN, 13));
  g.setColor(Color.blue);
  g.drawString("謝絕盜版游戲,", 125, 70);
  g.drawString("留意自我掩護。", 125, 90);
  g.drawString("嚴防上當受騙。", 125, 110);
  g.drawString("過度游戲益腦,", 125, 130);
  g.drawString("陷溺游戲傷身。", 125, 150);
  g.drawString("公道支配時光,", 125, 170);
  g.drawString("享用安康生涯。", 125, 190);

 }

 class TimerKeyLister extends KeyAdapter implements ActionListener{
  @Override
  public void actionPerformed(ActionEvent e) {
  down();
  }

  @Override
  public void keyPressed(KeyEvent e) {
  switch(e.getKeyCode()){
   case KeyEvent.VK_DOWN:
   down(); break;
   case KeyEvent.VK_LEFT:
   left();break;
   case KeyEvent.VK_RIGHT:
   right();break;
   case KeyEvent.VK_UP:
   turn();break;
   case KeyEvent.VK_F1:
   plug();
   case KeyEvent.VK_F2:
   time();
  }
  }

 }

 public void plug() {
  score+=100;
 }

 public void time() {
  delay =1000;
  timer.setDelay(delay);
 }

 }


}

運轉界面:

以上就是本文的全體內容,願望對年夜家的進修有所贊助,也願望年夜家多多支撐。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved