package win;
import java.io.*;
import javax.swing.*;
import javax.swing.event.*;

//import com.sun.corba.se.impl.javax.rmi.CORBA.Util;
//import com.sun.corba.se.pept.transport.Selector;

import java.awt.*;
import java.awt.event.*;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Iterator;
import java.util.Random;
import java.util.Scanner;
import java.util.Set;
import java.util.Timer;
import java.util.TimerTask;

import java.io.RandomAccessFile;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.nio.*;
public class elsfk extends Frame {
	final int RECT_HEIGHT = 30;
	final int RECT_WIDTH = 20;
	
	int keyCode = 0;
	int off_x = 10;
	int off_y = 0;
	int score = 0;
	int highScore_easy = 0;
	int highScore_mid = 0;
	int highScore_hard = 0;
	int difficulty = 0;
	
	Panel pl_westPanel ;
	Panel pl_eastPanel ;
	Panel pl_southPanel = new Panel();
	Label lb_nextShape;
	Label lb_scoreTitle;
	Label lb_highScoreTitle;
	Label lb_currentSession;
	Label lb_difficultyTitle;
	Button bt_start;
	String s = new String();
	Timer tm = new Timer(true);
	TimerTask tt;
	boolean gameStart = false;
	boolean gameOver = false;
	boolean isPause = true;
	Font numFont = new Font("Times New Roman",Font.PLAIN,18);
	Font hzFont = new Font("宋体",Font.PLAIN,15);
	boolean[][] array = new boolean[RECT_WIDTH][RECT_HEIGHT];
	boolean[][] rightArray = new boolean[RECT_WIDTH][RECT_HEIGHT];
	//   _ _
	//  |   |
	//  |_ _|
	int[] shape1_CoordArray ={0,1,1,0,0,0,1,1};
    //   _
	//  | |
	//  | |_
	//  |_ _|
	//   _ _ _
	//  |  _ _|
	//  |_|
	//   _ _ 
	//  |_  |
	//    | |
	//	  |_|
	//       _
	//   _ _| |
	//  |_ _ _|
	int[] shape2_CoordArray ={0,0,0,1,0,1,2,2,
			                  0,0,1,2,1,0,0,0,
			                  0,1,1,1,0,0,1,2,
			                  2,2,1,0,0,1,1,1};
	//     _
	//   _| |_
	//  |_ _ _|
	//   _
	//  | |_
	//  |  _|
	//  |_|	
	//   _ _ _
	//  |_   _|
	//    |_|
	//     _
	//   _| |
	//  |_  |
	//    |_|
	//
	int[] shape3_CoordArray ={1,0,1,2,0,1,1,1,
							  0,0,0,1,0,1,2,1,
							  0,1,2,1,0,0,0,1,
							  0,1,1,1,1,0,1,2};
	//	 _
	//  | |
	//  | |
	//  | |
	//  |_|
	//   _ _ _ _
	//  |_ _ _ _|
	int[] shape4_CoordArray ={0,0,0,0,0,1,2,3,
							  0,1,2,3,0,0,0,0};
	shape shape;
	shape nextShape;
 
	class shape{
		int[] Coord;//基本坐标
		int curType;
		int totalTypes;
		shape(int[] co){
			int i;
			totalTypes = co.length/8;
			Random rnd = new Random();
			curType = rnd.nextInt(totalTypes);
			Coord = new int[co.length];
			for(i = 0;i < co.length;i++)
			{
				Coord[i] = co[i];
			}
		}
		public int getCoordX(int i)
		{
			return  Coord[curType * 8 + i];
		}
		public int getCoordY(int i)
		{
			return  Coord[curType * 8 + 4 +i];
		}
		public void change()
		{
			
			if (curType == totalTypes - 1)
			{
				curType = 0;
			}
			else
			{
				curType++;
			}
			
		}
		public void changeBack()
		{
			
			if (curType == 0)
			{
				curType = totalTypes - 1;
			}
			else
			{
				curType--;
			}
		}
	}
	 
	public void gameStart()
	{
		newShapeStart();
		shape = nextShape;
		newShapeStart();
		tm.schedule(tt, 0,200);
	}
	public void checkDeleteLine()
	{
		int i,j,k;
		int count = 0;
		j = RECT_HEIGHT - 1;
		while(j >= 0)
		{
			count = 0;
			for(i = 0;i < RECT_WIDTH;i++)
			{
				if(array[i][j] == true)
				{
					count ++;
				}
			}
			if(count == RECT_WIDTH)
			{
				score += 100;
				for(k = j;k > 0;k--)
				{
					for(i = 0;i < RECT_WIDTH;i++)
					{
						array[i][k] = array[i][k - 1];
					}
				}
				for(i = 0;i < RECT_WIDTH;i++)
				{
					array[i][0] = false;
				}
			}
			else
			{ 
				j --;
			}
		}
	}
	
	public void newShapeStart()
	{
		off_y = 0;
		off_x = 10;
		Random rnd = new Random();
		switch(rnd.nextInt(4))
		{
		case 0:
			nextShape = new shape(shape1_CoordArray);;
			break;
		case 1:
			nextShape = new shape(shape2_CoordArray);
			break;
		case 2:
			nextShape = new shape(shape3_CoordArray);
			break;
		case 3:
			nextShape = new shape(shape4_CoordArray);
			break;
		default:
			break;
		}
		pl_eastPanel.repaint();
	}
	public void moveOrChange(int code)
	{
		int i,j;
		boolean conflict = false;
		if(code != KeyEvent.VK_UP && code != KeyEvent.VK_DOWN&& code != KeyEvent.VK_LEFT&& code != KeyEvent.VK_RIGHT)
		{
			return;
		}
		for(i = 0;i < 4;i++)
		{
			array[off_x + shape.getCoordX(i)][off_y + shape.getCoordY(i)] = false;
		}
		if(code == KeyEvent.VK_UP)
		{
			shape.change();
		}
		else if(code == KeyEvent.VK_DOWN)
		{
			off_y ++;
		}
		else if(code == KeyEvent.VK_LEFT)
		{
			off_x --;
		}
		else if(code == KeyEvent.VK_RIGHT)
		{
			off_x ++;
		}
		for(i = 0;i < 4;i++)
		{
			if(off_x + shape.getCoordX(i) < 0 || off_x + shape.getCoordX(i) > (RECT_WIDTH - 1) || off_y + shape.getCoordY(i) > (RECT_HEIGHT - 1) || array[off_x + shape.getCoordX(i)][off_y + shape.getCoordY(i)] == true)
			{
				if(code == KeyEvent.VK_UP)
				{
					shape.changeBack();
				}
				else if(code == KeyEvent.VK_DOWN)
				{
					off_y --;
					conflict = true;
				}
				else if(code == KeyEvent.VK_LEFT)
				{
					off_x ++;
				}
				else if(code == KeyEvent.VK_RIGHT)
				{
					off_x --;
				}
				
				break;
			}
		}
		for(i = 0;i < 4;i++)
		{
			array[off_x + shape.getCoordX(i)][off_y + shape.getCoordY(i)] = true;
		}
		if(conflict == true)
		{
			if(off_y < 1){
				
				for(i = 0;i < RECT_WIDTH;i++)
				{
					for(j = 0;j < RECT_HEIGHT;j++)
					{
						array[i][j] = false;
					}
				}
				isPause = true;
				new ModalDialog("");
				writeHighScore(score);
				score = 0;
				shape = nextShape;
				newShapeStart();
				isPause = false;
			}
			else
			{
				shape = nextShape;
				checkDeleteLine();
				newShapeStart();
			}
		}
	}
	void pauseOrStart()
	{
		if (bt_start.getLabel() == "Start")
		{
			if(gameStart == false)
			{
				gameStart = true;
				gameStart();
			}
			bt_start.setLabel("Pause");
		}
		else
		{
			bt_start.setLabel("Start");
		}
		isPause = !isPause;
	}
	void readFile2String(StringBuffer sb,String fileName)
	{
		BufferedReader br;
		String s;
			try{
				br=new BufferedReader(new FileReader(fileName));
				while((s=br.readLine())!=null) {
					sb.append(s);
				} 
				br.close();
			}
			catch (FileNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	}
	void writeString2File(StringBuffer sb,String fileName)
	{
		BufferedWriter bw;
		String s;
			try{
				bw=new BufferedWriter(new FileWriter(fileName));
				bw.write(sb.toString());
				bw.close();
			}
			catch (FileNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	}
	int readHighScore()
	{
		File file = new File(".\\record.txt");
		if(file.exists()){
			String sFileName = file.toString();
			StringBuffer sFileContent = new StringBuffer();
			String s1 = "highScore_easy:";
			readFile2String(sFileContent,sFileName);
			int highScoreEasyIndex = sFileContent.indexOf(s1);
			int len = s1.length();
			s1 = sFileContent.substring(highScoreEasyIndex + len);
			return Integer.parseInt(s1);
		}
		return 0;
	}
	void writeHighScore(int newHighScore)
	{
		File file = new File(".\\record.txt");
		String sFileName = file.toString();
		StringBuffer sFileContent = new StringBuffer();
		String s1 = "highScore_easy:";
		String newS;
		newS = String.format("%d", newHighScore);
		if(file.exists()){
			readFile2String(sFileContent,sFileName);
			int highScoreEasyIndex = sFileContent.indexOf(s1);
			int len = s1.length();
			s1 = sFileContent.substring(highScoreEasyIndex + len);
			if (newHighScore > Integer.parseInt(s1))
			{
				
				
				sFileContent.replace(highScoreEasyIndex + len, highScoreEasyIndex + len + s1.length(), newS);
				writeString2File(sFileContent,sFileName);
			}
		}
		else
		{
			
			try {
				file.createNewFile();
				sFileContent.append(s1);
				sFileContent.append(newS);
				writeString2File(sFileContent,sFileName);
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		}
	}
	public class ModalDialog extends JDialog{
		Button bt_ok;
		Label lb_gameOver;
		ModalDialog(String str){
			setModal(true);
			setSize(180,120);
			setTitle(str);
			setLocationRelativeTo(null);//窗口居中
			setLayout(null);
			setBackground(Color.white);
			lb_gameOver = new Label("GAME OVER !!!");
			lb_gameOver.setFont(numFont);
			lb_gameOver.setForeground(Color.RED);
			lb_gameOver.setLocation(20,20);
			lb_gameOver.setSize(150,20);
			bt_ok = new Button("确认");
			bt_ok.addActionListener(new ActionListener() {
				@Override
				public void actionPerformed(ActionEvent arg0) {
					// TODO Auto-generated method stub
					dispose();
				}
			});
			bt_ok.setLocation(60,50);
			bt_ok.setSize(60,30);
			add(lb_gameOver);
			add(bt_ok);
			setVisible(true);
		}
	}
	public elsfk(){
		super();
//		try {
//			FileInputStream in = new FileInputStream(".\record.txt");
//		} catch (FileNotFoundException e1) {
//			// TODO Auto-generated catch block
//			e1.printStackTrace();
//		}
//		try {
//			FileOutputStream out = new FileOutputStream(".\record.txt");
//		} catch (FileNotFoundException e1) {
//			// TODO Auto-generated catch block
//			e1.printStackTrace();
//		}
		

		highScore_easy = readHighScore();
		
		requestFocus();
		//全局键盘处理
		KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventPostProcessor(new KeyEventPostProcessor()
	       {
	         public boolean postProcessKeyEvent(KeyEvent e)
	         { 
	          if(e.getID() == KeyEvent.KEY_TYPED && (e.getKeyCode() == KeyEvent.VK_ENTER || e.getKeyCode() == KeyEvent.VK_SPACE))
	          {
	        	  pauseOrStart();
	        	  return true;
	          }
	          else if(e.getID() == KeyEvent.KEY_PRESSED && !isPause)
	          {
	        	  Graphics g = pl_westPanel.getGraphics();
					keyCode = e.getKeyCode();
					int i,j;
					moveOrChange(keyCode);
					
					for(i = 0;i < RECT_WIDTH;i++)
					{
						for(j = 0;j < RECT_HEIGHT;j++)
						{
							if(array[i][j] == true)
							{
								g.setColor(Color.red);
								g.fill3DRect(1 + i * 10, 1 + j * 10, 10, 10, true);
							}
							else
							{
								g.setColor(Color.white);
								g.fillRect(1 + i * 10, 1 + j * 10, 10, 10);
							}
							
						}
					}
					return true;
	          }
	          else
	          {
	        	  	return false;
	          }
	         }
	       }
	     );
		
		
		
		
		addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent e){writeHighScore(score);System.exit(0);}});//按下关闭按钮退出
		
		setLayout(null);
		setBackground(Color.white);
		setSize(300,400);
		setTitle("俄罗斯方块");
		setLocationRelativeTo(null);//窗口居中
		
		bt_start = new Button("Start");
		bt_start.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent arg0) {
				// TODO Auto-generated method stub
				pauseOrStart();
			}
		});
		bt_start.setLocation(70,10);
		bt_start.setSize(60,30);
		lb_nextShape = new Label("下个形状:");
		lb_nextShape.setFont(hzFont);
		lb_nextShape.setForeground(Color.BLUE);
		lb_nextShape.setLocation(10, 10);
		lb_nextShape.setSize(80,30);		
		lb_scoreTitle = new Label("得分:");
		lb_scoreTitle.setFont(hzFont);
		lb_scoreTitle.setForeground(Color.BLUE);
		lb_scoreTitle.setLocation(10, 90);
		lb_scoreTitle.setSize(80,30);
		lb_highScoreTitle = new Label("最高分:");
		lb_highScoreTitle.setFont(hzFont);
		lb_highScoreTitle.setForeground(Color.BLUE);
		lb_highScoreTitle.setLocation(10, 160);
		lb_highScoreTitle.setSize(80,30);
		lb_difficultyTitle = new Label("难易度:");
		lb_difficultyTitle.setFont(hzFont);
		lb_difficultyTitle.setForeground(Color.BLUE);
		lb_difficultyTitle.setLocation(10, 225);
		lb_difficultyTitle.setSize(80,30);
		pl_westPanel = new Panel(){
			@Override
			public void paint(Graphics g) {
				// TODO Auto-generated method stub
				super.paint(g);
				g.drawRect(0,0,RECT_WIDTH * 10 + 1,RECT_HEIGHT * 10 + 1);
			}
		};
		pl_eastPanel = new Panel(){
			@Override
			public void paint(Graphics g) {
				// TODO Auto-generated method stub
				super.paint(g);
				int i,j;
//				String s = new String();
				g.setColor(Color.red);
				g.setFont(numFont);
				if (nextShape != null)
				{
					for(i = 0;i < 4;i++)
					{	
						g.fill3DRect(30 + 10 * nextShape.getCoordX(i), 50 + 10 * nextShape.getCoordY(i), 10, 10, true);
					}
				}
				s = String.format("%d", score);
				g.drawString(s, 30, 140);
				s = String.format("%d", highScore_easy);
				g.drawString(s, 30, 210);
				//g.setFont(hzFont);
				if(difficulty == 0)
				{
					g.drawString("easy", 20, 280);
				}
				else if(difficulty == 1)
				{
					g.drawString("middle", 20, 280);
				}
				else if(difficulty == 2)
				{
					g.drawString("hard", 20, 280);
				}
			}
		};
		pl_westPanel.setLocation(8, 30);
		pl_westPanel.setSize(RECT_WIDTH * 10 + 2, RECT_HEIGHT * 10 + 2);
		add(pl_westPanel);
		pl_eastPanel.setLocation(RECT_WIDTH * 10 + 10,30);
		pl_eastPanel.setSize(82, RECT_HEIGHT * 10 + 2);
		//pl_eastPanel.setBackground(Color.yellow);
		add(pl_eastPanel);
		//pl_southPanel.setBackground(Color.gray);
		pl_southPanel.setLocation(8,RECT_HEIGHT * 10 + 2 + 30);
		pl_southPanel.setSize(286, 60);
		add(pl_southPanel);
		pl_eastPanel.setLayout(null);
		pl_eastPanel.add(lb_nextShape);
		pl_eastPanel.add(lb_scoreTitle);
		pl_eastPanel.add(lb_highScoreTitle);
		pl_eastPanel.add(lb_difficultyTitle);
		pl_southPanel.setLayout(null);
		pl_southPanel.add(bt_start);
				
		setVisible(true);
		tt = new TimerTask(){
			Graphics g = pl_westPanel.getGraphics();
			/* (non-Javadoc)
			 * @see java.util.TimerTask#run()
			 */
			@Override
			public void run() {
				// TODO Auto-generated method stub				
				int i = 0;
				int j = 0;
				do {  
                    try {  
                        Thread.sleep(1);  
                    } catch (InterruptedException e) {  
                    }     
                } while (isPause);  
				moveOrChange(KeyEvent.VK_DOWN);
				
				for(i = 0;i < RECT_WIDTH;i++)
				{
					for(j = 0;j < RECT_HEIGHT;j++)
					{
						if(array[i][j] == true)
						{
							g.setColor(Color.red);
							g.fill3DRect(1 + i * 10, 1 + j * 10, 10, 10, true);
						}
						else
						{
							g.setColor(Color.white);
							g.fillRect(1 + i * 10, 1 + j * 10, 10, 10);
						}
						
					}
				}
				
			}
		};
		
	}
	public static void main(String[] args){
		new elsfk();	
	}
}
最近下载更多
1112WHQ  LV7 11月3日
luo110012  LV9 5月15日
微笑刺客  LV14 3月7日
522881297  LV1 2022年12月19日
微信网友_6248906393866240  LV1 2022年12月5日
包渤昊  LV2 2022年11月30日
liyunzhe  LV1 2022年10月31日
zfyzfyABCDEFG  LV1 2022年7月19日
微信网友_5992582549164032  LV6 2022年6月7日
最近浏览更多
1112WHQ  LV7 11月3日
大白8加3  LV1 8月18日
942395729  LV1 6月30日
sdhfkh  LV4 6月12日
luo110012  LV9 5月15日
小安同学  LV7 5月11日
微笑刺客  LV14 3月7日
522881297  LV1 2022年12月19日
wwfl02  LV3 2022年12月16日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友