效果预览图

视频预览:
俄罗斯方块
代码部分
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();}
}
第一次写俄罗斯方块,如果有错误的地方,欢迎大家留言交流











