gui实现2048小游戏

1.登录模块
public class LoginJFrame extends JFrame implements MouseListener{
//登录按钮
JButton login = new JButton();
//注册按钮
JButton register = new JButton();
//用户名输入文本框
JTextField username = new JTextField();
//密码输入文本框
JTextField password = new JTextField();
//弹窗提示
JDialog jDialog = new JDialog();
//Arraylist集合存取用户数据
ArrayList userlist;
ArrayList usernamelist;

public LoginJFrame(ArrayList userlist,ArrayList usernamelist) {
this.userlist = userlist;
this.usernamelist = username;
initFrame();
initView();
setVisible(true);
}

public void initView() {

//创建JLabel添加用户名文字
JLabel usernameText = new JLabel(new ImageIcon(“C:\Users\全息\Desktop\图片&代码\2048登录注册\用户名.jpg”));
usernameText.setBounds(116, 135, 51, 19);
username.setBounds(195, 134, 200, 30);

//创建JLabel添加密码文字
JLabel passwordText = new JLabel(new ImageIcon(“C:\Users\全息\Desktop\图片&代码\2048登录注册\密码.jpg”));
passwordText.setBounds(130, 195, 35, 18);
password.setBounds(195, 195, 200, 30);

login.setIcon(new ImageIcon(“C:\Users\全息\Desktop\图片&代码\2048登录注册\登录.png”));
login.setBounds(133, 260, 90, 40);
//给登录按钮绑定鼠标监听
//当事件被触发之后,执行当前类中的对应方法
login.addMouseListener(this);

register.setIcon(new ImageIcon(“C:\Users\全息\Desktop\图片&代码\2048登录注册\注册.png”));
register.setBounds(256, 260, 90, 40);
register.addMouseListener(this);

JLabel backGround = new JLabel(new ImageIcon(“C:\Users\全息\Desktop\图片&代码\2048登录注册\background.png”));
backGround.setBounds(0, 0, 470, 390);

//绑定组件
this.getContentPane().add(username);
this.getContentPane().add(password);
this.getContentPane().add(usernameText);
this.getContentPane().add(passwordText);
this.getContentPane().add(login);
this.getContentPane().add(register);
this.getContentPane().add(backGround);
}
public void initFrame() {
//大小
setSize(488, 430);
//居中
setLocationRelativeTo(null);
//置顶
setAlwaysOnTop(true);
//关闭模式
setDefaultCloseOperation(3);
//取消内部默认布局
setLayout(null);
}

@Override
public void mouseClicked(MouseEvent e) {
//校验用户输入的用户名和密码是否正确。
//得到文本输入框里面的文本(内容)
/*//1.得到用户输入的用户名和密码
//2.比较
//3.根据不同的结果做出不同的反应
//如果正确,进入游戏界面
//如果不正确,弹出错误提示。

*/
String text = username.getText();
String text1 = password.getText();
if (e.getSource() == login) {
if("".equals(username.getText()) && “”.equals(password.getText())){
System.out.println(“用户名和密码为空”);
showDialog(“小样,还没输用户名和密码呢”);
}
User e1 = new User(username.getText(), password.getText());
userlist.add(e1);
if (userlist.contains(e1) ) {
System.out.println(“用户名和密码正确”);
//把当前的登录界面关闭
this.setVisible(false);
//展示游戏界面.equals(text)get(1).getPassword().equals(text1)
new MainFrame();
} else {
System.out.println(“用户名和密码错误”);
//如果错误了,还需要给出弹框

showDialog(“小样,用户名和密码输错了”);
}
}else if(e.getSource() == register){
System.out.println(“111”);
this.setVisible(false);
//点击了注册按钮
new RegisterJFrame(userlist,usernamelist);
}
}

//该方法用于展示一个弹框
//形参:表示当前弹框展示的内容
public void showDialog(String content) {
//JDialog就是一个弹框,跟JFrame是一样的
//isVisible表示判断弹框是否展示出来,
//如果没有展示出来,我们才进行设置,并展示
if(!jDialog.isVisible()){
//设置弹框的宽和高
jDialog.setSize(100, 100);
//居中
jDialog.setLocationRelativeTo(null);
//置顶
jDialog.setAlwaysOnTop(true);
//删除弹框中所有的内容
jDialog.getContentPane().removeAll();
//创建一个JLabel去编写文本内容
JLabel jLabel = new JLabel(content);
//把文本添加到弹框当中
jDialog.add(jLabel);
//把弹框展示出来
jDialog.setVisible(true);
}
}

@Override
public void mousePressed(MouseEvent e) {
//修改背景图片
//判断一下,当前按下的是否为登录按钮
if (e.getSource() == login) {
login.setIcon(new ImageIcon(“C:\Users\全息\Desktop\图片&代码\2048登录注册\登录按下.png”));
}
}

@Override
public void mouseReleased(MouseEvent e) {
//当鼠标松开的时候,需要把背景色改回来
if (e.getSource() == login) {
login.setIcon(new ImageIcon(“C:\Users\全息\Desktop\图片&代码\2048登录注册\登录.png”));
}
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}

2.注册模块
public class RegisterJFrame extends JFrame implements MouseListener {
JButton submit = new JButton();
JButton reset = new JButton();
JTextField username = new JTextField();
JTextField password = new JTextField();
JTextField repassword = new JTextField();
JDialog jDialog = new JDialog();
ArrayList userlist;
ArrayList usernamelist;

public RegisterJFrame(ArrayList userlist,ArrayList usernamelist){
this.userlist = userlist;
this.usernamelist = usernamelist;
initFrame();
initView();
setVisible(true);
}
public void initFrame() {
//大小
setSize(488, 430);
//居中
setLocationRelativeTo(null);
//置顶
setAlwaysOnTop(true);
//关闭模式
setDefaultCloseOperation(3);
//取消内部默认布局
setLayout(null);
}

public void initView() {
//创建JLabel添加用户名文字
JLabel usernameText = new JLabel(new ImageIcon(“C:\Users\全息\Desktop\图片&代码\2048登录注册\注册用户名.jpg”));
usernameText.setBounds(85, 135, 80, 20);
username.setBounds(195, 134, 200, 30);
//创建JLabel添加密码文字
JLabel passwordText = new JLabel(new ImageIcon(“C:\Users\全息\Desktop\图片&代码\2048登录注册\注册密码.jpg”));
passwordText.setBounds(97, 193, 70, 20);
password.setBounds(195, 195, 200, 30);
//创建JLabel添加密码文字
JLabel repasswordText = new JLabel(new ImageIcon(“C:\Users\全息\Desktop\图片&代码\2048登录注册\再次输入密码.jpg”));
repasswordText.setBounds(64, 250, 90, 20);
repassword.setBounds(195, 255, 200, 30);
submit.setIcon(new ImageIcon(“C:\Users\全息\Desktop\图片&代码\2048登录注册\确定.png”));
submit.setBounds(132, 307, 90, 40);
submit.addMouseListener(this);
//给登录按钮绑定鼠标监听
//当事件被触发之后,执行当前类中的对应方法
//login.addMouseListener(this);
reset.setIcon(new ImageIcon(“C:\Users\全息\Desktop\图片&代码\2048登录注册\重置.png”));
reset.setBounds(253, 307, 90, 40);
reset.addMouseListener(this);
JLabel backGround = new JLabel(new ImageIcon(“C:\Users\全息\Desktop\图片&代码\2048登录注册\background.png”));
backGround.setBounds(0, 0, 470, 390);
this.getContentPane().add(username);
this.getContentPane().add(password);
this.getContentPane().add(repassword);
this.getContentPane().add(usernameText);
this.getContentPane().add(passwordText);
this.getContentPane().add(repasswordText);
this.getContentPane().add(submit);
this.getContentPane().add(reset);
this.getContentPane().add(backGround);
}
@Override
public void mouseClicked(MouseEvent e) {
if(e.getSource() == submit){
if(!password.getText().equals(repassword.getText())){
showDialog(“两次输入的密码不一致”);
return;//如果两次不一致,那么下面的代码就没有必要执行了,结束整个方法。
}
if("".equals((username.getText()))||"".equals(password.getText())){
showDialog(“用户名或者密码为空”);
//return;
}
if(usernamelist.contains(username.getText())){
//调用contains方法,判断当前注册的用户名是否存在
// 如果方法的结果为true,表示已经存在,那么弹框提示
showDialog(“用户名已存在”);
// return;//如果用户名已经存在,那么就没有必要执行下面的代码了
}
//如果用户名不存在,直接添加到集合中
usernamelist.add(username.getText());
User user = new User();
user.setUsername(username.getText());
user.setPassword(password.getText());
userlist.add(user);
showDialog(“注册成功”);
//把注册页面关闭
this.setVisible(false);
new LoginJFrame(userlist, usernamelist);
}else if(e.getSource() == reset){
//把三个文本输入框清空
username.setText("");
password.setText("");
repassword.setText("");
}
}
public void showDialog(String content) {
//JDialog就是一个弹框,跟JFrame是一样的
//isVisible表示判断弹框是否展示出来,
//如果没有展示出来,我们才进行设置,并展示
if(!jDialog.isVisible()){
//设置弹框的宽和高
jDialog.setSize(100, 100);
//居中
jDialog.setLocationRelativeTo(null);
//置顶
jDialog.setAlwaysOnTop(true);
//删除弹框中所有的内容
jDialog.getContentPane().removeAll();
//创建一个JLabel去编写文本内容
JLabel jLabel = new JLabel(content);
//把文本添加到弹框当中
jDialog.add(jLabel);
//把弹框展示出来
jDialog.setVisible(true);
}
}
@Override
public void mousePressed(MouseEvent e) {
if(e.getSource() == submit){
submit.setIcon(new ImageIcon(“C:\Users\全息\Desktop\图片&代码\2048登录注册\确定按下.png”));
}else if(e.getSource() == reset){
reset.setIcon(new ImageIcon(“C:\Users\全息\Desktop\图片&代码\2048登录注册\重置按下.png”));
}
}
@Override
public void mouseReleased(MouseEvent e) {
if(e.getSource() == submit){
submit.setIcon(new ImageIcon(“C:\Users\全息\Desktop\图片&代码\2048登录注册\确定.png”));
}else if(e.getSource() == reset){
reset.setIcon(new ImageIcon(“C:\Users\全息\Desktop\图片&代码\2048登录注册\重置.png”));
}
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}

3.2048游戏功能
public class MainFrame extends JFrame implements KeyListener, ActionListener {

int[][] datas = new int[4][4];// 是否展示失败图片的开关 :  1不展示  2展示
int loseFlag = 1;// 得分
int score = 0;// 图片资源的标识
String theme = "A-";// 将item对象提取到成员变量的位置, 是为了便于其他方法的访问.
JMenuItem item1 = new JMenuItem("经典");
JMenuItem item2 = new JMenuItem("霓虹");
JMenuItem item3 = new JMenuItem("糖果");/*** 构造方法*/
public MainFrame() {// 初始化窗体initFrame();// 初始化菜单initMenu();// 初始化数据initData();// 绘制界面paintView();// 为窗体添加键盘监听this.addKeyListener(this);// 设置窗体可见setVisible(true);
}/*** 此方法用于初始化菜单(换肤,关于我们)*/
public void initMenu() {// 1. 创建JMenuBar (木棍)JMenuBar menuBar = new JMenuBar();// 2. 创建栏目对象 JMenu (换肤, 关于我们)JMenu menu1 = new JMenu("换肤");JMenu menu2 = new JMenu("关于我们");menuBar.add(menu1);menuBar.add(menu2);menu1.add(item1);menu1.add(item2);menu1.add(item2);menu1.add(item3);item1.addActionListener(this);item2.addActionListener(this);item3.addActionListener(this);// 4. 给窗体对象设置菜单.setJMenuBar(menuBar);}/*** 该方法用于初始化数据 -- datas数组进行初始化*/
public void initData() {generatorNum();generatorNum();
}/*** 此方法用于初始化窗体, 所有窗体的相关设置都在这个方法中完成*/
public void initFrame() {// 设置宽和高setSize(514, 538);// 设置窗体居中setLocationRelativeTo(null);// 设置窗体置顶setAlwaysOnTop(true);// 设置关闭模式setDefaultCloseOperation(3);// 设置窗体标题setTitle("2048小游戏");// 取消默认布局setLayout(null);
}/*** 此方法用于绘制游戏界面*/
public void paintView() {// 移除掉, 界面中所有的内容getContentPane().removeAll();if (loseFlag == 2) {JLabel loseLabel = new JLabel(new ImageIcon("C:\\Users\\全息\\Desktop\\图片&代码\\image\\" + theme + "lose.png"));loseLabel.setBounds(90, 100, 334, 228);getContentPane().add(loseLabel);}for (int i = 0; i < 4; i++) {// i = 0 1 2 3for (int j = 0; j < 4; j++) {// j = 0 1 2 3JLabel image = new JLabel(new ImageIcon("C:\\Users\\全息\\Desktop\\图片&代码\\image\\" + theme + datas[i][j] + ".png"));image.setBounds(50 + 100 * j, 50 + 100 * i, 100, 100);getContentPane().add(image);}}JLabel background = new JLabel(new ImageIcon("C:\\Users\\全息\\Desktop\\图片&代码\\image\\" + theme + "Background.jpg"));background.setBounds(40, 40, 420, 420);getContentPane().add(background);JLabel scoreLabel = new JLabel("得分: " + score);scoreLabel.setBounds(50, 20, 100, 20);getContentPane().add(scoreLabel);// 刷新界面的方法getContentPane().repaint();
}/*** 此方法用于数据的左移动*/
public void moveToLeft() {for (int i = 0; i < datas.length; i++) {// 1. 后置0号元素int[] newArr = new int[4];int index = 0;for (int x = 0; x < datas[i].length; x++) {if (datas[i][x] != 0) {newArr[index] = datas[i][x];index++;}}datas[i] = newArr;// 2. 合并元素之后, 后续元素前移, 并在末尾补0.for (int x = 0; x < 3; x++) {if (datas[i][x] == datas[i][x + 1]) {datas[i][x] *= 2;// 计算得分score += datas[i][x];// 后续元素前移, 并在末尾补0.for (int j = x + 1; j < 3; j++) {datas[i][j] = datas[i][j + 1];}datas[i][3] = 0;}}}
}/*** 此方法用于整合四个移动的判定*/
public void check() {if (checkLeft() == false && checkRight() == false && checkTop() == false && checkBottom() == false) {// 失败的状态.loseFlag = 2;}
}/*** 此方法用于二维数组的数据拷贝** @param src  原数组* @param dest 目标数组*/
public void copyArray(int[][] src, int[][] dest) {for (int i = 0; i < src.length; i++) {for (int j = 0; j < src[i].length; j++) {dest[i][j] = src[i][j];}}
}/*** 此方法判断是否可以左移动*/
public boolean checkLeft() {// 1. 创建新数组, 用于备份原数组数据.int[][] newArr = new int[4][4];// 2. 将原数组数据, 拷贝到新数组中.copyArray(datas, newArr);// 3. 调用左移动方法, 对原数组数据进行左移动moveToLeft();// 4. 使用移动后的数据, 和备份的数据逐个进行比对, 并使用flag变量进行记录.// 设计思路:// true : 可以移动// false : 不可以移动.boolean flag = false;// datas : 2// newArr : 0lo:for (int i = 0; i < datas.length; i++) {for (int j = 0; j < datas[i].length; j++) {if (datas[i][j] != newArr[i][j]) {// 主要元素有一个是不相同的, 就代表数据可以变化, 数据可以移动.flag = true;break lo;}}}// 5. 确定信息后, 恢复原数组数据(再做一次拷贝)copyArray(newArr, datas);// 6. 返回结果信息.return flag;
}/*** 此方法判断是否可以右移动*/
public boolean checkRight() {int[][] newArr = new int[4][4];copyArray(datas, newArr);moveToRight();boolean flag = false;lo:for (int i = 0; i < datas.length; i++) {for (int j = 0; j < datas[i].length; j++) {if (datas[i][j] != newArr[i][j]) {flag = true;break lo;}}}copyArray(newArr, datas);return flag;
}/*** 此方法判断是否可以上移动*/
public boolean checkTop() {int[][] newArr = new int[4][4];copyArray(datas, newArr);moveToTop();boolean flag = false;lo:for (int i = 0; i < datas.length; i++) {for (int j = 0; j < datas[i].length; j++) {if (datas[i][j] != newArr[i][j]) {flag = true;break lo;}}}copyArray(newArr, datas);return flag;
}/*** 此方法判断是否可以下移动*/
public boolean checkBottom() {int[][] newArr = new int[4][4];copyArray(datas, newArr);moveToBottom();boolean flag = false;lo:for (int i = 0; i < datas.length; i++) {for (int j = 0; j < datas[i].length; j++) {if (datas[i][j] != newArr[i][j]) {flag = true;break lo;}}}copyArray(newArr, datas);return flag;
}/*** 此方法用于处理二维数组的反转*/
public void horizontalSwap() {for (int i = 0; i < datas.length; i++) {// 调用reverseArrays方法, 对每一个一维数组进行反转.reverseArray(datas[i]);}
}/*** 此方法用于处理一维数组的反转*/
public void reverseArray(int[] arr) {for (int start = 0, end = arr.length - 1; start < end; start++, end--) {int temp = arr[start];arr[start] = arr[end];arr[end] = temp;}
}/*** 此方法用于处理数据顺时针旋转*/
public void clockwise() {int[][] newArr = new int[4][4];for (int i = 0; i < 4; i++) {for (int j = 0; j < 4; j++) {newArr[j][3 - i] = datas[i][j];}}datas = newArr;
}/*** 此方法用于处理数据逆时针旋转*/
public void anticlockwise() {int[][] newArr = new int[4][4];for (int i = 0; i < 4; i++) {for (int j = 0; j < 4; j++) {newArr[3 - j][i] = datas[i][j];}}datas = newArr;
}/*** 此方法键盘被按下时, 所触发的方法, 在这个方法中区分出上下左右按键*/
@Override
public void keyPressed(KeyEvent e) {int keyCode = e.getKeyCode();if (keyCode == 37) {// 调用左移动的方法.moveToLeft();generatorNum();} else if (keyCode == 38) {// 上移动moveToTop();generatorNum();} else if (keyCode == 39) {// 调用右移动的方法moveToRight();generatorNum();} else if (keyCode == 40) {// 调用下移动的方法moveToBottom();generatorNum();}// 每一次移动的逻辑执行完, 都要去调用check方法, 检查游戏是否是失败的状态.check();// 每一次移动完成, 重新绘制界面paintView();
}/*** 此方法用于处理数据下移动*/
public void moveToBottom() {// 1. 调用顺时针的方法clockwise();// 2. 左移moveToLeft();// 3. 调用逆时针的方法anticlockwise();
}/*** 此方法用于处理数据上移动*/
public void moveToTop() {// 1. 调用逆时针旋转的方法anticlockwise();// 2. 左移动moveToLeft();// 3. 调用顺时针旋转的方法clockwise();
}/*** 此方法用于处理右移动*/
public void moveToRight() {// 1. 反转数组horizontalSwap();// 2. 左移动moveToLeft();// 3. 反转数组horizontalSwap();}/*** 此方法在键盘被松开时候, 所触发的方法*/
@Override
public void keyReleased(KeyEvent e) {}/*** 此方法无法监听到上下左右按键, 无需关注*/
@Override
public void keyTyped(KeyEvent e) {}/*** 此方法用于从空白的位置,  随机产生2号数字块.*/
public void generatorNum() {// 1. 创建两个数组, 准备记录二维数组中空白格子 i 和 j 的索引位置.int[] arrayI = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1};int[] arrayJ = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1};int w = 0;// 2. 遍历二维数组, 取出每一个元素, 并判断当前元素是否是空白格式 (判断是否是0)for (int i = 0; i < datas.length; i++) {for (int j = 0; j < datas[i].length; j++) {if (datas[i][j] == 0) {// 3. 是0的话, 将索引存入arrayI和arrayJ数组中.arrayI[w] = i;arrayJ[w] = j;w++;}}}// 4. 如果w变量记录的不是0, 代表数组中还有空白的位置, 就可以产生新的数字方块.if (w != 0) {Random r = new Random();int index = r.nextInt(w);int x = arrayI[index];int y = arrayJ[index];datas[x][y] = 2;}}@Override
public void actionPerformed(ActionEvent e) {if (e.getSource() == item1) {theme = "A-";} else if (e.getSource() == item2) {theme = "B-";} else if (e.getSource() == item3) {theme = "C-";}// 重新绘制界面paintView();
}

4.封装User实体类对象

public class User {
private String username;
private String password;

public User() {
}public User(String username, String password) {this.username = username;this.password = password;
}public String getUsername() {return username;
}public void setUsername(String username) {this.username = username;
}public String getPassword() {return password;
}public void setPassword(String password) {this.password = password;
}@Override
public boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;User user = (User) o;return Objects.equals(username, user.username) && Objects.equals(password, user.password);
}

5.主方法调用
public class App {
public static void main(String[] args) {
ArrayList userlist = new ArrayList();
userlist.add(new User(“zhangsan”,“123456”));
ArrayList usernamelist = new ArrayList();
LoginJFrame jFrame = new LoginJFrame(userlist,usernamelist);
}
}

6.所需图片
//记得改下图片路径
在这里插入图片描述













gui实现2048小游戏相关推荐

  1. 全志V853开发板移植基于 LVGL 的 2048 小游戏

    LVGL 开发实战 移植基于 LVGL 的 2048 小游戏 这一节将以一个已经编写好的 lvgl 小游戏 2048 描述如何将已经编写完成的 lvgl 程序移植到开发板上. 这里使用的 2048 小 ...

  2. CSDN官方2048小游戏通关秘诀及复现

    目录 一.前言 二.通关小诀窍 1.游戏规则介绍 2.基于规则的一种相对全局最优方法 三.游戏复现 1.编程环境介绍 2.tkinter介绍 3.编程复现游戏效果 四.尾声及附录代码 1.尾声 2.附 ...

  3. python游戏代码五子棋_用20行Python代码实现2048小游戏,你会吗?

    前些天在b站上看到有个大佬用c写了一个2048小游戏,我便一下来了兴趣.心想着,我貌似也能用Python来整一波,话不多说,直接开搞. 2048的游戏规则: 2048游戏总共有16个格子,初始时会有两 ...

  4. python秒表游戏代码_用20行Python代码实现2048小游戏,你会吗?

    前些天在b站上看到有个大佬用c写了一个2048小游戏,我便一下来了兴趣.心想着,我貌似也能用Python来整一波,话不多说,直接开搞. 2048的游戏规则: 2048游戏总共有16个格子,初始时会有两 ...

  5. 我的名片能运行Linux和Python,还能玩2048小游戏,成本只要20元

    晓查 发自 凹非寺  量子位 报道 | 公众号 QbitAI 猜猜它是什么?印着姓名.职位和邮箱,看起来是个名片.可是右下角有芯片,看起来又像是个PCB电路板. 其实它是一台超迷你的ARM计算机,不仅 ...

  6. python里graphics的使用_使用graphics.py实现2048小游戏

    1.过年的时候在手机上下载了2048玩了几天,心血来潮决定用py写一个,刚开始的时候想用QT实现,发现依赖有点大.正好看到graphics.py是基于tkinter做的封装就拿来练手,并借用了CSDN ...

  7. html css js实现快递单打印_JS与HTML、CSS实现2048小游戏(六)

    在前面的五篇文章中,小编带大家完成了网页版2048小游戏的基本游戏逻辑.但是在游戏结束的gameover()方法中咱们只是简单的通过alert来弹出一些信息,这样的话只能出现下图的效果.这样的游戏,不 ...

  8. C语言编写2048小游戏

    该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/104992424 2 ...

  9. 使用JS实现2048小游戏

    JS实现2048小游戏源码 效果图: 代码如下,复制即可使用: (适用浏览器:360.FireFox.Chrome.Opera.傲游.搜狗.世界之窗. 不支持Safari.IE8及以下浏览器.) &l ...

最新文章

  1. [k8s] 重新加入master节点
  2. 朴素贝叶斯 python 实现
  3. volatile不具备原子性
  4. git 中文乱码配置
  5. python萤火虫算法_FA:萤火虫算法的测试及Python实现
  6. linux动态可执行文件,Linux中ELF格式 可执行文件+动态链接器 的加载
  7. 事业单位考试高频考点一:马克思主义基本原理
  8. 成功解决python.exe无法找到程序入口 无法定位程序输入点
  9. java 保龄球游戏开发_2019-11-08-基于TDD实现的java版本的保龄球规则(实体类)
  10. Android 基于Message的进程间通信 Messenger完全解析
  11. 幻数浅析(Magic Number)
  12. Python 中当前时间表示方法详解
  13. 数据结构——AOV图与算法——拓扑排序
  14. 服务器蓝屏显示7f,困扰多日的7F蓝屏
  15. JDK1.8 信号量(Semaphore)的基本使用
  16. Artstudio Pro Mac 3.2.7
  17. 火车时刻表WebApp
  18. 杭电acm 2021
  19. Linux C编程my_ls 的实现
  20. 没什么明显变化【28周】

热门文章

  1. 中国武术职业联赛(WMA)
  2. 条形码、二维码扫一扫和生成二维码采用ZXing3.0开源库在android studio中实现
  3. 使用aria2为网盘下载加速
  4. MySQL表sql语句增删查改_学会这些操作你就不会栓Q(狗头)
  5. 亚马逊如何创业?身为小白的我适合创业亚马逊吗
  6. nanjustar 楠橘星后台管理系统(简洁版)使用导航
  7. mac 安装brew
  8. js中的设计模式之中介者模式
  9. Scrum立会报告+燃尽图(Beta阶段第二周第五次)
  10. MacBook Pro设置外接显示器竖屏显示,2k 字体小