Java版本实现俄罗斯方块小游戏

article/2025/11/1 18:16:56

效果预览图

视频预览:

俄罗斯方块

代码部分

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Random;public class Block0011 extends JFrame implements KeyListener, ActionListener, MouseListener {//    记分int fenshu=0;//    当前游戏的当前状态 0表示游戏中 1表示暂停 2表示游戏结束 默认状态为0(游戏中)int zhuangtai=0;//    作弊模式boolean zuobi=false;//    防止闪烁//将绘制到临时图片上,在把临时图片绘制到窗口上private Image image=null;Graphics gf=null;boolean[] qipan=new boolean[160];//    定义一个内部类class Point{public int x;public int y;public Point (int x,int y){this.x=x;this.y=y;}}//临时方块左上角的位置Point point=new Point(4,1);//    定义一个旋转点Point rotate=new Point(1,1);//      下落方块的形状Point [] points=newfangkuai(0);Timer timer = new Timer(500, this);//设置定时器,每500毫秒一次public void Tian(){this.setSize(500,800);this.setVisible(true);timer.start();//定时器的开关this.addKeyListener(this);}public void paint(Graphics g) {//初始化临时图片//解决闪烁问题if(image==null){image=this.createImage(500,800);}if(gf==null){gf=image.getGraphics();}//   擦除背景gf.setColor(Color.white);gf.fill3DRect(0,0,500,800,true);//绘制白色背景//        遍历出160个空格//绘制棋盘中的方块gf.setColor(Color.red);for (int i = 0; i <160 ; i++) {int x;int y;x=i%10;y=i/10;
//            绘制棋盘if(qipan[i]){gf.fill3DRect(x*50,y*50,50,50,true);}}//绘制的临时下落的方块for (Point p:points){gf.fill3DRect((p.x+point.x)*50,(p.y+point.y)*50,50,50,true);}//        绘制棋盘的网格
//        画竖线for (int j = 0; j <=500 ; j+=50) {gf.drawLine(j,0,j,800);}
//          画横线for (int i = 0; i <=800 ; i+=50) {gf.drawLine(0,i,500,i);}//   显示分数if(zhuangtai==0||zhuangtai==1){gf.setColor(Color.yellow);gf.fill3DRect(0,0,500,100,true);gf.setColor(Color.black);gf.setFont(new Font("微软雅黑", 10, 20)); //设置字体gf.drawString("分数:"+fenshu,200,70);}else if(zhuangtai==2){gf.setColor(Color.yellow);gf.fill3DRect(0,0,500,100,true);gf.setColor(Color.black);gf.setFont(new Font("微软雅黑", 10, 20)); //设置字体gf.drawString("游戏结束  您的最终分数为:"+fenshu+"分",100,70);}// 把图片的内容绘制到窗口上g.drawImage(image,0,0,null);}@Overridepublic void actionPerformed(ActionEvent e){
//       临时方块下落处理DownLine();}@Overridepublic void keyTyped(KeyEvent e) {}@Overridepublic void keyPressed(KeyEvent e) {
// 获取从键盘输入的键int key = e.getKeyCode();if(key == KeyEvent.VK_SPACE){//空格键
//            0表示正常 1表示暂停 2表示结束if(zhuangtai==0){
//                从正常状态变为暂停状态zhuangtai=1;timer.stop();}else if(zhuangtai==1){
//                从暂停状态变为正常状态zhuangtai=0;timer.start();}else if(zhuangtai==2){zhuangtai=0;
//                启动定时器timer.start();
//                清空棋盘for (int i = 0; i < 160; i++) {qipan[i]=false;}
//                重置临时方块的位置和形状point=new Point(4,1);points=newfangkuai(0);
//                重置分数fenshu=0;}}
//        当程序处于暂停状态时就不处理上下左右键if(zhuangtai==0){//        左if(key == KeyEvent.VK_LEFT){if(isleftnove()){point.x--;}
//        右}else if (key == KeyEvent.VK_RIGHT) {if(isrightnove()){point.x++;}
//        上} else if (key == KeyEvent.VK_UP) {xuanzhuan();
//        下} else if (key == KeyEvent.VK_DOWN) {//方块加速
//            临时方块下落一行的处理DownLine();
//         T}else if (key == KeyEvent.VK_T){//作弊键zuobi=true;}}
//        强制重绘页面repaint();}@Overridepublic void keyReleased(KeyEvent e) {}@Overridepublic void mouseClicked(MouseEvent e) {}@Overridepublic void mousePressed(MouseEvent e) {}@Overridepublic void mouseReleased(MouseEvent e) {}@Overridepublic void mouseEntered(MouseEvent e) {}@Overridepublic void mouseExited(MouseEvent e) {}//    临时方块下落一格的判断void DownLine(){//判断下落的方块是否触底boolean flag=false;
//        找到正在执行的这个方块的索引
//        判断所有方块是否合理for (Point p:points){int i=(point.y+p.y+1)*10+(point.x+p.x);if(i>159||qipan[i]){flag=true;}}//        重置方块
//        如果方块触底将其保存在棋盘中,并重置方块if(flag){for(Point p:points){int i=(point.y+p.y)*10+(point.x+p.x);qipan[i]=true;}point.x=4;point.y=1;points=newfangkuai(-1);
//            //输出测试
//            for(int y=0;y<16;y++)
//            {
//                for(int x=0;x<10;x++)
//                {
//                    System.out.print((qipan[y*10+x]?1:0)+",");
//                }
//                System.out.println();
//            }
//            System.out.println("---------------------------------");}else{// 下落一格point.y++;}//        消除整行
//        定义一个临时数组boolean linshi[]=new boolean[160];//作弊模式,消除最后4行if(zuobi==true){for (int i = 120; i <160 ; i++) {qipan[i]=true;}zuobi=false;}//        临时数组的当前行数int linshihang=15;for (int j = 15; j >=0 ; j--) {int num=0;for (int k = 0; k <10 ; k++) {int a=j*10+k;if(qipan[a]){num++;}}
//            保留此行if(num!=10){for (int k = 0; k <10 ; k++) {int a=j*10+k;int b=linshihang*10+k;linshi[b]=qipan[a];}linshihang--;}else{fenshu+=100;}}qipan=linshi;
//        判断旗子是否在第一格 如果在第一格的话结束游戏for (int i = 0; i < 20; i++) {if(qipan[i]){zhuangtai=2;System.out.println("游戏结束");timer.stop();break;}}repaint();}
//    判断临时块是否能向左移动一格boolean isleftnove(){
//        判断临时方块是否能够左移
//        如果返回true表示能向左移 false表示不能向左移boolean flag=true;
//        1.判断向左移动是否会撞墙
//        2.判断向左移时是否有方块阻挡 判断方块阻挡的条件 true就是有方块不能移动 false就是没有方块可以移动for(Point p:points){int i=(point.y+p.y)*10+(point.x+p.x)-1;if((p.x+point.x-1)<0||qipan[i]){flag=false;break;}}return flag;}//    判断临时块是否能向右移动一格boolean isrightnove(){boolean flag=true;for(Point p:points){int i=(point.y+p.y)*10+(point.x+p.x)+1;if((p.x+point.x+1)>9||qipan[i]){flag=false;break;}}return flag;}void xuanzhuan(){if(rotate.x==-1&&rotate.y==-1){return;}//        是否能旋转boolean shifounenxuanzhuang=true;//预先旋转判断,判断旋转后的小方块位置是否合法for (int i=0; i <points.length ; i++) {Point p2=new Point(0,0);p2.x=points[i].y-rotate.y+rotate.x;p2.y=-points[i].x+rotate.y+rotate.x;
//            1,出格了就不能旋转if((p2.x+point.x)<0||(p2.x+point.x)>9||(p2.y+point.y)>15){shifounenxuanzhuang=false;}
//            2,棋盘上有方块也不能旋转if(qipan[(p2.y+point.y)*10+(p2.x+point.x)]){shifounenxuanzhuang=false;}}//能旋转if(shifounenxuanzhuang){for (int i=0; i <points.length ; i++) {Point p2=new Point(0,0);p2.x=points[i].y-rotate.y+rotate.x;p2.y=-points[i].x+rotate.y+rotate.x;points[i]=p2;}}}//    随机产生方块Point[] newfangkuai(int a){if(a==-1){Random rd=new Random();a=rd.nextInt(7);}//        正方形Point [] points1={(new Point(0,0)),(new Point(1,0)),(new Point(0,1)),(new Point(1,1))};
//        I形Point [] points2={(new Point(0,0)),(new Point(0,1)),(new Point(0,2)),(new Point(0,3))};
//        s形Point [] points3={(new Point(1,0)),(new Point(2,0)),(new Point(0,1)),(new Point(1,1))};
//        t形Point [] points4={(new Point(0,0)),(new Point(1,0)),(new Point(2,0)),(new Point(1,1))};
//        z形Point [] points5={(new Point(0,0)),(new Point(1,0)),(new Point(1,1)),(new Point(2,1))};
//        l形Point [] points6={(new Point(0,0)),(new Point(0,1)),(new Point(0,2)),(new Point(1,2))};
//        j形Point [] points7={(new Point(1,0)),(new Point(1,1)),(new Point(1,2)),(new Point(0,2))};Point [][] pointss={points1,points2,points3,points4,points5,points6,points7};
//      设置每个图形的旋转顶点Point [] rotates={new Point(-1,-1),new Point(0,1),new Point(1,1),new Point(1,0),new Point(1,1),new Point(0,1),new Point(1,1)};rotate = rotates[a];return pointss[a];}public static void main(String[] args) {Block0011 block=new Block0011();block.Tian();}
}

第一次写俄罗斯方块,如果有错误的地方,欢迎大家留言交流


http://chatgpt.dhexx.cn/article/uRcE2ppk.shtml

相关文章

基于JAVA的俄罗斯方块游戏的设计与实现

目 录 1 引言 1.1 课题研究背景和意义 1.2 国内外现状分析 1.3 课题研究主要内容 1.4 论文组织结构 2 核心技术介绍 2.1 AWT技术介绍 2.2 eclipse编译器介绍 2.3 JAVA集合类技术简介 3 需求分析 3.1 游戏的设计模式 3.2 系统的设计目标 3.3 经济可行…

Java版俄罗斯方块

Java版俄罗斯方块 08年写的一个Java版俄罗斯方块程序 界面做的中规中矩&#xff0c;每种形状颜色都不相同 程序控制还可以&#xff0c;没什么大的Bug 消磨时间的时候可以Down下来玩玩 下载链接&#xff1a;http://download.csdn.net/user/zhaohuihua 菜单选项 也做了不少菜…

Java实现俄罗斯方块

结合网上的资料刚做完课程设计&#xff0c;具体代码如下&#xff1a; public class TetrisPanel extends JPanel{private final int[][] map new int[13][23];// map[列号][行号]。真正的方块区是:21行*10列。边框(2列&#xff0c;1行)// 方块的形状&#xff1a;// 第一维代表…

JAVA编写俄罗斯方块

JAVA编写俄罗斯方块 一.分析游戏界面 首先分析游戏界面&#xff0c;通过游戏界面&#xff0c;抽象出来几种类型。 1.Cell类型 2.Tetromino类型&#xff08;七种组合的父类&#xff09; 3.根据父类定义出七种T,O,I,J,L,S,Z子类型&#xff08;七种组合各自成一个类都继承于父类…

Java简易俄罗斯方块

目前学到Swing第二章&#xff0c;这两天没有学新知识&#xff0c;写了个俄罗斯方块。 写之前想不好怎么实现&#xff0c;找来别人的程序看了一下&#xff0c;再加上自己的想法&#xff0c;做了下面这个半成品&#xff0c;接下来可以加上各种菜单、按钮贴图等美化&#xff0c;都…

使用Java实现小游戏:俄罗斯方块

使用Java实现小游戏&#xff1a;俄罗斯方块 使用一个二维数组保存游戏的地图&#xff1a; // 游戏地图格子&#xff0c;每个格子保存一个方块&#xff0c;数组纪录方块的状态 private State map[][] new State[rows][columns];游戏前先将所有地图中的格子初始化为空&#xf…

JAVA实现经典游戏俄罗斯方块

本文代码来源于B站&#xff1a;尚学堂 博主也在此基础上有些改动&#xff0c;添加了一点提示标签和窗口 本文实现的功能有&#xff1a; 1、 初始化游戏窗口 2、初始化游戏的界面 3、初始化游戏的说明面板 4、随机生成下落方块 5、方块下落速度变化 6、判断方块是否可以下落 7、…

自己的第一个项目--俄罗斯方块(JAVA)

一点一点写出来的程序,想跟大家分享一下自己的心得,可能有错误,还请多多包涵~ Cell类: public class Cell 定义了本游戏最基本的元素:小方块(cell)的基本参数:行,列,小方块图片: private int row;//行数 private int col;//列数 private BufferedImage image;//图片 提供无…

Java俄罗斯方块 ---(一)游戏场景篇

相信俄罗斯方块大家都玩过&#xff0c;在这里就不多介绍规则了&#xff0c;用到的主要框架是Swing。 Java俄罗斯方块目录&#xff1a; Java俄罗斯方块 ---&#xff08;一&#xff09;游戏场景篇Java俄罗斯方块 ---&#xff08;二&#xff09;游戏操作与逻辑篇Java写俄罗斯方块…

java实现俄罗斯方块项目

导读:俄罗斯方块项目,基本功能包括:游戏主界面显示模块、方块及数据显示模块、方块移动控制模块、游戏界面颜色控制模块、游戏进度、等级控制模块等。本项目结构如下: (1)游戏主界面显示模块: 显示游戏和帮助两个菜单; 游戏使用功能键盘,得分 等级; (2)画布…

用JAVA写一个俄罗斯方块游戏tetrisGame

开拔 文章目录 开发环境前言一、先看一下游戏运行时的画面二、代码部分1.项目结构以及主程序入口以及下载路径下载路径代码1. Cell.java2. I.java3. J.java4. L.java5. O.java6. S.java7. T.java8. Tetris.java9. Tetromino.java10. Z.java 总结 开发环境 开发工具&#xff1a…

Java ——简易俄罗斯方块

一、将对象抽象为类 首先考虑俄罗斯方块游戏中含有哪些具体的对象&#xff0c;对象中含有哪些具体属性和方法&#xff0c;然后用代码来实现。 建立如下类&#xff1a; Cell类&#xff1a;代表最小的方格单位&#xff0c;构成7种图形的最基本图形。 含有row&#xff08;行号&…

【Java】俄罗斯方块小游戏(附源码)

俄罗斯方块小游戏 一、最终效果二、功能需求二、程序实现 一、最终效果 二、功能需求 1、 在二维平面里面用各种随机产生的方块堆积木&#xff0c;每满一行消去一行&#xff0c;当达到顶部时&#xff0c;游戏结束。 2、 通过方向键来控制方块转动&#xff0c;左移&#xff0c;…

Java实现俄罗斯方块附源码

Java实现俄罗斯方块 软件的开发过程&#xff1a; 1&#xff09; 搞清需求&#xff0c;就是软件的功能描述 俄罗斯方块的基本规则&#xff1a; 1、一个用于摆放小型正方形的平面虚拟场地&#xff0c;其标准大小&#xff1a; 行宽为10&#xff0c;列高为20&#xff0c;以每个小…

JAVA 实现《俄罗斯方块》游戏|CSDN创作打卡

前言 俄罗斯方块是一个最初由阿列克谢帕吉特诺夫在苏联设计和编程的益智类视频游戏。 《俄罗斯方块》的基本规则是移动、旋转和摆放游戏自动输出的各种方块&#xff0c;使之排列成完整的一行或多行并且消除得分。 用java语言实现&#xff0c;采用了swing技术进行了界面化处理…

Java游戏开发——俄罗斯方块

游戏介绍 俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机的游戏&#xff0c;它曾经造成的轰动与造成的经济价值可以说是游戏史上的一件大事。这款游戏最初是由苏联的游戏制作人Alex Pajitnov制作的&#xff0c;它看似简单但却变化无穷&#xff0c;游戏过程中仅需要玩家将不…

Java写俄罗斯方块,了解一下

Java俄罗斯方块目录&#xff1a; Java俄罗斯方块 ---&#xff08;一&#xff09;游戏场景篇Java俄罗斯方块 ---&#xff08;二&#xff09;游戏操作与逻辑篇Java写俄罗斯方块&#xff08;完整版&#xff09; 简要分析&#xff1a; 俄罗斯方块的规则在这里就不细说了&#xf…

Java游戏开发 —— 俄罗斯方块

引言&#xff1a; 俄罗斯方块的代码实现很简单&#xff0c;很有意思&#xff01; 思路&#xff1a; 1、创建主窗口&#xff0c;加载菜单及游戏面板。 2、在游戏面板中初始化各种参数&#xff0c;并建立各种功能组件。 3、利用paint()函数开始画方块。 4、游戏结束&#xff0c;…

Java俄罗斯方块,老程序员花了一个周末,连接中学年代!

Java俄罗斯方块&#xff0c;老程序员花了一个周末&#xff0c;连接中学年代&#xff01; 热门专栏推荐 【1】Java小游戏&#xff08;俄罗斯方块、飞机大战、植物大战僵尸等&#xff09; 【2】JavaWeb项目实战&#xff08;图书管理、在线考试、宿舍管理等&#xff09; 【3】Jav…

软件设计实战:基于Java的俄罗斯方块游戏【完整版】

个人简介 &#x1f468;&#x1f3fb;‍&#x1f4bb;个人主页&#xff1a;陈橘又青 &#x1f3c3;&#x1f3fb;‍♂️博客记录心情&#xff0c;代码编写人生。 &#x1f31f;如果文章对你有用&#xff0c;麻烦关注点赞收藏走一波&#xff0c;感谢支持&#xff01; &#x1f3…