【经典项目】Java入门,实现斗地主小游戏

一、需求分析

实现斗地主游戏可以涉及以下几个关键步骤和思路:

  1. 游戏规则定义:首先,你需要明确斗地主游戏的规则,包括牌的花色和大小、玩家数量、发牌顺序、出牌规则、胜利条件等。

  2. 牌的表示和初始化:定义一套扑克牌的数据结构,可以使用数字或字符表示每张牌,例如使用数字1-54或字符2-3A等。然后,初始化一副完整的牌,并进行洗牌操作。

  3. 发牌和牌局管理:根据游戏规则,按照特定的发牌顺序将牌分发给玩家,可以使用列表或数组来保存每个玩家手中的牌。同时,需要维护当前牌局的状态,例如当前轮到哪个玩家出牌、当前出牌的牌型和大小等。

  4. 出牌逻辑和判断:实现出牌阶段的逻辑,根据规则判断玩家出的牌是否合法,并进行相应的处理。需要考虑牌型的判断(如单牌、对子、顺子、炸弹等)和大小比较,以及特殊牌型的处理(如王炸)。

  5. AI策略和智能出牌:如果要实现AI玩家,你可以设计一套策略来指导AI玩家在出牌时的决策。这可能涉及牌型的分析、记忆其他玩家出的牌、考虑当前胜利条件、权衡出牌的风险等。

  6. 回合轮换和胜利条件判断:在游戏中,玩家的出牌轮换,直到其中一位玩家出完所有手牌或达到游戏规定的胜利条件。需要在每轮出牌后更新当前出牌玩家,并判断是否满足胜利条件。

  7. 用户界面和交互:可以通过命令行界面、图形界面或网络界面等方式,提供用户与游戏进行交互的界面。用户可以进行出牌、pass、查看牌等操作。

  8. 异常处理和错误检测:要考虑用户输入的合法性检查和异常处理,以避免程序崩溃或发生错误。

以上是一个基本的斗地主游戏实现的思路,具体的实现细节会有所不同,可以根据自己的编程语言和技术选择进行具体的开发。

二、主要实现思路

【文字思路】:

  1. 先创建HashMap,键是编号,值是牌
  2. 创建ArrayList,存储编号
  3. 创建花色数组和点数数组
  4. 从0开始往HashMap里面存储编号,并存储对应的牌,同时往ArrayList里面存储编号
  5. 洗牌(洗的是编号),用Collections的shuffle()方法实现
  6. 发牌(洗的是编号),用Collections的shuffle()方法实现
  7. 发牌(发的也是编号,为了保证编号是排序的,创建TreeSet集合接收)
  8. 定义方法看牌(遍历TreeSet集合,获取编号,到HashMap集合找对应的牌)
  9. 最后调用看牌方法。

【图片思路】

【发牌结果】

【主要代码】

public class PlayerOperation extends Thread {//游戏主界面GameJFrame gameJFrame;//是否能够出牌boolean isRun = true;//倒计时int i;public PlayerOperation(GameJFrame m, int i) {this.gameJFrame = m;this.i = i;}@Overridepublic void run() {while (i > -1 && isRun) {gameJFrame.time[1].setText("倒计时:" + i--);sleep(1);}if (i == -1) {gameJFrame.time[1].setText("不抢");}gameJFrame.landlord[0].setVisible(false);gameJFrame.landlord[1].setVisible(false);for (Poker poker2 : gameJFrame.playerList.get(1)) {poker2.setCanClick(true);// 可被点击}if (gameJFrame.time[1].getText().equals("抢地主")) {gameJFrame.playerList.get(1).addAll(gameJFrame.lordList);openlord(true);sleep(2);Common.order(gameJFrame.playerList.get(1));Common.rePosition(gameJFrame, gameJFrame.playerList.get(1), 1);gameJFrame.publishCard[1].setEnabled(false);setlord(1);} else {if (Common.getScore(gameJFrame.playerList.get(0)) < Common.getScore(gameJFrame.playerList.get(2))) {gameJFrame.time[2].setText("抢地主");gameJFrame.time[2].setVisible(true);setlord(2);openlord(true);sleep(3);gameJFrame.playerList.get(2).addAll(gameJFrame.lordList);Common.order(gameJFrame.playerList.get(2));Common.rePosition(gameJFrame, gameJFrame.playerList.get(2), 2);openlord(false);} else {gameJFrame.time[0].setText("抢地主");gameJFrame.time[0].setVisible(true);setlord(0);openlord(true);sleep(3);gameJFrame.playerList.get(0).addAll(gameJFrame.lordList);Common.order(gameJFrame.playerList.get(0));Common.rePosition(gameJFrame, gameJFrame.playerList.get(0), 0);openlord(false);}}gameJFrame.landlord[0].setVisible(false);gameJFrame.landlord[1].setVisible(false);turnOn(false);for (int i = 0; i < 3; i++) {gameJFrame.time[i].setText("不要");gameJFrame.time[i].setVisible(false);}gameJFrame.turn = gameJFrame.dizhuFlag;while (true) {if (gameJFrame.turn == 1) {if (gameJFrame.time[0].getText().equals("不要") && gameJFrame.time[2].getText().equals("不要"))gameJFrame.publishCard[1].setEnabled(false);else {gameJFrame.publishCard[1].setEnabled(true);}turnOn(true);timeWait(30, 1);turnOn(false);gameJFrame.turn = (gameJFrame.turn + 1) % 3;if (win())break;}if (gameJFrame.turn == 0) {computer0();gameJFrame.turn = (gameJFrame.turn + 1) % 3;if (win())break;}if (gameJFrame.turn == 2) {computer2();gameJFrame.turn = (gameJFrame.turn + 1) % 3;if (win())break;}}}//定义一个方法用来暂停N秒//参数为等待的时间//因为线程中的sleep方法有异常,直接调用影响阅读public void sleep(int i) {try {Thread.sleep(i * 1000);} catch (InterruptedException e) {e.printStackTrace();}}public void openlord(boolean is) {for (int i = 0; i < 3; i++) {if (is)gameJFrame.lordList.get(i).turnFront();else {gameJFrame.lordList.get(i).turnRear();}gameJFrame.lordList.get(i).setCanClick(true);}}public void setlord(int i) {Point point = new Point();if (i == 1) {point.x = 80;point.y = 430;gameJFrame.dizhuFlag = 1;}if (i == 0) {point.x = 80;point.y = 20;gameJFrame.dizhuFlag = 0;}if (i == 2) {point.x = 700;point.y = 20;gameJFrame.dizhuFlag = 2;}gameJFrame.dizhu.setLocation(point);gameJFrame.dizhu.setVisible(true);}public void turnOn(boolean flag) {gameJFrame.publishCard[0].setVisible(flag);gameJFrame.publishCard[1].setVisible(flag);}public void computer0() {timeWait(1, 0);ShowCard(0);}public void computer2() {timeWait(1, 2);ShowCard(2);}public void ShowCard(int role) {int orders[] = new int[]{4, 3, 2, 1, 5};Model model = Common.getModel(gameJFrame.playerList.get(role), orders);ArrayList<String> list = new ArrayList<>();if (gameJFrame.time[(role + 1) % 3].getText().equals("不要") && gameJFrame.time[(role + 2) % 3].getText().equals("不要")) {if (model.a123.size() > 0) {list.add(model.a123.get(model.a123.size() - 1));} else if (model.a3.size() > 0) {if (model.a1.size() > 0) {list.add(model.a1.get(model.a1.size() - 1));} else if (model.a2.size() > 0) {list.add(model.a2.get(model.a2.size() - 1));}list.add(model.a3.get(model.a3.size() - 1));} else if (model.a112233.size() > 0) {list.add(model.a112233.get(model.a112233.size() - 1));} else if (model.a111222.size() > 0) {String name[] = model.a111222.get(0).split(",");if (name.length / 3 <= model.a1.size()) {list.add(model.a111222.get(model.a111222.size() - 1));for (int i = 0; i < name.length / 3; i++)list.add(model.a1.get(i));} else if (name.length / 3 <= model.a2.size()) {list.add(model.a111222.get(model.a111222.size() - 1));for (int i = 0; i < name.length / 3; i++)list.add(model.a2.get(i));}} else if (model.a2.size() > (model.a111222.size() * 2 + model.a3.size())) {list.add(model.a2.get(model.a2.size() - 1));} else if (model.a1.size() > (model.a111222.size() * 2 + model.a3.size())) {list.add(model.a1.get(model.a1.size() - 1));} else if (model.a4.size() > 0) {int sizea1 = model.a1.size();int sizea2 = model.a2.size();if (sizea1 >= 2) {list.add(model.a1.get(sizea1 - 1));list.add(model.a1.get(sizea1 - 2));list.add(model.a4.get(0));} else if (sizea2 >= 2) {list.add(model.a2.get(sizea1 - 1));list.add(model.a2.get(sizea1 - 2));list.add(model.a4.get(0));} else {list.add(model.a4.get(0));}}} else {if (role != gameJFrame.dizhuFlag) {int f = 0;if (gameJFrame.time[gameJFrame.dizhuFlag].getText().equals("不要")) {f = 1;}if ((role + 1) % 3 == gameJFrame.dizhuFlag) {if ((Common.jugdeType(gameJFrame.currentList.get((role + 2) % 3)) != PokerType.c1|| Common.jugdeType(gameJFrame.currentList.get((role + 2) % 3)) != PokerType.c2)&& gameJFrame.currentList.get(gameJFrame.dizhuFlag).size() < 1)f = 1;if (gameJFrame.currentList.get((role + 2) % 3).size() > 0&& Common.getValue(gameJFrame.currentList.get((role + 2) % 3).get(0)) > 13)f = 1;}if (f == 1) {gameJFrame.time[role].setVisible(true);gameJFrame.time[role].setText("不要");return;}}int can = 0;if (role == gameJFrame.dizhuFlag) {if (gameJFrame.playerList.get((role + 1) % 3).size() <= 5 || gameJFrame.playerList.get((role + 2) % 3).size() <= 5)can = 1;} else {if (gameJFrame.playerList.get(gameJFrame.dizhuFlag).size() <= 5)can = 1;}ArrayList<Poker> player;if (gameJFrame.time[(role + 2) % 3].getText().equals("不要"))player = gameJFrame.currentList.get((role + 1) % 3);elseplayer = gameJFrame.currentList.get((role + 2) % 3);PokerType cType = Common.jugdeType(player);if (cType == PokerType.c1) {if (can == 1)model = Common.getModel(gameJFrame.playerList.get(role), new int[]{1, 4, 3, 2, 5});AI_1(model.a1, player, list, role);} else if (cType == PokerType.c2) {if (can == 1)model = Common.getModel(gameJFrame.playerList.get(role), new int[]{2, 4, 3, 5, 1});AI_1(model.a2, player, list, role);} else if (cType == PokerType.c3) {AI_1(model.a3, player, list, role);} else if (cType == PokerType.c4) {AI_1(model.a4, player, list, role);} else if (cType == PokerType.c31) {if (can == 1)model = Common.getModel(gameJFrame.playerList.get(role), new int[]{3, 1, 4, 2, 5});AI_2(model.a3, model.a1, player, list, role);} else if (cType == PokerType.c32) {if (can == 1)model = Common.getModel(gameJFrame.playerList.get(role), new int[]{3, 2, 4, 5, 1});AI_2(model.a3, model.a2, player, list, role);} else if (cType == PokerType.c411) {AI_5(model.a4, model.a1, player, list, role);} else if (cType == PokerType.c422) {AI_5(model.a4, model.a2, player, list, role);} else if (cType == PokerType.c123) {if (can == 1)model = Common.getModel(gameJFrame.playerList.get(role), new int[]{5, 3, 2, 4, 1});AI_3(model.a123, player, list, role);} else if (cType == PokerType.c112233) {if (can == 1)model = Common.getModel(gameJFrame.playerList.get(role), new int[]{2, 4, 3, 5, 1});AI_3(model.a112233, player, list, role);} else if (cType == PokerType.c11122234) {AI_4(model.a111222, model.a1, player, list, role);} else if (cType == PokerType.c1112223344) {AI_4(model.a111222, model.a2, player, list, role);}if (list.size() == 0 && can == 1) {int len4 = model.a4.size();if (len4 > 0)list.add(model.a4.get(len4 - 1));}}gameJFrame.currentList.get(role).clear();if (list.size() > 0) {Point point = new Point();if (role == 0)point.x = 200;if (role == 2)point.x = 550;if (role == 1) {point.x = (770 / 2) - (gameJFrame.currentList.get(1).size() + 1) * 15 / 2;point.y = 300;}point.y = (400 / 2) - (list.size() + 1) * 15 / 2;ArrayList<Poker> temp = new ArrayList<>();for (int i = 0, len = list.size(); i < len; i++) {List<Poker> pokers = getCardByName(gameJFrame.playerList.get(role), list.get(i));for (Poker poker : pokers) {temp.add(poker);}}temp = Common.getOrder2(temp);for (Poker poker : temp) {Common.move(poker, poker.getLocation(), point);point.y += 15;gameJFrame.container.setComponentZOrder(poker, 0);gameJFrame.currentList.get(role).add(poker);gameJFrame.playerList.get(role).remove(poker);}Common.rePosition(gameJFrame, gameJFrame.playerList.get(role), role);} else {gameJFrame.time[role].setVisible(true);gameJFrame.time[role].setText("不要");}for (Poker poker : gameJFrame.currentList.get(role))poker.turnFront();}public List getCardByName(List<Poker> list, String n) {String[] name = n.split(",");ArrayList cardsList = new ArrayList();int j = 0;for (int i = 0, len = list.size(); i < len; i++) {if (j < name.length && list.get(i).getName().equals(name[j])) {cardsList.add(list.get(i));i = 0;j++;}}return cardsList;}public void AI_3(List<String> model, List<Poker> player, List<String> list, int role) {for (int i = 0, len = model.size(); i < len; i++) {String[] s = model.get(i).split(",");if (s.length == player.size() && getValueInt(model.get(i)) > Common.getValue(player.get(0))) {list.add(model.get(i));return;}}}public void AI_4(List<String> model1, List<String> model2, List<Poker> player, List<String> list, int role) {player = Common.getOrder2(player);int len1 = model1.size();int len2 = model2.size();if (len1 < 1 || len2 < 1)return;for (int i = 0; i < len1; i++) {String[] s = model1.get(i).split(",");String[] s2 = model2.get(0).split(",");if ((s.length / 3 <= len2) && (s.length * (3 + s2.length) == player.size())&& getValueInt(model1.get(i)) > Common.getValue(player.get(0))) {list.add(model1.get(i));for (int j = 1; j <= s.length / 3; j++)list.add(model2.get(len2 - j));}}}public void AI_5(List<String> model1, List<String> model2, List<Poker> player, List<String> list, int role) {player = Common.getOrder2(player);int len1 = model1.size();int len2 = model2.size();if (len1 < 1 || len2 < 2)return;for (int i = 0; i < len1; i++) {if (getValueInt(model1.get(i)) > Common.getValue(player.get(0))) {list.add(model1.get(i));for (int j = 1; j <= 2; j++)list.add(model2.get(len2 - j));}}}public void AI_1(List<String> model, List<Poker> player, List<String> list, int role) {for (int len = model.size(), i = len - 1; i >= 0; i--) {if (getValueInt(model.get(i)) > Common.getValue(player.get(0))) {list.add(model.get(i));break;}}}public void AI_2(List<String> model1, List<String> model2, List<Poker> player, List<String> list, int role) {player = Common.getOrder2(player);int len1 = model1.size();int len2 = model2.size();if (len1 > 0 && model1.get(0).length() < 10) {list.add(model1.get(0));System.out.println("王炸");return;}if (len1 < 1 || len2 < 1)return;for (int len = len1, i = len - 1; i >= 0; i--) {if (getValueInt(model1.get(i)) > Common.getValue(player.get(0))) {list.add(model1.get(i));break;}}list.add(model2.get(len2 - 1));if (list.size() < 2)list.clear();}public void timeWait(int n, int player) {if (gameJFrame.currentList.get(player).size() > 0)Common.hideCards(gameJFrame.currentList.get(player));if (player == 1) {int i = n;while (gameJFrame.nextPlayer == false && i >= 0) {gameJFrame.time[player].setText("倒计时:" + i);gameJFrame.time[player].setVisible(true);sleep(1);i--;}if (i == -1 && player == 1) {ShowCard(1);}gameJFrame.nextPlayer = false;} else {for (int i = n; i >= 0; i--) {sleep(1);gameJFrame.time[player].setText("倒计时:" + i);gameJFrame.time[player].setVisible(true);}}gameJFrame.time[player].setVisible(false);}public int getValueInt(String n) {String name[] = n.split(",");String s = name[0];int i = Integer.parseInt(s.substring(2, s.length()));if (s.substring(0, 1).equals("5"))i += 3;if (s.substring(2, s.length()).equals("1") || s.substring(2, s.length()).equals("2"))i += 13;return i;}public boolean win() {for (int i = 0; i < 3; i++) {if (gameJFrame.playerList.get(i).size() == 0) {String s;if (i == 1) {s = "恭喜你,胜利了!";} else {s = "恭喜电脑" + i + ",赢了! 你的智商有待提高哦";}for (int j = 0; j < gameJFrame.playerList.get((i + 1) % 3).size(); j++)gameJFrame.playerList.get((i + 1) % 3).get(j).turnFront();for (int j = 0; j < gameJFrame.playerList.get((i + 2) % 3).size(); j++)gameJFrame.playerList.get((i + 2) % 3).get(j).turnFront();JOptionPane.showMessageDialog(gameJFrame, s);return true;}}return false;}
}

三、效果展示

1、游戏界面

2、地主牌

3、出牌

 四、完整代码获取

经典项目Java入门,实现斗地主小游戏资源-CSDN文库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/656321.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第六讲_JavaScript原型

JavaScript原型 1. 原型的概念2. 原型继承2.1 原型链 3. class类的原型对象 1. 原型的概念 原型是 JavaScript 对象相互继承特性的机制。 每个函数都有一个 prototype 属性&#xff0c;这个属性指向一个对象&#xff0c;这个对象称为原型对象。每个对象都有一个 [[Prototype]…

网络原理-TCP/IP(1)

应用层 我们之前编写完了基本的java socket, 要知道,我们之前所写的所有代码都在应用层中,都是为了完成某项业务,如翻译等.关于应用层,后面会有专门的讲解,在此处先讲一下基础知识. 应用层对应着应用程序,是程序员打交道最多的一层,调用系统提供的网络api写出的代码都是应用层…

纯html+js+css个人博客

首页 <!DOCTYPE HTML> <html> <head> <title>博客</title> <meta http-equiv"Content-Type" content"text/html; charsetutf-8" /> <meta name"viewport" content"widthdevice-width, initial-sca…

TOP100 矩阵

1.73. 矩阵置零 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 提示&#xff1a; m matrix.lengthn matrix[0].length1 < m, n < 200-2^31 < matrix[i][j] < 2^31 - 1 思路&#xf…

SeaTunnel Web安装 一把成

安装相关jar包&#xff0c;以及SeaTunnel 和Web 打成的包&#xff0c;可以直接使用&#xff0c;但是需要安装MySQL客户端的分享&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1qrt1RAX38SgIpNklbQJ7pA 提取码&#xff1a;0kmf 1. 环境准备 环境名称版本系统环境C…

使用EasyPOI模板导出Execl表格(含有图片)

这是生成的文件效果 一、导入依赖 <!--easypoi--><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>4.2.0</version></dependency><dependency><groupId>cn.aft…

零、环境搭建

之前一直玩python的&#xff0c;由于工作需要C版的opencv&#xff0c;故借此寒假闲暇时间&#xff0c;进行简单了解学习。 主要用到的IDE是Visual Studio和OpenCV 一、Visual Studio下载安装 我这里没找到之前的2017版本&#xff0c;就拿目前最新的2023社区版下载&#xff1a…

30款跨平台开发方案,总有个一个适合你!

1、Qt FluentUI CEF 可以覆盖所有需求 2、.NET Avalonia(SukiUI) CEF 可以覆盖所有需求 3、.NET DevExpress跨平台产品 CEF 可以覆盖所有需求 4、JavaFx(Swing) flatlaf WebView 可以覆盖所有需求 5、Java Qt &#xff08;qtjambi&#xff09; CEF 可以覆盖所有需…

C++对象模型和this指针,const修饰成员函数详解

目录 1.成员变量和成员函数分开存储 2.this指针 1.this指针概念 ​编辑 2.this指针用途 3.空指针访问成员函数 ​编辑 4.const修饰成员函数 mutable声明 1.成员变量和成员函数分开存储 空对象占用内存空间为1字节&#xff0c;这样是为了区分不同的空对象占内存的位置 …

【学习笔记】Vue3源码解析:第一部分-实现vue3环境搭建

课程地址&#xff1a;【已完结】全网最详细Vue3源码解析&#xff01;&#xff08;一行行带你手写Vue3源码&#xff09; 第一部分&#xff1a;实现vue3环境搭建&#xff08;对应课程的第1-3节&#xff09; VUE2与VUE3的对比&#xff1a; 也即vue2的痛点&#xff1a; 对TypeSc…

微信小程序遮罩层滚动穿透的问题

常见的布局 外层一个遮罩层 里面一层是弹窗以及内容 这里还是个textarea 滚动到底的时候 底部的遮罩层也跟着滚动了 发生滚动穿透 处理方法是添加 <page-meta page-style"{{ showPolish ? overflow: hidden; : }}" /> page-meta必须在第一个节点

sv program module

为了避免races&#xff0c;在验证中引入program&#xff1b; Similarities between program and module block A program block can instantiate another program block in the way how the module is instantiated another module block.Both can have no or more inputs, …

【竞技宝jjb.lol】LOL:经典大龙毁一生 WE鏖战三局力克FPX

北京时间2024年1月30日&#xff0c;英雄联盟LPL2024春季赛在昨天迎来第二周首个比赛日&#xff0c;本日首场比赛由WE对阵FPX。本场比赛双方前两局战至1-1平&#xff0c;决胜局FPX一度建立不小的经济优势&#xff0c;然而太过冒险的打大龙决策最终让其功亏一篑&#xff0c;WE鏖战…

快速入门存内计算—助力人工智能加速深度学习模型的训练和推理

存内计算&#xff1a;提高计算性能和能效的新技术 传统的计算机架构是将数据存储在存储器中&#xff0c;然后将数据传输到计算单元进行处理。这种架构存在一个性能瓶颈&#xff0c;即数据传输延迟。存内计算通过将计算单元集成到存储器中&#xff0c;消除了数据传输延迟&#…

element -table,多行或列合并

需求:后端返回的表格数据,如果某列值一样,前端表格样式需要合并他们,需要合并的列的行数未知(所以需要有数据后遍历后端数据对需要合并的属性进行计数)即动态遍历表格合并 效果 - 重点方法;table自带的:span-method="objectSpanMethod"方法 代码环境:vue2 ,…

顺序表的奥秘:高效数据存储与检索

&#x1f37f;顺序表 &#x1f9c0;1、顺序表的实现&#x1f365;1.1 创建顺序表类&#x1f365;1.2 插入操作&#x1f365;1.3 查找操作&#x1f365;1.4 删除操作&#x1f365;1.5 清空操作 &#x1f9c0;2、ArrayList的说明&#x1f9c0;3、ArrayList使用&#x1f365;3.1 A…

app广告变现|如何提升app广告点击率?

提升app内的广告点击率&#xff08;CTR&#xff09;可以增加广告收入&#xff0c;而对广告主来说&#xff0c;广告点击率下降会直接影响广告主的投资回报率&#xff0c;因此&#xff0c;如何提升广告点击率&#xff0c;对app运营来说是一项重要的工作。 AdSet官网 | 聚合SDK广…

分类预测 | Matlab实现SCN-Adaboost随机配置网络模型SCN的Adaboost数据分类预测/故障识别

分类预测 | Matlab实现SCN-Adaboost随机配置网络模型SCN的Adaboost数据分类预测/故障识别 目录 分类预测 | Matlab实现SCN-Adaboost随机配置网络模型SCN的Adaboost数据分类预测/故障识别分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现SCN-Adaboost随机配置网…

C++ ffmpeg RTSP 视频推流实现, arm linux平台

环境&#xff1a; FFmpeg版本&#xff1a;n4.2.2 下载地址&#xff08;下载编译后请确认版本正确&#xff09;&#xff1a; https://ffmpeg.org//download.html 下面地址经过第三方git加速可能存在实效性&#xff1a; https://hub.fgit.cf/FFmpeg/FFmpeg/tree/n4.4.2实现代码…

【HarmonyOS应用开发】UIAbility实践第一部分(五)

一、UIAbility概述 1、UIAbility是一种包含用户界面的应用组件&#xff0c;主要用于和用户进行交互。UIAbility也是系统调度的单元&#xff0c;为应用提供窗口在其中绘制界面。 2、每一个UIAbility实例&#xff0c;都对应于一个最近任务列表中的任务。 3、一个应用可以有一个UI…