JAVA课程设计——俄罗斯方块

0.负责模块为可视化界面,技术栈为

(1)异常处理
(2)多线程
(3)文件存储
(4)Java swing

1.登陆界面

我的代码

import java.awt.Color;
	import java.awt.FlowLayout;
	import java.awt.Font;
	import java.awt.GridLayout;
	import java.awt.event.ActionEvent;
	import java.awt.event.ActionListener;
	import java.io.File;
	import java.io.IOException;
	import javax.swing.ImageIcon;
	import javax.swing.JButton;
	import javax.swing.JFrame;
	import javax.swing.JLabel;
	import javax.swing.JPanel;
	import javax.swing.JPasswordField;
	import javax.swing.JTextField;
	import tetris.control.*;

	/**
	* 
	 * @author  lsm
	*
	*/
	public class Main {

		private static void login() {
			JFrame frame = new JFrame();
			frame.setResizable(false);
			ImageIcon background = new ImageIcon("beautify/login.jpg");
			JLabel backLabel = new JLabel(background);
			backLabel.setBounds(0, 0, background.getIconWidth(), background.getIconHeight());
			JPanel panel = new JPanel();
			panel = (JPanel) frame.getContentPane(); 
			panel.setOpaque(false);
			panel.setLayout(new FlowLayout());
			frame.getLayeredPane().add(backLabel, new Integer(Integer.MIN_VALUE)); 
	
			/*设置界面属性*/
			frame.setTitle("Tetris");
			GridLayout grid = new GridLayout(2, 2);
			grid.setHgap(25);
			grid.setVgap(25);
			JPanel panel1 = new JPanel(grid);
			panel1.setOpaque(false);
			Font f1 = new Font("Serif", Font.BOLD, 27);
			Font f2 = new Font("Serif", Font.ITALIC, 47);
			JTextField b1 = new JTextField(10);
			JPasswordField b2 = new JPasswordField(10);
			JLabel label1 = new JLabel("         Player Name");
			JLabel label2 = new JLabel("         Password");
			JLabel label3 = new JLabel("Welcome to Tetris!");

			label1.setFont(f1);
			label2.setFont(f1);
			label3.setFont(f2);
			panel1.add(label1);
			panel1.add(b1);
			panel1.add(label2);
			panel1.add(b2);

			JPanel panel2 = new JPanel();
			panel2.setOpaque(false);
			JButton button1 = new JButton("Login");
			JButton button2 = new JButton("Register");
			button1.setForeground(Color.BLACK);
			button2.setForeground(Color.BLACK);
			button1.setBackground(Color.lightGray);
			button2.setBackground(Color.lightGray);

			panel2.add(button1);
			panel2.add(button2);
			panel.add(panel1);
			panel.add(panel2);
			panel.add(label3);

			frame.setBounds(100, 100, background.getIconWidth(), background.getIconHeight());
			frame.setLocation(450, 60);
			frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			frame.setSize(500, 500);
			frame.setVisible(true);

			button1.addActionListener(new ActionListener() {
				@SuppressWarnings("deprecation")
				@Override
				public void actionPerformed(ActionEvent arg0) {

					String playerName = b1.getText();
					String playerPassword = b2.getText();
					try {
						if (PlayerFile.matchPassword(playerName, playerPassword)) {
							frame.setVisible(false);
							new RussiaBlocksGame("Tetris");
						}
					} catch (IOException e) {
						e.printStackTrace();
					}

				}
			});

			button2.addActionListener(new ActionListener() {
				@Override
				public void actionPerformed(ActionEvent arg0) {
					String playerName = b1.getText();
					@SuppressWarnings("deprecation")
					String playerPassword = b2.getText();
					try {
						if (!PlayerFile.writeFile(playerName, playerPassword)) {

						}
					} catch (IOException e) {
						e.printStackTrace();
					}

				}
			});
		}

		public static void main(String[] args) {
			javax.swing.SwingUtilities.invokeLater(new Runnable() {
				@Override
				public void run() {
					new Music();
					login();
				}
			});
		}
	}

界面图,加入了背景音乐,引用自 https://blog.csdn.net/qq_40590018/article/details/81452392

2.游戏界面

我的代码(这里就贴主要界面代码,具体方法不展示)

    		public class RussiaBlocksGame extends JFrame {	
    				private GameCanvas canvas;
				private ErsBlock block;
				private boolean playing = false;
				private ControlPanel ctrlPanel;
				private JMenuBar menuBar = new JMenuBar();
				private JMenu help = new JMenu("Help");
				private JMenu setting = new JMenu("Setting");
				private JMenuItem about = new JMenuItem("About");
				private JMenuItem setBackground = new JMenuItem("SetBackground");
				private JMenuItem setFrontground = new JMenuItem("SetFrontground");
				        private JMenuItem chart=new JMenuItem("Ranking List");

				/*
				 *  初始化菜单栏
				 */
				private void initScope() {

					setJMenuBar(menuBar);
					menuBar.add(help);
					menuBar.add(setting);
					help.add(about);
					help.add(chart);
					setting.add(setBackground);
					setting.add(setFrontground);
					/* 
					 *  设置自定义颜色,引用自 https://www.jb51.net/article/142716.htm
					 */
					setFrontground.addActionListener(new ActionListener() {
						@Override
						public void actionPerformed(ActionEvent e) {
					Color newFrontColor = JColorChooser.showDialog(RussiaBlocksGame.this, "SetFrontground", canvas.getBlockColor());
							if (newFrontColor != null) {
								canvas.setBlockColor(newFrontColor);
							}
						}
					});

					setBackground.addActionListener(new ActionListener() {
						@Override
						public void actionPerformed(ActionEvent e) {
							Color newBackColor = JColorChooser.showDialog(RussiaBlocksGame.this, "SetBackground",
									canvas.getBackgroundColor());
							if (newBackColor != null) {
								canvas.setBackgroundColor(newBackColor);
							}
						}
					});
					about.addActionListener(new ActionListener() {
						@Override
						public void actionPerformed(ActionEvent e) {
							JOptionPane.showMessageDialog(null,
					"→ move right " + "← move left " + "↓ speed up " + "↑ conservasion");
						}
					});
					chart.addActionListener(new ActionListener() {
						@Override
						public void actionPerformed(ActionEvent e) {
							try {
								new RanklistDialog(PlayerFile.outputCharts());
							} catch (IOException e1) {
								e1.printStackTrace();
							}
						}
					});

				}

				public RussiaBlocksGame(String title) {
					super(title);
					setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
					setSize(450, 570);
					setLocation(450, 60);
					setTitle("Tetris");
    
					initScope();
					Container container = getContentPane();
					container.setLayout(new BorderLayout(6, 0));
					canvas = new GameCanvas(ROWS, COLS);
					ctrlPanel = new ControlPanel( this );
					container.add(canvas, BorderLayout.CENTER); 
					container.add(ctrlPanel, BorderLayout.EAST);

					addWindowListener(new WindowAdapter() {
						@Override
						public void windowClosing(WindowEvent we) {
							stopGame();
							System.exit(0);
						}
					});
					addComponentListener(new ComponentAdapter() {
						@Override
						public void componentResized(ComponentEvent ce) {
			 				canvas.adjust();
						}
					});
					setVisible(true);
					setResizable(false);
				}
    		}

游戏界面为

3.排行榜(只取前五名)

我的代码:

            import java.awt.Color;
	import java.awt.Font;
	import java.util.HashMap;
	import java.util.Map;
	import javax.swing.ImageIcon;
	import javax.swing.JDialog;
	import javax.swing.JLabel;
	import javax.swing.JPanel;

	public class RanklistDialog extends JDialog{
		private JLabel score1,score2,score3,score4,score5;
		private JLabel name1,name2,name3,name4,name5;
		private String[][] ranking;

		public RanklistDialog(List<Entry<String, String>> list) {
			ranking = new String[5][2];
			int i=0;
			for(List.Entry<String, String> e: list.entrySet()) {
				String name=e.getKey();
				String  score=e.getValue(); 
				ranking[i][0]=name;
				ranking[i][1]=score;
				i++;
			}
			Font f = new Font("Serif", Font.ITALIC, 25);
			name1 = new JLabel();
			name1.setText(ranking[0][0]);
			name1.setFont(f);
			name1.setForeground(Color.yellow);
			name1.setBounds(150,270, 100, 30);
			this.add(name1);
			score1 = new JLabel();
			score1.setText(ranking[0][1]);
			score1.setFont(f);
			score1.setForeground(Color.yellow);
			score1.setBounds(280,270,100, 30);
			this.add(score1);
	
			name2 = new JLabel();
			name2.setText(ranking[1][0]);
			name2.setFont(f);
			name2.setForeground(Color.yellow);
			name2.setBounds(150,330,100, 30);
			this.add(name2);
			score2 = new JLabel(ranking[1][1]);
			score2.setFont(f);
			score2.setForeground(Color.yellow);
			score2.setBounds(280,330,100, 30);
			this.add(score2);
	
			name3 = new JLabel();
			name3.setText(ranking[2][0]);
			name3.setFont(f);
			name3.setForeground(Color.yellow);
			name3.setBounds(150, 390, 100, 30);
			this.add(name3);
			score3 = new JLabel(ranking[2][1]);
			score3.setFont(f);
			score3.setForeground(Color.yellow);
			score3.setBounds(280, 390, 100, 30);
			this.add(score3);
	
			name4 = new JLabel();
			name4.setText(ranking[3][0]);
			name4.setFont(f);
			name4.setForeground(Color.yellow);
			name4.setBounds(150, 450, 100, 30);
			this.add(name4);
			score4 = new JLabel(ranking[3][1]);
			score4.setFont(f);
			score4.setForeground(Color.yellow);
			score4.setBounds(280, 450, 100, 30);
			this.add(score4);
			name5 = new JLabel();
			name5.setText(ranking[4][0]);
			name5.setFont(f);
			name5.setForeground(Color.yellow);
			name5.setBounds(150, 510, 100, 30);
			this.add(name5); 
			score5 = new JLabel(ranking[4][1]);
			score5.setFont(f);
			score5.setForeground(Color.yellow);
			score5.setBounds(280, 510, 100, 30);
			this.add(score5);
	
			ImageIcon icon = new ImageIcon("beautify/charts.jpg");
			JLabel background = new JLabel(icon);
			background.setBounds(0, 0, icon.getIconWidth(),icon.getIconHeight());
			JPanel imagePanel = (JPanel)this.getContentPane();
			imagePanel.setOpaque(false);
			imagePanel.setLayout(null);
			this.setModal(true);
			this.setTitle("Ranking List");
			this.setLayout(null);
			this.getLayeredPane().add(background, new Integer(Integer.MIN_VALUE));
			this.setResizable(false);
			this.setSize(400, 600);
			this.setLocationRelativeTo(null);
			this.setVisible(true);
			this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
		}
	}

排行榜界面(好像要暴露什么)

4.我的总结

对于一个喜欢美术的人来说,界面设计真的是爽歪歪啊~,不过好像效果一般啊。。。一直对代码这块比较抵触,开发也不是以后的发展方向,
,这次课程设计这个模块就主要是整合另外两个成员写的方法,难度小,乐在其中。

posted on 2020-01-09 11:50  来颗橘子  阅读(743)  评论(0编辑  收藏  举报