俄罗斯方块代码

2023-11-09

package Game1;

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 java.awt.event.KeyListener;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.Timer;

public class Tetris extends JFrame {

	public Tetris(){
		TetrisPanel tetris=new TetrisPanel();
		this.addKeyListener(tetris.listener);
		add(tetris);
		setSize(220, 275);
		setLocation(400, 100);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		this.setTitle("俄罗斯方块");
		setResizable(false);
	}
	
	public static void main(String[] args) {
		Tetris te=new Tetris();
		te.setVisible(true);
	}
	class TetrisPanel extends JPanel{
		private int x,y;   //用来表示方块位置
		private int blockType;  //用来表示方块形态,如:L型,J型,Z型。。。0-6
		private int turnState;  //用来表示每个形态的变化方法,以下每个形态4种变化0-3
		private TimeListerner listener=new TimeListerner();
		private Timer timer;
		private int delay;
		private int score;
		int map[][]=new int[13][23];   //表示地图,游戏背景
		//以下用三维数组存储,第一维用取随机数来生成方块表示blockType,第二维用来表示方块旋转次数,三维代表方块矩阵
		int shape[][][]=new int[][][]{
				{	
					//I型长条方块
					{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}
				},
				
					//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}
				},
					//S型方块
				{
					{ 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, 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 }
				},
					//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 }
				},
					//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 }
				},
					//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 }
				}
		};
		public TetrisPanel(){
			nextBlock();
			newGame();
		}
		public void down(){   			//向下控制
			if(crash(x,y+1,blockType,turnState)==0){
				add( x, y, blockType, turnState);
				nextBlock();
			}
			y++;
			repaint();
		}
		public void upturn() {     //按键上的控制(即变换形态)
			turnState=(turnState+crash(x, y, blockType, (turnState+1)%4))%4;
			repaint();
		}
		public void left(){			//左控制
			if(x>=0){
				x-=+crash(x-1, y, blockType, turnState);
				repaint();
			}
		}
		public void right(){   		//右控制
			if(x<8){
				x+=crash(x+1, y, blockType, turnState);
				repaint();
			}
		}
		//判断是否碰撞
		public 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((shape[blockType][turnState][a*4+b] & map[x+b+1][y+a])==1){
						return 0;
					}
				}
			}
			return 1;
		}
		//把增加的方块搞到地图上面去,用表示方块形状的三维数组和地图的二维数组控制,如果碰到,则把方块此时的坐标和地图的坐标相加,得出新的值(即新的地图)
		public 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(shape[blockType][turnState][a*4+b]==1){
						map[x + b + 1][y + a] = shape[blockType][turnState][a * 4 + b];
					}
				}
			}
			TryDeline();
		}
		
		private void newGame() {
			for(int i=0;i<12;i++){       //初始化地图,地图看成是由12*22的方块构成
				for(int j=0;j<22;j++){
					map[i][j]=0;
					map[11][j]=map[0][j]=3;   //边界赋值3,用于下面画出边界,下面代码思想是如果map[i][j]=3,那么就画一个红色格子当分界线
				}
				map[i][21]=3;    //此处赋值最下面一层的值
			}
			delay=1000;   //速度初始值
			timer=new Timer(delay, listener);  
			timer.start();   
			nextBlock();    //下一个方块
			repaint();     //刷新地图
		}
		//消行的代码
		private void TryDeline(){
			//先遍历整个map看map中有没有一行整个都是满的,如果都是满的,那么map【a】【b】=1,与1(以下代码用的一个整形c)相&就是1;否则为0
			for(int b=0;b<21;b++){    //表示多少行
				int c=1;
				for(int a=0;a<12;a++){  //表示每列,用来看该行是否满的格子
					c&=map[a][b];
				}
				//以下是消除,如果满了(即c=1),就把上一行的赋给下一行,
				if(c==1){
					for(int d=b;d>0;d--){
						for(int e=1;e<11;e++){
							map[e][d]=map[e][d-1];
						}
					}
					//以下是分数的加法和速度的变化
					score+=10;
					if(delay>500){
						delay-=50;
					}else if(delay>200){
						delay-=40;
					}else {
						delay=200;
					}
				}
			}
		}

		private void nextBlock() {
			blockType=(int) (Math.random()*1000)%7;   //用随机数生成新的类型
			turnState=(int) (Math.random()*1000)%4;   //用随机数生成新类型中的形态
			x=4;  //表示生成位置的X坐标
			y=0;  //表示生成位置的Y坐标
			if (crash(x, y, blockType, turnState) == 0) {
				timer.stop();
				int option = JOptionPane.showConfirmDialog(this,
						"Game Over!!您的最后得分是:"+score);
				if (option == JOptionPane.OK_OPTION) {
					newGame();
					score=0;
				} else if (option == JOptionPane.NO_OPTION) {
					System.exit(0);
				}
			}
			
		}
		@Override
		protected void paintComponent(Graphics g) {
			super.paintComponent(g);
			g.setColor(Color.blue);
			//画出当前形态
			for(int j=0;j<16;j++){
				if(shape[blockType][turnState][j]==1){
					g.fillRect((j%4+x+1)*10,(j/4+y)*10, 10, 10);
				}
			}
			//画地图
			g.setColor(Color.red);
			for(int j=0;j<22;j++){
				for(int i=0;i<12;i++){
					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);
						
					}else if(map[i][j]==3){
						g.drawRect(i*10, j*10, 10, 10);				
					}
				}
			}
			//设置界面左右边的显示界面
			g.setColor(Color.blue);
			g.setFont(new Font("aa", Font.BOLD, 15));
			g.drawString("score="+score, 130, 20);
			g.setFont(new Font("aa", Font.ITALIC,13));
			g.drawString("关爱残疾人", 130, 70);
			g.drawString("远离鲁阿鲁", 130, 90);
			g.drawString("俄罗斯方块", 130, 110);
			g.drawString("益身心健康", 130, 130);
			g.drawString("防受骗上当", 130, 150);
			g.drawString("这游戏益脑", 130, 170);
		}
		//以下是添加的键盘监听
		class TimeListerner extends KeyAdapter implements ActionListener{

			@Override
			public void actionPerformed(ActionEvent e) {
				down();
			}
			@Override
			public void keyPressed(KeyEvent e) {
				int keycode=e.getKeyCode();
				switch (keycode) {
				case KeyEvent.VK_DOWN:   //方向键下的监听
					down();    //方法在上面
					break;
				case KeyEvent.VK_UP:    //方向键上的监听
					upturn();    //方法在上面
					break;
				case KeyEvent.VK_LEFT:    //方向键左的监听
					left();
					break;
				case KeyEvent.VK_RIGHT:    //方向键右的监听
					right();
					break;
				}
			}
		}	
	}
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

俄罗斯方块代码 的相关文章

  • 虚拟机硬盘直通挽救黑群晖数据

    之前用一台一体机做了一个黑群晖 放了一些1080P和4K的高清影片进去 数据并没有特别重要 但是由于多次意外停电 我又把黑群晖设置为来电自动重启 估计是硬盘受了一些影响 导致黑群晖无法被群晖助手搜索到 黑群晖变砖 我这个黑群晖是1个U盘作为
  • Thymeleaf 基本用法

    hymeleaf 是一款用于渲染 XML XHTML HTML5 内容的模板引擎 类似 JSP Velocity FreeMaker 等 它也可以轻易的与 Spring MVC 等 Web 框架进行集成作为 Web 应用的模板引擎 与其它模
  • 巧用千寻位置GNSS软件

    线路施工放样主要是解决线路工程和水利工程施工中 线路及渠道中线和边坡施工放样编辑的专用程序 千寻位置GNSS软件中完成线路施工放样可按照下述步骤操作 点击 测量 gt 线路施工放样 选择一条线路放样 如图 5 6 1所示 图 5 6 1 图
  • keras转onnx

    1 先将keras模型保存为tf model path pnet h5 模型文件 model tf keras models load model model path model save pnet save format tf 2 将保
  • 飞浆AI studio人工智能课程学习(4)-优质Prompt分享

    文章目录 最具商业价值Prompt分享与颁奖 02最具商业价值Prompt分享与颁奖 Top1 02最具商业价值Prompt分享与颁奖 Top2 02最具商业价值Prompt分享与颁奖 Top3 02最具商业价值Prompt分享与颁奖 To
  • sqli-labs (less-5)

    sqli labs less 5 第五关和前面的四关就不一样了 当我们输入id 1时 页面不会再返回用户名和密码 而是返回了 You are in 输入 http 127 0 0 1 sql1 Less 5 id 1 这里报错 根据错误信息
  • 上门服务预约小程序系统开发功能 有哪些行业适合预约小程序

    疫情爆发以来 实体企业越来越难做 特别是服务行业更是收到了很大的影响 都在不断的谋求新的出路 很多企业开始发展线上业务 打造预约上门便捷服务 希望借助互联网打通一条新出路 干洗店洗衣店洗鞋店开发线上预约上门服务就是其中之一 那么预约小程序都
  • learning、trying、teaching

    在工作中学习和提升 学以致用 学习的效果是最好的 工作后学习不需要大段时间 而是要挤出时间 利用时间碎片来学习 1 Learning 这是第一阶段 看书 google 看视频 看别人的博客 但要是 系统化 特别是一些基础性的东西 2 Try
  • vue elementUI 之 this.$confirm 用法

    this confirm 您确定退出当前账号吗 提示 confirmButtonText 确定 cancelButtonText 取消 type warning then gt 确定操作 this loading true
  • 【踩坑】parallel并发流导致数据异常

    踩坑 parallel并发流导致数据异常 1 场景 2 代码 3 原因 4 总结 1 场景 今天生产反馈有异常 看看日志是CollectionUtils sort空指针异常 这一眼看就是list中的排序有空元素 首先想到的是sql查出来的字
  • 我的tesseract-orc3.01样本训练记录

    官网样本训练网址 https code google com p tesseract ocr wiki TrainingTesseract3 一步一步来按照官网的步骤来做 由于我用的tesseractORC3 01版本 官网最新的版本是3
  • 耗时的同步请求自动转异步请求

    耗时的同步请求自动转异步请求 问题描述 问题处理 代码实现 问题描述 现在在项目中碰到一个情况 导出数据到excel 在数据量比较下的时候直接下载 在数据量比较大时保存到服务的文件列表 后续再供用户下载 也就是需要避免前端因后端处理时间过长
  • windows下激活conda环境

    windows activate env name linux source root autodl tmp environment bgmv30222 bin activate
  • (2003, "Can't connect to MySQL server on 'IP' ([WinError 10061] 由于目标计算机积极拒绝,无法连接。)")

    2003 Can t connect to MySQL server on IP WinError 10061 与MySql 只能访问localhost 和 127 0 0 1访问 不能通过其他IP访问 问题描述 项目中跨域请求数据 在远程
  • 华为od机试 Python【游戏最高分】

    题目 小明正在和他的朋友们玩一个跳格子的游戏 这个游戏有一个行列 共包含n个格子 每个格子里都有一定的分数 游戏的规则如下 小明可以选择任意一个格子作为起点 从起点开始 小明可以选择跳到任意非相邻的格子 也就是说 如果小明当前在第i个格子
  • java中的resultset类详解

    一 JDBC sun 提供了一套通用性的接口 可以连接任何的数据库 连接数据库的具体得到实例 具体的数据库厂商实现的 连接数据的步骤 别忘了复制jar包 1 注册驱动 Class forName DriverManager 2 获得链接对象
  • CMD中提升帐户到管理员权限

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 提升用户权限 从打开的 命令提示符 窗口中 输入命令 net localgroup administrators 用户名 add 并按回车 即可给当前 用户名 提升为 管理
  • C++函数返回引用

    首先需要明白 C 函数为什么要返回引用 答 这样就不用返回结果的副本 因为返回副本需要做赋值拷贝函数 浪费时间 这时候 实际上 返回是结果的副本 而不是结果本身 如果要返回本身 就返回引用就OK了 例1 const string manip
  • 数据分析入门宝藏!《Python数据分析-从入门到实践》

    在大数据 人工智能时代 数据无处不在 无论处于哪种行业 能够掌握一定的数据分析技能必然是职场的加分项 本笔记提供了丰富的学习内容 包含230个快速示例 17个案例 4个项目 力求为读者打造一本 学习入门 应用 实践一体化 的的Python数

随机推荐

  • Presto 常用配置及操作

    一 介绍 Presto是一个开源的分布式SQL查询引擎 适用于交互式分析查询 数据量支持GB到PB字节 Presto的设计和编写完全是为了解决像Facebook这样规模的商业数据仓库的交互式分析和处理速度的问题 推荐阅读 Presto实现原
  • DVWA 通关XSS(Stored)

    存储型XSS 持久化跨站脚本 持久性体现在XSS代码不是在某个参数 变量 中 而是写进数据库文件等可以永久保存数据的介质中 存储型XSS通常发生在留言板等地方 可以在留言板位置进行留言 将恶意代码写进数据库中 Low 没有任何过滤 直接使用
  • 开源云同步的markdown写作软件——Yosoro

    文章目录 前言 简便的项目管理 舒服的写作体验 支持one driver 存在缺点 前言 Yosoro是一款支持在Win Linux macOS上使用的写作软件 它的界面设计以及交互上表达出的极简主义可以让用户们可以完全沉浸于自己写作世界
  • MyBatis学习——第四篇(拦截器和拦截器分页实现)

    MyBatis架构体图 1 mybatis核心对象 从MyBatis代码实现的角度来看 MyBatis的主要的核心部件有以下几个 SqlSession 作为MyBatis工作的主要顶层API 表示和数据库交互的会话 完成必要数据库增删改查功
  • 【git体验】git基础-3目录之间关系

    1 git目录和工作目录 Git目录并不是Bare repo 而是本地的代码库 即用git init命令在根目录创建的 git 目录 类似SVN的 svn 目录 这个目录就是git实现分布式代码管理的关鍵了 工作目录就是 git的上級目录
  • Angular&TypeScript 经验技巧

    TypeScript 变量声明 var 变量名 类型 值 基本类型 数据类型 关键字 描述 任意类型 any 声明为 any 的变量可以赋予任意类型的值 数字类型 number 双精度 64 位浮点值 它可以用来表示整数和分数 let bi
  • 使用HAL库开发STM32:使用Timer输出PWM信号

    文章目录 目的 基础说明 输出PWM信号 总结 目的 单片机输出PWM信号是很常用的一种功能需求 STM32中通常使用Timer来输出PWM信号 这篇文章将对相关内容做个说明 基础说明 在使用Timer输出PWM信号需要了解一些Timer的
  • Spring Boot, 访问入口配置

    HTTP Server port server port 8080 Make the application accessible on the given context path http localhost 8080 myapp se
  • openGL结合光照与纹理

    openGL系列文章目录 文章目录 openGL系列文章目录 前言 一 实现思路 二 代码 1 c 主程序 2 顶点着色器 3 片元着色器 运行效果 参考 源码下载 前言 在光照模型中 都是假设我们使用按ADS 定义的光源 照亮按ADS 定
  • Python计算商品复购率

    1 Python计算产品复购率 需求 给出数据商品购买数据 数据格式 csv 包含 购买月份 手机号 根据该数据计算产品的复购率 复购率算法 算法一 单位时间内 按每月 R 复购人数 总购买人数 算法二 单位时间内 按每月 R 复购交易次数
  • 应用usb_cam同时打开多个摄像头方法

    最近由于项目需要 需要同时开启多个摄像头 虽然可以用opencv去写对应的摄像头开启的程序 但是 还是想用ros中提供的usb cam去打开多个摄像头 通过usb cam去打开一个摄像头 不用下载源码 可以直接安装usb cam去调用lau
  • 使用GDI/GDI+绘制到D3D9缓冲区的方法

    这个其实是3D绘图里嵌入2D绘图的传统方式 D3D9直接使用GDI GDI 就可以画图 只不过需要额外的设置 而且只支持RGB和XRGB 不支持ARGB 因此这种方法比较适合合成UI元素和不透明的纹理贴图 不适合将要进行AlphaBlend
  • #Mybatis 关于mybatis的一级缓存

    本篇文章主要是为了帮助自己总结和加深理解 若能帮助到其他小伙伴也是极好的 基本介绍 Mybatis中支持一级缓存和二级缓存 一级缓存是默认开启的并且不能关闭 二级缓存默认关闭 可根据需要进行手动开启 总体来说Mybatis的一二级缓存的最终
  • Shell 排序法 - 改良的插入排序

    说明 插入排序法由未排序的后半部前端取出一个值 插入已排序前半部的适当位置 概念简单但速度不快 排序要加快的基本原则之一 是让后一次的排序进行时 尽量利用前一次排序后的结果 以加快排序的速度 Shell排序法即是基于此一概念来改良插入排序法
  • css设置div上下左右均居中 、底部居中

    css设置div或盒子居中 垂直居中 左右居中 底部居中 类型一 固定宽度高度 html代码 div class login container div class login box div 内容 div div div 2 css 外部
  • 软件测试入坑建议

    本科非计算机专业 在深圳做了四年软件测试工作 从之前的一脸懵的点点点 到现在会点自动化测试 说一点点非计算机专业人员从事软件测试的心得体会 仅供参考交流 如果你是非计算机专业 毕业不久 软件测试工作门槛相对较低 比较容易入门 建议入职互联网
  • Halcon学习---玻璃瓶口的缺陷检测

    inspect bottle mouth hdev 巧妙运用了极坐标变换法 细节很精细 值得学习 tuning parameters SmoothX 501 ThresholdOffset 25 MinDefectSize 50 initi
  • 华为机试-----集五福作为近年来大家喜闻乐见迎新春活动,集合爱国福、富强福、和谐福、友善福、敬业福即可分享超大红包

    题目 以0和1组成的长度为5的字符串代表每个人所得到的福卡 每一位代表一种福卡 1表示已经获得该福卡 单类型福卡不超过1张 随机抽取一个小于10人团队 求该团队最多可以集齐多少套五福 输入描述 输入若干个 11010 00110 的由0 1
  • 有限状态机的4中实现对比

    有限状态机的4种实现对比 在日常工作过程中 我们经常会遇到状态的变化场景 例如订单状态发生变化 商品状态的变化 这些状态的变化 我们称为有限状态机 缩写为FSM F State Machine 之所以称其为有限 是因为这些场景中的状态往往是
  • 俄罗斯方块代码

    package Game1 import java awt Color import java awt Font import java awt Graphics import java awt event ActionEvent impo