我写的俄罗斯方块代码,有些小问题,代码发到这里,请各位帮忙看一下

tengfeng05 2010-05-17 08:24:11
主要有两个问题,一是方块显示,总是掉格子,不知道什么原因,二是键盘事件没有反应,检查N遍,实在不知哪里出了错误。请各位大侠帮忙看下,拜谢!
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.text.*;
import java.net.*;
class localuser
{
JFrame myframe;
public static Canvas gamecanvas1,gamecanvas2,nextcanvas;
JPanel messagepanel;
JMenuBar mymenubar;
JMenu menu1,menu2,menu3,menu4;
public static JMenuItem menu1_item1,menu1_item2,menu1_item3,
menu2_item1,
menu3_item1,menu3_item2,
menu4_item1,menu4_item2,menu4_item3,menu4_item4,menu4_item5,
menu4_item6,menu4_item7,menu4_item8,menu4_item9,menu4_item10;
public static JButton startbutton,toolbutton1,toolbutton2,toolbutton3,toolbutton4;
JLabel nextlabel,toollabel1,userscore1,userscore2;
public static JTextField tooltext1,tooltext2,tooltext3,tooltext4,scoretext1,scoretext2,timetext;
public static JTextArea linkmessagetextarea;
//取得内容面板
void localuser()
{
//窗体//
myframe=new JFrame("俄罗斯方块");
myframe.setSize(535,580);
myframe.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}});

mymenubar=new JMenuBar();//创建菜单栏
gamecanvas1=new Canvas();//创建本机用户面板
messagepanel=new JPanel();//创建信息显示面板
//创建网络用户面板gamecanvas2=new gamecanvas();

Container con=myframe.getContentPane();
con.setLayout(null);//设置内容面板的布局模式为空布局
con.add(mymenubar);con.add(gamecanvas1);con.add(messagepanel);// con.add(gamecanvas2);
mymenubar.setBounds(0,0,535,20);
gamecanvas1.setBounds(15,35,300,500);
messagepanel.setBounds(320,35,200,500);
// gamecanvas2.setBounds(int x,int y,int a,int b);
gamecanvas1.setBackground(Color.white);
messagepanel.setBackground(Color.lightGray);
gamecanvas1.addKeyListener(new control1());
gamecanvas1.requestFocus();

//菜单栏//

menu1=new JMenu("游戏");
menu2=new JMenu("设置");
menu3=new JMenu("帮助");
menu4=new JMenu("关卡选择");
mymenubar.add(menu1);mymenubar.add(menu2);mymenubar.add(menu3);
menu1_item1=new JMenuItem("新游戏");menu1_item1.addActionListener(new control1(1));
menu1_item2=new JMenuItem("网络对战");menu1_item2.addActionListener(new control1(2));
menu1_item3=new JMenuItem("退出");menu1_item3.addActionListener(new control1(3));
menu2_item1=new JMenuItem("背景音乐");menu2_item1.addActionListener(new control1(4));
menu3_item1=new JMenuItem("操作方法");menu3_item1.addActionListener(new control1(5));
menu3_item2=new JMenuItem("关于···");menu3_item2.addActionListener(new control1(6));
menu4_item1=new JMenuItem("第一关");menu4_item1.addActionListener(new control1(7));
menu4_item2=new JMenuItem("第二关");menu4_item2.addActionListener(new control1(8));
menu4_item3=new JMenuItem("第三关");menu4_item3.addActionListener(new control1(9));
menu4_item4=new JMenuItem("第四关");menu4_item4.addActionListener(new control1(10));
menu4_item5=new JMenuItem("第五关");menu4_item5.addActionListener(new control1(11));
menu4_item6=new JMenuItem("第六关");menu4_item6.addActionListener(new control1(12));
menu4_item7=new JMenuItem("第七关");menu4_item7.addActionListener(new control1(13));
menu4_item8=new JMenuItem("第八关");menu4_item8.addActionListener(new control1(14));
menu4_item9=new JMenuItem("第九关");menu4_item9.addActionListener(new control1(15));
menu4_item10=new JMenuItem("第十关");menu4_item10.addActionListener(new control1(16));
menu1.add(menu1_item1); menu1.add(menu1_item2);menu1.add(menu1_item3);
menu2.add(menu2_item1); menu2.add(menu4);
menu3.add(menu3_item1); menu3.add(menu3_item2);
menu4.add(menu4_item1); menu4.add(menu4_item2);
menu4.add(menu4_item3); menu4.add(menu4_item4);
menu4.add(menu4_item5); menu4.add(menu4_item6);
menu4.add(menu4_item7); menu4.add(menu4_item8);
menu4.add(menu4_item9); menu4.add(menu4_item10);

//创建NEXT信息子面板
startbutton=new JButton("开始游戏");startbutton.addActionListener(new control1(17));
nextlabel=new JLabel("NEXT");
nextcanvas=new Canvas();
nextcanvas.setBackground(Color.white);

//创建道具信息子面板
toollabel1=new JLabel("道具");
toolbutton1=new JButton("炸弹");toolbutton1.addActionListener(new control1(18));
tooltext1=new JTextField("x 0",4);
toolbutton2=new JButton("地雷");toolbutton2.addActionListener(new control1(19));
tooltext2=new JTextField("x 0",4);
toolbutton3=new JButton("仙女");toolbutton3.addActionListener(new control1(20));
tooltext3=new JTextField("x 0",4);
toolbutton4=new JButton("恶魔");toolbutton4.addActionListener(new control1(21));
tooltext4=new JTextField("x 0",4);

//创建分数显示面板
userscore1=new JLabel("分数");
userscore2=new JLabel("对方分数");
scoretext1=new JTextField(6);
scoretext2=new JTextField(6);
timetext=new JTextField ("00:00:00",8);
linkmessagetextarea=new JTextArea("无连接",2,30);

//将NEXT信息子面板和道具信息子面板分数信息子面板添加到信息面板
messagepanel.setLayout(null);
messagepanel.add(startbutton);
messagepanel.add(nextlabel);
messagepanel.add(nextcanvas);
messagepanel.add(toollabel1);
messagepanel.add(toolbutton1);messagepanel.add(tooltext1);
messagepanel.add(toolbutton2);messagepanel.add(tooltext2);
messagepanel.add(toolbutton3);messagepanel.add(tooltext3);
messagepanel.add(toolbutton4);messagepanel.add(tooltext4);
messagepanel.add(userscore1);messagepanel.add(userscore2);
messagepanel.add(scoretext1);messagepanel.add(scoretext2);
messagepanel.add(timetext);
messagepanel.add(linkmessagetextarea);

startbutton.setBounds(60,15,80,30);
nextlabel.setBounds(87,55,40,20);
nextcanvas.setBounds(63,85,75,90);

toollabel1.setBounds(88,190,40,20);
toolbutton1.setBounds(10,220,40,40);tooltext1.setBounds(55,220,40,40);
toolbutton2.setBounds(105,220,40,40);tooltext2.setBounds(150,220,40,40);
toolbutton3.setBounds(10,270,40,40);tooltext3.setBounds(55,270,40,40);
toolbutton4.setBounds(105,270,40,40);tooltext4.setBounds(150,270,40,40);

userscore1.setBounds(45,325,60,20);userscore2.setBounds(115,325,60,20);
scoretext1.setBounds(25,355,63,30);scoretext2.setBounds(110,355,63,30);
timetext.setBounds(35,395,130,30);
linkmessagetextarea.setBounds(5,435,190,60);

myframe.setResizable(false);
myframe.setVisible(true);


}

}
class block
{
int row,col; //记录方块矩阵左上角在gamearea数组中的坐标
int x,y;
int blocktype;//用来存储七种形态的方块
int turntype;//用来存储方块的翻转状态
int isblockdown;//用来记录游戏区底部堆积的方块行数
static boolean isgameplay;
Color color;
Graphics g;
int gamearea[][]=new int[25][15];

int Block[][][][]=
{{{{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,0,0},{1,1,1,1},{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,0,0,0},{1,1,1,0},{1,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,1,0}, {1,1,1,0},{0,0,0,0},{0,0,0,0}}},

{{{0,0,1,0},{0,0,1,0},{0,1,1,0},{0,0,0,0}},
{{0,0,0,0},{0,1,0,0},{0,1,1,1},{0,0,0,0}},
{{0,1,1,0},{0,1,0,0},{0,1,0,0},{0,0,0,0}},
{{0,0,0,0},{0,1,1,1},{0,0,0,1},{0,0,0,0}}},

{{{0,1,0,0},{0,1,1,0},{0,0,1,0},{0,0,0,0}},
{{0,0,0,0},{0,1,1,0},{1,1,0,0},{0,0,0,0}},
{{0,1,0,0},{0,1,1,0},{0,0,1,0},{0,0,0,0}},
{{0,0,0,0},{0,1,1,0},{1,1,0,0},{0,0,0,0}}},

{{{0,0,1,0},{0,1,1,0},{0,1,0,0},{0,0,0,0}},
{{0,0,0,0},{1,1,0,0},{0,1,1,0},{0,0,0,0}},
{{0,0,1,0},{0,1,1,0},{0,1,0,0},{0,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,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},{1,1,1,0},{0,0,0,0}},
{{1,0,0,0},{1,1,0,0},{1,0,0,0},{0,0,0,0}},
{{0,0,0,0},{1,1,1,0},{0,1,0,0},{0,0,0,0}},
{{0,1,0,0},{1,1,0,0},{0,1,0,0},{0,0,0,0}}}};
//构造方法
block()
{
blocktype=0;
turntype=0;
isblockdown=0;
isgameplay=false;

}
//初始化游戏区域
public void initgamearea()
{
for(int i=0;i<=24;i++)
for(int j=0;j<=14;j++)
gamearea[i][j]=0;
getblock();
}
//产生随机颜色
public Color randomcolor()
{
Color C=new Color((new Double(Math.random() * 128)).intValue() + 128, (new Double(Math.random() * 128)).intValue() + 128, (new Double(Math.random() * 128)).intValue() + 128);
return C;
}
...全文
123 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
哦, 有点不懂,顶一下
tengfeng05 2010-05-17
  • 打赏
  • 举报
回复
自己帮顶一下!
另外说错了,2楼画方块方法,g若是定义为全局变量,然后在构造函数中实例化,会发生编译错误,提示找不到符号,是什么原因?
各位大侠们,跪求解惑啊!!!!!!!!!!!!
neozhengx 2010-05-17
  • 打赏
  • 举报
回复
当年写的时候也碰到过键盘不响应的问题,要注意焦点的设置
tengfeng05 2010-05-17
  • 打赏
  • 举报
回复

//画方块方法
public void drawblock(int draw)
{
g=localuser.gamecanvas1.getGraphics(); /*/这里有一个小疑问,不知为何不可将g定义为全局变量?我定义为全局变量,编译报错,说找不到符号/*/
g.setColor(color);
switch(draw)
{
case 1: for(int i=0;i<=3;i++)
for(int j=0;j<=3;j++)
if(Block[blocktype][turntype][i][j]==1)
g.fill3DRect((col+j)*20,(row+i)*20,20,20,true);
case 2: for(int i=0;i<=3;i++)
for(int j=0;j<=3;j++)
if(Block[blocktype][turntype][i][j]==1)
{
gamearea[row+i][col+j]=draw;
g.fill3DRect((col+j)*20,(row+i)*20,20,20,true);
}
}
}
//刷新下落方块方法
public void updateblock()
{
for(int i=0;i<=3;i++)
for(int j=0;j<=3;j++)
if(Block[blocktype][turntype][i][j]==1)
localuser.gamecanvas1.repaint((col+j)*20,(row+i)*20,20,20);
}
//初始化并得到新方块
public void getblock()
{
row=0;
col=6;
isblockdown=0;
turntype=0;
blocktype=(int)(Math.random()*1000)%7;
color=randomcolor();

drawblock(1);
}
//方块旋转方法
public void turnblock()
{
if(moveable('T'))
{
updateblock();
if(turntype==3)
turntype=0;
else
turntype++;
drawblock(1);
}
}
//方块右移方法
public void moveright()
{
if(moveable('R'))
{
updateblock();
col++;
drawblock(1);
}
}
//方块左移方法
public void moveleft()
{
if(moveable('L'))
{
updateblock();
col--;
drawblock(1);
}
}
//方块下落方法
public void blockdown()
{
if(moveable('D'))
{
updateblock();
row++;
drawblock(1);
}
else
{
updateblock();
drawblock(2);
isblockdown=1;
}
}

//判断方块是否还能移动方法
public boolean moveable(char direction)
{
switch(direction)
{
case 'R':for(int i=0;i<=3;i++)
for(int j=0;j<=3;j++)
if(Block[blocktype][turntype][i][j]==1&&(col+j>=14||gamearea[row+i][col+j+1]==2))
return false;break;
case 'L':for(int i=0;i<=3;i++)
for(int j=0;j<=3;j++)
if(Block[blocktype][turntype][i][j]==1&&(col+j<=0||gamearea[row+i][col+j-1]==2))
return false;break;
case 'D':for(int i=0;i<=3;i++)
for(int j=0;j<=3;j++)
if(Block[blocktype][turntype][i][j]==1&&(row+i>=24||gamearea[row+i+1][col+j]==2))
return false;break;
//这个判断有误,有待改进
case 'T':for(int i=0;i<=3;i++)
for(int j=0;j<=3;j++)
if(Block[blocktype][turntype][i][j]==1&&(col+j<=0||col+j>=14||row+i>=24||gamearea[row+i+1][col+j]==2||gamearea[row+i][col+j+1]==2||gamearea[row+i][col+j-1]==2))
return false;break;
}
return true;
}

//定时线程
public class thread extends Thread
{
public void run()
{
while(isgameplay)
{
try{
sleep(control1.time);
}catch(InterruptedException e){ }
if(isblockdown==0)
blockdown();
if(isblockdown==1)
getblock();
}
}
}
//返回内部类thread的引用实例
public thread th()
{
return new thread();
}
}


public class control1 implements ActionListener,KeyListener
{
static int time;
localuser L;
netuser N;
block B;
int currentbutton;
//构造方法,为gamecanvas1添加键盘处理事件
control1()
{
}
//构造方法,接受localuser类传递过来int型参数
control1(int button)
{
currentbutton=button;
time=500;
localuser L;
B=new block();
}
public void actionPerformed(ActionEvent e)
{
switch(currentbutton)
{
case 1:System.exit(0);break;
case 2:N.netuser();break;
case 3:System.exit(0);break;
case 4:System.exit(0);break;
case 5:System.exit(0);break;
case 6:System.exit(0);break;
case 7:time=800;break;
case 8:time=750;break;
case 9:time=700;break;
case 10:time=625;break;
case 11:time=550;break;
case 12:time=475;break;
case 13:time=375;break;
case 14:time=275;break;
case 15:time=175;break;
case 16:time=75;break;
case 17:if(!B.isgameplay)
{
B.isgameplay=true;
B.initgamearea();
B.th().start();
}
else
{
try{
B.th().wait();
}catch(InterruptedException E){}
B.isgameplay=false;
}
break;
case 18:System.exit(0);break;
case 19:System.exit(0);break;
case 20:System.exit(0);break;
case 21:System.exit(0);break;
default:
}
}

public void keyPressed(KeyEvent e)
{
if(B.isgameplay)
{
switch(e.getKeyCode())
{
case KeyEvent.VK_UP:B.turnblock();break;
case KeyEvent.VK_DOWN:B.blockdown();break;
case KeyEvent.VK_LEFT:B.moveleft();break;
case KeyEvent.VK_RIGHT:B.moveright();break;
default:return;//用户按错键时结束方法
}
}
else return;
}
public void keyTyped(KeyEvent e)
{
}
public void keyReleased(KeyEvent e)
{
}


public void gametime()
{
Thread threadruntime=new Thread();
SimpleDateFormat starttimeformat= new SimpleDateFormat("HH:mm:ss");
Date starttime = new Date();
while(true)
{
//B.time();
try
{
threadruntime.sleep(1000);
}catch(InterruptedException e){ }
Date nowtime=new Date();
Date time=new Date(nowtime.getTime()-starttime.getTime()-28800000);
localuser.timetext.setText(starttimeformat.format(time));
}
}
public static void main(String args[])
{
localuser USER=new localuser();
USER.localuser();
}
}



62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧