📄 tetrics.java
字号:
package ct;//包
//头文件
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.net.*;
import javax.swing.*;
//游戏类
public class Tetrics extends Panel implements Runnable//主游戏类
{
//每个小方块的大小:宽,高
int m_nSqLength;
//定位游戏区位置(x轴)
final int XOFFSET=0;
//游戏区域内的列和行
static int m_nCols;
static int m_nRows;
int m_nOldScore;//存放分数,供每个等级累加使用
//游戏窗体大小
public static int WIDTH=250;
public static int HEIGHT=450;
//当前的界面情况
// int m_nField[][];//本页游戏画面
// int m_nOldField[][];//上页游戏画面
//对手的情况
// int m_nRivalField[][];
//当前移动的方块
Square m_curPiece[]=new Square[4];
boolean m_bGameInPlay;//是否在游戏中
boolean m_bPaused=false;//初始游戏暂停状态(假,即不暂停)
Thread m_theThread=null;//游戏线程
//int m_nTheScore;//方块价值和游戏总分
// int m_nPlayLevel;//游戏难度
int m_nTotalPieces;//下落的方块总数
int mvalue;//方块价值 用于 方块分数统计
// Image skin=Toolkit.getDefaultToolkit().getImage("../ct/gg.png");;
// Image gameoverImage=Toolkit.getDefaultToolkit().getImage("Image/gameover.png");
int m_nDelayMap[]={0,675,625,575,525,475,425,375,325,275,225,175,125,75,50,25};//SPF值数组
boolean isPlay=false;//标识程序是否已经开始播放背景音效
final Color BAKCOLOR=new Color(130,202,227);//背景颜色深蓝
int b;//标注游戏状态,0为游戏开始,1为暂停,-1为结束
//双缓存运用
Graphics m_gOffGraph;//声名绘图变量
//Graphics m_gGraph;
Image m_image;//图象对象
Frame1 m_tFrame;//声名主窗体变量
nextSquare nextPiece;//预览区对象
oGameField oGameArea;//对手游戏区域
showScore sScore;//分数及级别显示对象
sound m_sound;//音效对象
// MediaTracker MT;//图象追踪器
JLabel jLabel1 = new JLabel();
boolean canuseskill=false;//标识是否可以使用技能
public Tetrics()
{//构造游戏方法
super();//将本窗体设置为容器
// setBackground(BAKCOLOR);//设置背景色
/* MT=new MediaTracker(this);
// MT.addImage(skin,0) ;
try
{
MT.waitForAll();
}
catch(Exception error){}*/
initParam();//游戏初始化
}
public Tetrics(Frame1 tFrame)
{//重载构造游戏方法
super();//将本窗体设置为容器
m_tFrame=tFrame;//将游戏状态传给主窗体
setBackground(BAKCOLOR);//设置背景色
/* MT=new MediaTracker(this);
// MT.addImage(skin,0) ;
try
{
MT.waitForAll();
}
catch(Exception error){}*/
initParam();//游戏初始化
}
public void initParam()
{
nextPiece = new nextSquare(this);
oGameArea = new oGameField(this);
m_sound=new sound(this);
sScore=new showScore(this);
//设置初始参数
m_nSqLength=25;
m_nCols=10;
m_nRows=18;
}
//线程开始
public synchronized void start()
{ b=0;//游戏状态为开始
if(m_theThread!=null)
//游戏是被暂停,而不是重新开始
{
m_bPaused=false;//停止暂停状态
m_theThread.resume();//线程继续
return;
}
//重新开始赋上游戏的状态
for(int i=0;i<m_nCols;i++)
{//绘制游戏区画面
for(int j=0;j<m_nRows+4;j++)
{
oGameArea.m_nField[i][j]=0;//当前游戏区无方块
oGameArea.m_nOldField[i][j]=-1;//上一页游戏区全部为方块
oGameArea.m_nRivalField[i][j]=0;//对手游戏区无方块
}
}
sScore.m_nTheScore=0;//总分初始为0
m_nTotalPieces=0;//下落总方块数初始为0
nextPiece.m_bNeedNewPiece=true;//需生成新方块
m_bGameInPlay=true;//游戏状态(游戏中)
m_nOldScore=0;//每个等级累加的分数初始为0
// System.out.println(m_tFrame.username);
m_theThread=new Thread(this);//声名新线程
nextPiece.newPrePiece();//预览区方块
m_theThread.start();//线程开始
m_tFrame.sendStr("enemyPlayer:"+m_tFrame.jLabel8.getText());//将本机玩家昵称发送给对方
requestFocus();//控制游戏焦点在游戏区
m_sound.start_voice();//播放开始音效
m_repaint();//刷新
}
//更新游戏界面
public void update(Graphics g)
{
nextPiece.m_bJustupdating=true;//游戏更新中
// g.drawImage(skin,0,0,this);//绘制游戏画面
paint(g);//绘制新游戏页面
}
//绘制游戏界面
public synchronized void paint(Graphics g)
{
m_image=createImage(250,450);
m_gOffGraph=m_image.getGraphics();
Image img1=createImage(m_nSqLength*10,m_nSqLength*18);
//用来画自己的游戏区域
Graphics g1=img1.getGraphics();
for(int i=0;i<m_nCols;i++)
for(int j=0;j<m_nRows;j++)
{// if(!nextPiece.m_bJustupdating ||oGameArea.m_nOldField[i][m_nRows-1-j]==-1 || oGameArea.m_nOldField[i][m_nRows-1-j]!=oGameArea.m_nField[i][m_nRows-1-j])
// g1.setColor(nextPiece.m_colors[oGameArea.m_nField[i][m_nRows-1-j]]);//设置方块颜色
// g1.fill3DRect(m_nSqLength*i,m_nSqLength*j,m_nSqLength,m_nSqLength,true);//绘制立体效果方块
g1.drawImage(nextPiece.box[oGameArea.m_nField[i][m_nRows - 1 - j]],
m_nSqLength * i, m_nSqLength * j,m_nSqLength, m_nSqLength,this);
}
m_gOffGraph.drawImage(img1,0,0,this);//绘制游戏画面
g.drawImage(m_image,0,0,this);//绘制游戏画面
nextPiece.m_bJustupdating=false;//更新状态为假
}
public void run()
{//启动线程
while(m_bGameInPlay){//游戏状态下
try
{
int t;
if(sScore.m_nPlayLevel>15) {
sScore.m_nPlayLevel=1;//等级回1
t=m_nDelayMap[0];//设置SPF
}
else t=m_nDelayMap[sScore.m_nPlayLevel];
Thread.sleep(t);//延迟
}catch(InterruptedException e){e.printStackTrace();}//追踪检错
if(nextPiece.m_bNeedNewPiece)
{//需要产生方块
removelines();//消行
transferPreToCur();//将预览区方块传到游戏区
//等级变化
if(m_nOldScore-10000>=0&&m_nOldScore!=0){
sScore.m_nPlayLevel++; //若累加分数为10000 的倍数则等级+1
m_nOldScore=0;//累加分数清0
}
if(m_nTotalPieces%(27+sScore.m_nPlayLevel)==0)addRandomLine();//添加随机行
nextPiece.start();//产生新方块
nextPiece.m_bNeedNewPiece=false;//不需产生新方块
}
else
{//不需要新方块处理
nextPiece.m_bNeedNewPiece=!moveCurPiece(0,-1,false);//将预览区方块传到游戏区,方块自动下落
}
sendStatus();//发送游戏状态
m_repaint();//刷新
// System.out.println("ci shi zheng chang");
}
m_theThread=null;//停止线程
}
public void sendStatus()
{//若是连机把玩家游戏区域的信息以数组方式发送给对手
// System.out.println("发送游戏状态呀!!!!!!!!!!!!!!!!");
if (m_tFrame.m_nNetStatus == Frame1.NOCONNECT)
return;
String str = "Status:";
for (int nCol = 0; nCol < m_nCols; nCol++)
for (int nRow = 0; nRow < m_nRows; nRow++){
str += oGameArea.m_nField[nCol][nRow] + "|";
}
// System.out.println("wrong");
m_tFrame.sendStr(str);
// System.out.println("right");
//连机时候使用
}
public void m_repaint(){
//刷新游戏画面
repaint();
sScore.repaint();
nextPiece.repaint();
oGameArea.repaint();
// System.out.println("这里慢么???");
}
/**
*移动方块
*@param nDx 左右移动,向左为-1
*@param nDy 上下移动,向下为-1
*@param bRotate 是否转动
*/
private synchronized boolean moveCurPiece(int nDx,int nDy,boolean bRotate)
{
Square newpos[]=new Square[4];//声名新方块
for(int i=0;i<4;i++){
if(bRotate)//若需转动
{//定位的中心方块与准备移动的小方块间的位移
int dx=m_curPiece[i].m_nColumn-m_curPiece[0].m_nColumn;
int dy=m_curPiece[i].m_nRow-m_curPiece[0].m_nRow;
//绘制转动后的方块
newpos[i]=new Square(m_curPiece[0].m_nColumn-dy,m_curPiece[0].m_nRow+dx,m_curPiece[i].m_nColor,m_curPiece[i].m_nPieceValue);
}
else
{//若不转动则方块随按键移动
newpos[i]=new Square(m_curPiece[i].m_nColumn+nDx,m_curPiece[i].m_nRow+nDy,m_curPiece[i].m_nColor,m_curPiece[i].m_nPieceValue);
}
}
//若方块不能移动则返回假
if(moveSquares(m_curPiece,newpos)==false) return false;//不移动方块
m_curPiece=newpos;//将转动后方块传到游戏区
return true;//移动方块
}
/**
* 移动方块,如果不能移动,则返回假
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -