Java俄罗斯方块小游戏
字体:[ ] 类型:转载 时间:
这篇文章主要为大家详细介绍了Java俄罗斯方块小游戏,实现了俄罗斯的经典功能,感兴趣的小伙伴们可以参考一下
去年就已经学了这个技术了,一直没去写,现在抽个时间写了个俄罗斯方块游戏。
只有简单的新游戏,暂停,继续,积分功能。简单的实现了俄罗斯的经典功能。
不介绍了,有兴趣的自己运行一下,后面贴出了图片。
package cn.
import java.awt.C
import java.awt.F
import java.awt.G
import java.awt.event.ActionE
import java.awt.event.ActionL
import java.awt.event.KeyA
import java.awt.event.KeyE
import javax.swing.JF
import javax.swing.JM
import javax.swing.JMenuB
import javax.swing.JMenuI
import javax.swing.JOptionP
import javax.swing.JP
import javax.swing.T
public class Tetris extends JFrame{
public static void main(String[] args) {
Tetris te = new Tetris();
te.setVisible(true);
//如果在界面中添加了编辑框等会抢占焦点的控件,则需要用下面的代码
//te.requestFocus(true);//让游戏面板获得焦点--抢到键盘的***
private TetrisP
JMenuItem itemP
JMenuItem itemC
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{
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);
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 } },
{ { 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 } },
{ { 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 } },
{ { 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 } },
{ { 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 } },
{ { 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 } },
{ { 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 blockT//方块类型
private int turnS//旋转状态
//方块的位置x--列的位置--列号
//方块的位置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;
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有特殊作用--后面用
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;
//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();
repaint();
private void left() {
x -= crash(x-1,y,blockType,turnState);
repaint();
private void right() {
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++){
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;//没有碰撞
public void paint(Graphics g) {
blockType =6;
turnState = 3;
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{
public void actionPerformed(ActionEvent e) {
public void keyPressed(KeyEvent e) {
switch(e.getKeyCode()){
case KeyEvent.VK_DOWN:
case KeyEvent.VK_LEFT:
case KeyEvent.VK_RIGHT:
case KeyEvent.VK_UP:
case KeyEvent.VK_F1:
case KeyEvent.VK_F2:
public void plug() {
score+=100;
public void time() {
delay =1000;
timer.setDelay(delay);
运行界面:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具>> java写的俄罗斯方块小游戏
java写的俄罗斯方块小游戏
所属分类:
下载地址:
Columns.rar文件大小:5.92 MB
分享有礼! 》
请点击右侧的分享按钮,把本代码分享到各社交媒体。
通过您的分享链接访问Codeforge,每来2个新的IP,您将获得0.1 积分的奖励。
通过您的分享链接,每成功注册一个用户,该用户在Codeforge上所获得的每1个积分,您都将获得0.2 积分的分成奖励。
java写的俄罗斯方块小游戏,适合初学者研究学习
Sponsored links
源码文件列表
温馨提示: 点击源码文件名可预览文件内容哦 ^_^
(提交有效评论获得积分)
评论内容不能少于15个字,不要超出160个字。
评价成功,多谢!
下载Columns.rar
CodeForge积分(原CF币)全新升级,功能更强大,使用更便捷,不仅可以用来下载海量源代码马上还可兑换精美小礼品了
您的积分不足,优惠套餐快速获取 30 积分
10积分 / ¥100
30积分 / ¥200原价 ¥300 元
100积分 / ¥500原价 ¥1000 元
订单支付完成后,积分将自动加入到您的账号。以下是优惠期的人民币价格,优惠期过后将恢复美元价格。
支付宝支付宝付款
微信钱包微信付款
更多付款方式:、
您本次下载所消耗的积分将转交上传作者。
同一源码,30天内重复下载,只扣除一次积分。
鲁ICP备号-3 runtime:Elapsed:143.413ms - init:0.1;find:0.8;t:0.5;tags:0.2;related:63.6;comment:0.2; 27.69
登录 CodeForge
还没有CodeForge账号?
Switch to the English version?
^_^"呃 ...
Sorry!这位大神很神秘,未开通博客呢,请浏览一下其他的吧java swing编写俄罗斯方块小游戏源代码下载
小弟写的俄罗斯方块小游戏 目前能正常运行 忘各位指出不对的地方
由编辑于 21:56:01
由编辑于 9:47:54
请下载代码后再发表评论
//russia/russia/.classpath/russia/.project/russia/22.jpg/russia/333.jpg/russia/bin/russia/bin/russia/russia/bin/russia/game/russia/bin/russia/game/square/russia/bin/russia/game/square/FileHelpers.class/russia/src/russia/src/russia/russia/src/russia/game/russia/src/russia/game/square
编程语言基础
数据库开发
客户端开发
服务器软硬件
开源组件类库
暂无贡献等级
暂无贡献等级
暂无贡献等级
暂无贡献等级
暂无贡献等级
暂无贡献等级
暂无贡献等级
暂无贡献等级
暂无贡献等级
暂无贡献等级
暂无贡献等级
暂无贡献等级
暂无贡献等级
暂无贡献等级
暂无贡献等级
暂无贡献等级
暂无贡献等级
暂无贡献等级
扫描二维码关注最代码为好友"/>扫描二维码关注最代码为好友