import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
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 java.util.Random;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class GameFrame extends JFrame implements KeyListener {
private final int DEFAULT_WIDTH=500;
private final int DEFAULT_HEIGHT=700;
Random ran=new Random();
//方块形状
private int Fstate=ran.nextInt(7);
//方块状态
private int Sstate=ran.nextInt(4);
private int X=130;
private int left=130;
private int top=0;
private int[][][] shapes;
private int[]s;
private int[][]sh;
Shapes shape=new Shapes();
private JButton btnStart ,btnPause;
private boolean flag=false;
private GamePanel panel;
private int[][]map=new int[60][30];
private int tx=13;
private int ty=3;
public GameFrame()
{
shapes=shape.getShapes();
s=shapes[Fstate][Sstate];
sh=getS(s);
panel=new GamePanel();
panel.setLayout(null);
setTitle("Tetris game");
setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);
btnStart=new JButton("开始游戏");
btnStart.addKeyListener(new KeyAdapter()
{
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode()==KeyEvent.VK_ENTER)
{
flag=true;
btnStart.requestFocus(false);
panel.requestFocus();
}
}
});
btnStart.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent arg0) {
flag=true;
btnStart.requestFocus(false);
panel.requestFocus();
}
});
btnStart.setBounds(350, 350, 100, 30);
btnPause=new JButton("暂停");
btnPause.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent arg0) {
flag=false;
panel.requestFocus();
}
});
btnPause.setBounds(350, 400, 100, 30);
panel.add(btnPause);
this.setLocationRelativeTo(null);
this.add(panel); this.addKeyListener(this);
panel.addKeyListener(GameFrame.this);
GameThread gth=new GameThread();
Thread th=new Thread(gth);
th.start(); panel.add(btnStart);
}
public int[][] getS(int[]a)
{ int[][]sa=new int[4][4];
int n=0;
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
sa[i][j]=a[n];
n++;
}
}
return sa;
}
private class GamePanel extends JPanel
{
public void paintComponent(Graphics g)
{
Graphics2D g2d=(Graphics2D)g;
g2d.setColor(Color.black);
g2d.fill3DRect(20, 20, 300, 600, true);
g2d.drawRect(350, 40, 80, 80);
for(int j=0;j<sh.length;j++)
{
for(int i=0;i<sh.length;i++)
{
if(sh[j][i]==1)
{
g2d.setColor(Color.RED);
g2d.fill3DRect(left+20+10*i, top+20+10*j, 10, 10, true); } }
}
for(int i=0;i<60;i++)
{
for(int j=0;j<30;j++)
{
if(map[i][j]==1)
{
g2d.setColor(Color.RED);
g2d.fill3DRect(left+20+10*i, top+20+10*j, 10, 10, true);
}
}
}
}
}
//判断是否出界
public int isOut(int x,int y)
{
int[] aa=shapes[x][y];
int[][]b=getS(aa);
for(int j=0;j<b.length;j++)
{
for(int i=0;i<b.length;i++)
{
if(b[j][i]==1)
{
if((left+20+10*i)<20||(left+30+10*i)>300)
{
return 1;
}
if(top>620)
{
return 2;
}
} }
}
return 0;
}
//向左移动方法
public void left()
{
left-=10;
tx-=1;
if(isOut(Fstate,Sstate)==1)
{
left+=10;
tx+=1;
}
}
//向右移动方法
public void right()
{
left+=10;
tx+=1;
if(isOut(Fstate,Sstate)==1)
{
left-=10;
tx-=1;
}
}
public void setmap()
{
}
//向下移动方法
public void down()
{
top+=10;
int y=ty+1;
int x=tx;
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
if(sh[i][j]==1&&top+i*10==590)
{
for(int m=i;m>=0;m--)
{
for(int n=j;n>=0;n--)
{
System.out.println(ty);
System.out.println(tx);
if(sh[i][j]==1)
{
map[ty][tx+m-1]=1;
}
}
ty--;
}
}
}
}
ty=y;
tx=x;
for(int i=3;i>=0;i--)
{
for(int j=3;j>=0;j--)
{
System.out.println(ty);
if(sh[i][j]==1&&map[ty][tx+j-1]==1)
{
for(int m=i;m>=0;m--)
{
for(int n=j;n>=0;n--)
{
if(sh[i][j]==1)
{
map[ty][tx+m-1]=1;
}
}
ty--;
}
}
}
ty--;
}
ty=y;
}
class GameThread implements Runnable
{ @Override
public void run() {
while(true)
{
shapes=shape.getShapes();
s=shapes[Fstate][Sstate]; sh=getS(s);
if(flag)
{
down();
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
repaint();
}
}
}
public static void main(String[] args) {
GameFrame frame=new GameFrame();
frame.setVisible(true);
frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
}@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode()==KeyEvent.VK_UP)
{
//改变图形状态
if(Sstate<3)
{
Sstate++;
}
else
{
Sstate=0;
} }
if(e.getKeyCode()==KeyEvent.VK_DOWN)
{
top+=20;
}
if(e.getKeyCode()==KeyEvent.VK_RIGHT)
{
right();
}
if(e.getKeyCode()==KeyEvent.VK_LEFT)
{
left();
}
}
@Override
public void keyReleased(KeyEvent arg0) {}
@Override
public void keyTyped(KeyEvent arg0) {}
}
我相信鉴于代码的凌乱程度,能看懂就是个奇迹。但更我相信,在这个世界是不乏创造奇迹的人的,所以我就把这些代码放到了这里 来等待一个奇迹。我知道,也许我该推到,重做的,但我总觉得半途而废总是不好的,而且我相信成功的道路不止一条,就算为走了很多弯路,起码还可以让我知道,哦 原来还可以这样。
我想完成一个俄罗斯方块游戏 现在为就想实现把落下的方块存放到map中 也就是整个游戏区,但是怎么也弄不出来,在向下的方法中总是提示数组越界。
下面是为图形类
import java.util.Random;
public class Shapes {
int[]a=new int[3];
// private int allshaps[][][];
Random ran=new Random();
private int Fstate=ran.nextInt(7);
private int Sstate=ran.nextInt(4);
public int [][][] getShapes()
{
int[][] map = new int[30][60];
int allshaps[][][]=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 } },
// 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 } },
// 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 } } };
return allshaps;
}
// public void drawShaps(int f,int s)
// {
//
// }}
import java.awt.Graphics;
import java.awt.Graphics2D;
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 java.util.Random;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class GameFrame extends JFrame implements KeyListener {
private final int DEFAULT_WIDTH=500;
private final int DEFAULT_HEIGHT=700;
Random ran=new Random();
//方块形状
private int Fstate=ran.nextInt(7);
//方块状态
private int Sstate=ran.nextInt(4);
private int X=130;
private int left=130;
private int top=0;
private int[][][] shapes;
private int[]s;
private int[][]sh;
Shapes shape=new Shapes();
private JButton btnStart ,btnPause;
private boolean flag=false;
private GamePanel panel;
private int[][]map=new int[60][30];
private int tx=13;
private int ty=3;
public GameFrame()
{
shapes=shape.getShapes();
s=shapes[Fstate][Sstate];
sh=getS(s);
panel=new GamePanel();
panel.setLayout(null);
setTitle("Tetris game");
setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);
btnStart=new JButton("开始游戏");
btnStart.addKeyListener(new KeyAdapter()
{
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode()==KeyEvent.VK_ENTER)
{
flag=true;
btnStart.requestFocus(false);
panel.requestFocus();
}
}
});
btnStart.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent arg0) {
flag=true;
btnStart.requestFocus(false);
panel.requestFocus();
}
});
btnStart.setBounds(350, 350, 100, 30);
btnPause=new JButton("暂停");
btnPause.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent arg0) {
flag=false;
panel.requestFocus();
}
});
btnPause.setBounds(350, 400, 100, 30);
panel.add(btnPause);
this.setLocationRelativeTo(null);
this.add(panel); this.addKeyListener(this);
panel.addKeyListener(GameFrame.this);
GameThread gth=new GameThread();
Thread th=new Thread(gth);
th.start(); panel.add(btnStart);
}
public int[][] getS(int[]a)
{ int[][]sa=new int[4][4];
int n=0;
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
sa[i][j]=a[n];
n++;
}
}
return sa;
}
private class GamePanel extends JPanel
{
public void paintComponent(Graphics g)
{
Graphics2D g2d=(Graphics2D)g;
g2d.setColor(Color.black);
g2d.fill3DRect(20, 20, 300, 600, true);
g2d.drawRect(350, 40, 80, 80);
for(int j=0;j<sh.length;j++)
{
for(int i=0;i<sh.length;i++)
{
if(sh[j][i]==1)
{
g2d.setColor(Color.RED);
g2d.fill3DRect(left+20+10*i, top+20+10*j, 10, 10, true); } }
}
for(int i=0;i<60;i++)
{
for(int j=0;j<30;j++)
{
if(map[i][j]==1)
{
g2d.setColor(Color.RED);
g2d.fill3DRect(left+20+10*i, top+20+10*j, 10, 10, true);
}
}
}
}
}
//判断是否出界
public int isOut(int x,int y)
{
int[] aa=shapes[x][y];
int[][]b=getS(aa);
for(int j=0;j<b.length;j++)
{
for(int i=0;i<b.length;i++)
{
if(b[j][i]==1)
{
if((left+20+10*i)<20||(left+30+10*i)>300)
{
return 1;
}
if(top>620)
{
return 2;
}
} }
}
return 0;
}
//向左移动方法
public void left()
{
left-=10;
tx-=1;
if(isOut(Fstate,Sstate)==1)
{
left+=10;
tx+=1;
}
}
//向右移动方法
public void right()
{
left+=10;
tx+=1;
if(isOut(Fstate,Sstate)==1)
{
left-=10;
tx-=1;
}
}
public void setmap()
{
}
//向下移动方法
public void down()
{
top+=10;
int y=ty+1;
int x=tx;
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
if(sh[i][j]==1&&top+i*10==590)
{
for(int m=i;m>=0;m--)
{
for(int n=j;n>=0;n--)
{
System.out.println(ty);
System.out.println(tx);
if(sh[i][j]==1)
{
map[ty][tx+m-1]=1;
}
}
ty--;
}
}
}
}
ty=y;
tx=x;
for(int i=3;i>=0;i--)
{
for(int j=3;j>=0;j--)
{
System.out.println(ty);
if(sh[i][j]==1&&map[ty][tx+j-1]==1)
{
for(int m=i;m>=0;m--)
{
for(int n=j;n>=0;n--)
{
if(sh[i][j]==1)
{
map[ty][tx+m-1]=1;
}
}
ty--;
}
}
}
ty--;
}
ty=y;
}
class GameThread implements Runnable
{ @Override
public void run() {
while(true)
{
shapes=shape.getShapes();
s=shapes[Fstate][Sstate]; sh=getS(s);
if(flag)
{
down();
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
repaint();
}
}
}
public static void main(String[] args) {
GameFrame frame=new GameFrame();
frame.setVisible(true);
frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
}@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode()==KeyEvent.VK_UP)
{
//改变图形状态
if(Sstate<3)
{
Sstate++;
}
else
{
Sstate=0;
} }
if(e.getKeyCode()==KeyEvent.VK_DOWN)
{
top+=20;
}
if(e.getKeyCode()==KeyEvent.VK_RIGHT)
{
right();
}
if(e.getKeyCode()==KeyEvent.VK_LEFT)
{
left();
}
}
@Override
public void keyReleased(KeyEvent arg0) {}
@Override
public void keyTyped(KeyEvent arg0) {}
}
我相信鉴于代码的凌乱程度,能看懂就是个奇迹。但更我相信,在这个世界是不乏创造奇迹的人的,所以我就把这些代码放到了这里 来等待一个奇迹。我知道,也许我该推到,重做的,但我总觉得半途而废总是不好的,而且我相信成功的道路不止一条,就算为走了很多弯路,起码还可以让我知道,哦 原来还可以这样。
我想完成一个俄罗斯方块游戏 现在为就想实现把落下的方块存放到map中 也就是整个游戏区,但是怎么也弄不出来,在向下的方法中总是提示数组越界。
下面是为图形类
import java.util.Random;
public class Shapes {
int[]a=new int[3];
// private int allshaps[][][];
Random ran=new Random();
private int Fstate=ran.nextInt(7);
private int Sstate=ran.nextInt(4);
public int [][][] getShapes()
{
int[][] map = new int[30][60];
int allshaps[][][]=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 } },
// 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 } },
// 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 } } };
return allshaps;
}
// public void drawShaps(int f,int s)
// {
//
// }}
我想完成一个俄罗斯方块游戏 现在为就想实现把落下的方块存放到map中 也就是整个游戏区,但是怎么也弄不出来,在向下的方法中总是提示数组越界。
// 待开发
}好很多