我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何用Silverlight开发贪吃蛇游戏

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何用Silverlight开发贪吃蛇游戏

今天就跟大家聊聊有关如何用Silverlight开发贪吃蛇游戏,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

介绍

使用 Silverlight 3.0(c#) 开发一个贪吃蛇游戏

玩法

W/S/A/D 或 ↑/↓/←/→ 控制蛇的移动

截图

如何用Silverlight开发贪吃蛇游戏

思路

贪吃蛇的每一段为 16×16 像素,场景为 640×480 像素,也就说网格为 40×30 个,每个网格的边长为 16

食物的出现位置以及贪吃蛇的运动方向的改变都要在相关的网格内进行

贪吃蛇的运动用即时运算的方法计算,当贪吃蛇运动到网格内(蛇某一段的像素位置%网格的边长<蛇在某时间单位下的移动偏移量)时做如下工作:修正蛇的位置使其正好在网格内,更新蛇的每一段的运动方向,判断是否吃到了食物、是否发生了碰撞等

贪吃蛇的每一段的运动方向的修改:蛇头的运动方向根据用户的操作改变,蛇的每一段的运动方向设置为此段的前一段的运动方向(计算时要从尾部向头部逐段计算)(注:运动方向的改变要在蛇移动到网格内时进行。其中如果蛇的某一段移动到了网格内,则表明其它各段都在网格内)

下面我们看看他的关键代码都有哪些。

关键代码

using System;  using System.Collections.Generic;  using System.Linq;  using System.Net;  using System.Windows;  using System.Windows.Controls;  using System.Windows.Documents;  using System.Windows.Input;  using System.Windows.Media;  using System.Windows.Media.Animation;  using System.Windows.Shapes;  using System.Windows.Media.Imaging;  using System.Threading;  namespace YYSnake.Core  {      public partial class Main : UserControl      {          private int _columns; // 网格列数          private int _rows; // 网格行数          private Dictionary<Body, CellPoint> _bodies = new Dictionary<Body, CellPoint>(); // 贪吃蛇每一段的集合          private Dictionary<Bean, CellPoint> _beans = new Dictionary<Bean, CellPoint>(); // 豆的集合          private Dictionary<Skin, CellPoint> _skins = new Dictionary<Skin, CellPoint>(); // 蜕下来的皮的集合          private List<CellPoint> _emptyCells = new List<CellPoint>(); // 空网格的集合          private bool _enabled = false; // 游戏是否运行          private double _dt = 0.01; // 多少毫秒计算一次          private int _decimals = 1; // 计算小数时所保留的小数位          private double _speed = 80; // 蛇的运行速度          private Direction _moveDirection = Direction.Up; // 蛇的运行方向          private int _selfLength = 5; // 蛇的最小长度          private int _beansCount = 5; // 豆的***出现数量          private int _ateCapacity = 10; // 食量(超过则蜕皮)          private bool _needRaiseAteEvent = false; // 在“蛇头所处位置进入了网格点区域内”时是否需要触发吃豆事件          private int _needBeansCount = 0; // 还需要增加的豆的数量          Random _random = new Random();          public Main()          {              InitializeComponent();              this.Loaded += new RoutedEventHandler(Main_Loaded);          }          void Main_Loaded(object sender, RoutedEventArgs e)          {              this.Width = App.Width; // 640              this.Height = App.Height; // 480               _columns = (int)(Width / App.CellSize); // 40              _rows = (int)(Height / App.CellSize); // 30               // 防止动画飞出去              RectangleGeometry rg = new RectangleGeometry();              rg.Rect = new Rect(0, 0, App.Width, App.Height);              LayoutRoot.Clip = rg;              bg.Width = App.Width;              bg.Height = App.Height;              ripple.RippleBackground = bg;              CompositionTarget.Rendering += new EventHandler(CompositionTarget_Rendering);          }          /// <summary>          /// 初始化          /// </summary>          public void Init()          {              _enabled = false;              canvasBean.Children.Clear();              canvasSnake.Children.Clear();              canvasSkin.Children.Clear();              _beans.Clear();              _bodies.Clear();              _skins.Clear();              _emptyCells.Clear();              for (int i = 0; i < _columns; i++)              {                  for (int j = 0; j < _rows; j++)                  {                      _emptyCells.Add(new CellPoint(i, j));                  }              }              _moveDirection = Direction.Up;               InitSnake();          }           /// <summary>          /// 蛇的初始化          /// </summary>          private void InitSnake()          {              InitHead();               for (int i = 0; i < _selfLength - 1; i++)                  AddTail();               for (int i = 0; i < _beansCount; i++)                  AddBean();          }          /// <summary>          /// 蛇头的初始化          /// </summary>          private void InitHead()          {              Body head = new Body(BodyType.Head);              head.MoveDirection = _moveDirection;              CellPoint point = new CellPoint((int)(_columns / 2), (int)(_rows / 2));              head.SetValue(Canvas.LeftProperty, point.X * App.CellSize);              head.SetValue(Canvas.TopProperty, point.Y * App.CellSize);              _bodies.Add(head, point);              canvasSnake.Children.Add(head);          }          /// <summary>          /// 增加一个尾巴          /// </summary>          private void AddTail()          {              var prevBody = _bodies.Last().Key;              var prevBodyPoint = _bodies.Last().Value;              Body tail = new Body(BodyType.Tail);              tail.MoveDirection = prevBody.MoveDirection;              CellPoint tailPoint = new CellPoint(prevBodyPoint.X, prevBodyPoint.Y);              switch (prevBody.MoveDirection)              {                  case Direction.Up:                      tail.SetValue(Canvas.LeftProperty, (double)prevBody.GetValue(Canvas.LeftProperty));                      tail.SetValue(Canvas.TopProperty, (double)prevBody.GetValue(Canvas.TopProperty) + App.CellSize);                      tailPoint.Y++;                      break;                  case Direction.Down:                      tail.SetValue(Canvas.LeftProperty, (double)prevBody.GetValue(Canvas.LeftProperty));                      tail.SetValue(Canvas.TopProperty, (double)prevBody.GetValue(Canvas.TopProperty) - App.CellSize);                      tailPoint.Y--;                      break;                  case Direction.Left:                      tail.SetValue(Canvas.LeftProperty, (double)prevBody.GetValue(Canvas.LeftProperty) + App.CellSize);                      tail.SetValue(Canvas.TopProperty, (double)prevBody.GetValue(Canvas.TopProperty));                      tailPoint.X++;                      break;                  case Direction.Right:                      tail.SetValue(Canvas.LeftProperty, (double)prevBody.GetValue(Canvas.LeftProperty) - App.CellSize);                      tail.SetValue(Canvas.TopProperty, (double)prevBody.GetValue(Canvas.TopProperty));                      tailPoint.X--;                      break;              }               tailPoint = CorrectCellPoint(tailPoint);              _bodies.Add(tail, tailPoint);              canvasSnake.Children.Add(tail);          }          /// <summary>          /// 增加一个豆          /// </summary>          private void AddBean()          {              if (_needBeansCount < _beansCount)                  _needBeansCount++;          }          private DateTime _prevAddBeanDateTime = DateTime.Now;          /// <summary>          /// 生成豆          /// </summary>          void UpdateBean()          {              if (_needBeansCount > 0 && (DateTime.Now - _prevAddBeanDateTime).TotalSeconds > 3)              {                  List<CellPoint> emptyCells = GetEmptyCells();                  if (emptyCells.Count == 0)                  {                      GameOver(this, EventArgs.Empty);                      return;                  }                  CellPoint point = emptyCells[_random.Next(0, emptyCells.Count)];                  Bean bean = new Bean();                  bean.SetValue(Canvas.LeftProperty, point.X * App.CellSize);                  bean.SetValue(Canvas.TopProperty, point.Y * App.CellSize);                  _beans.Add(bean, point);                  canvasBean.Children.Add(bean);                  bean.ani.Completed += delegate                  {                      ripple.ShowRipple(new Point(point.X * App.CellSize + App.CellSize / 2, point.Y * App.CellSize + App.CellSize / 2));                      player.PlayDrop();                  };                  _needBeansCount--;                  _prevAddBeanDateTime = DateTime.Now;              }          }          private DateTime _prevDateTime = DateTime.Now;          private double _leftoverLength = 0d;          void CompositionTarget_Rendering(object sender, EventArgs e)          {              double length = (DateTime.Now - _prevDateTime).TotalSeconds + _leftoverLength;              while (length > _dt)              {                  Update();                  length -= _dt;              }              _leftoverLength = length;              _prevDateTime = DateTime.Now;          }          /// <summary>          /// 即时计算          /// </summary>          private void Update()          {              if (!_enabled)                  return;              double offset = Math.Round(_speed * _dt, _decimals);              // 蛇头所处位置进入了网格点区域内              if (Math.Abs(Math.Round((double)_bodies.First().Key.GetValue(Canvas.TopProperty) % App.CellSize, _decimals)) < offset && Math.Abs(Math.Round((double)_bodies.First().Key.GetValue(Canvas.LeftProperty) % App.CellSize, _decimals)) < offset)              {                  UpdateDirection();                  CorrectPosition();                  UpdateBodyCell();                  CheckEat();                  CheckSkin();                  CheckCollision();                  UpdateBean();                  if (_needRaiseAteEvent)                  {                      Ate(this.Ate, EventArgs.Empty);                      _needRaiseAteEvent = false;                  }              }              UpdatePosition();          }          /// <summary>          /// 蜕皮          /// </summary>          private void CheckSkin()          {              if (_bodies.Count >= _ateCapacity + _selfLength)                  AddSkin(_ateCapacity);          }          /// <summary>          /// 碰撞检测          /// </summary>          private void CheckCollision()          {              if (_skins.Any(p => p.Value == _bodies.First().Value) || _bodies.Where(p => p.Key.BodyType == BodyType.Tail).Any(p => p.Value == _bodies.First().Value))              {                  _enabled = false;                  player.PlayOver();                   GameOver(this, EventArgs.Empty);              }          }          /// <summary>          /// 吃豆          /// </summary>          private void CheckEat()          {              // 是否有被吃的豆              var bean = _beans.FirstOrDefault(p => p.Value == _bodies.First().Value).Key;              if (bean != null)              {                  _beans.Remove(bean);                  canvasBean.Children.Remove(bean);                  player.PlayEat();                  AddTail();                  AddBean();                  _needRaiseAteEvent = true;              }          }          /// <summary>          /// 更新蛇的每一段的运动方向          /// </summary>          private void UpdateDirection()          {              for (int i = _bodies.Count - 1; i > -1; i--)              {                  if (i == 0)                      _bodies.ElementAt(i).Key.MoveDirection = _moveDirection;                  else                     _bodies.ElementAt(i).Key.MoveDirection = _bodies.ElementAt(i - 1).Key.MoveDirection;              }          }          /// <summary>          /// 更新蛇的每一段的位置          /// </summary>          private void UpdatePosition()          {              double offset = Math.Round(_speed * _dt, _decimals);              foreach (var body in _bodies.Keys)              {                  if (body.MoveDirection == Direction.Up)                      body.SetValue(Canvas.TopProperty, Math.Round((double)body.GetValue(Canvas.TopProperty) - offset, _decimals));                  else if (body.MoveDirection == Direction.Down)                      body.SetValue(Canvas.TopProperty, Math.Round((double)body.GetValue(Canvas.TopProperty) + offset, _decimals));                  else if (body.MoveDirection == Direction.Left)                      body.SetValue(Canvas.LeftProperty, Math.Round((double)body.GetValue(Canvas.LeftProperty) - offset, _decimals));                  else if (body.MoveDirection == Direction.Right)                      body.SetValue(Canvas.LeftProperty, Math.Round((double)body.GetValue(Canvas.LeftProperty) + offset, _decimals));              }          }          /// <summary>          /// 蜕指定数量的皮          /// </summary>          private void AddSkin(int count)          {              player.PlaySkin();              while (count > 0)              {                  KeyValuePair<Body, CellPoint> body = _bodies.ElementAt(_bodies.Count - 1);                  CellPoint skinPoint = body.Value;                  Skin skin = new Skin();                  skin.SetValue(Canvas.LeftProperty, skinPoint.X * App.CellSize);                  skin.SetValue(Canvas.TopProperty, skinPoint.Y * App.CellSize);                  _skins.Add(skin, skinPoint);                  canvasSkin.Children.Add(skin);                  _emptyCells.Remove(skinPoint);                  canvasSnake.Children.Remove(body.Key);                  _bodies.Remove(body.Key);                  count--;              }          }          #region 辅助方法          /// <summary>          /// 修正指定的位置信息为整数          /// </summary>          private int CorrectPosition(double position)          {              double result;              double offset = Math.Round(_speed * _dt, _decimals);              double temp = Math.Round(position % App.CellSize, _decimals);              if (Math.Abs(temp) < offset)                  result = Math.Round(position - temp);              else                 result = Math.Round(position - temp) + Math.Sign(temp) * App.CellSize;              return (int)result;          }          /// <summary>          /// 修正蛇的每一段的位置为整数          /// </summary>          private void CorrectPosition()          {              foreach (Body body in _bodies.Keys)              {                  double x = CorrectPosition((double)body.GetValue(Canvas.LeftProperty));                  double y = CorrectPosition((double)body.GetValue(Canvas.TopProperty));                   if (x == App.Width)                      x = 0d;                  else if (x == -App.CellSize)                      x = App.Width - App.CellSize;                  else if (y == App.Height)                      y = 0d;                  else if (y == -App.CellSize)                      y = App.Height - App.CellSize;                  body.SetValue(Canvas.LeftProperty, x);                  body.SetValue(Canvas.TopProperty, y);              }          }          /// <summary>          /// 更新蛇的每一段的网格位置信息          /// </summary>          private void UpdateBodyCell()          {              for (int i = 0; i < _bodies.Count; i++)              {                  UpdateBodyCell(_bodies.ElementAt(i).Key);              }          }          /// <summary>          /// 更新指定的 Body 的网格位置信息          /// </summary>          private void UpdateBodyCell(Body body)          {              CellPoint point = new CellPoint((int)((double)body.GetValue(Canvas.LeftProperty) / App.CellSize), (int)((double)body.GetValue(Canvas.TopProperty) / App.CellSize));              if (body.MoveDirection == Direction.Up)                  point.Y--;              else if (body.MoveDirection == Direction.Down)                  point.Y++;              else if (body.MoveDirection == Direction.Left)                  point.X--;              else if (body.MoveDirection == Direction.Right)                  point.X++;               point = CorrectCellPoint(point);               _bodies[body] = point;          }          /// <summary>          /// 修正网格位置          /// </summary>          private CellPoint CorrectCellPoint(CellPoint point)          {              if (point.X > _columns - 1)                  point.X = _columns - point.X;              else if (point.X < 0)                  point.X = point.X + _columns;               if (point.Y > _rows - 1)                  point.Y = _rows - point.Y;              else if (point.Y < 0)                  point.Y = point.Y + _rows;               return point;          }          /// <summary>          /// 获取空网格集合          /// </summary>          private List<CellPoint> GetEmptyCells()          {              List<CellPoint> emptyCells = new List<CellPoint>();              List<CellPoint> aroundHeadCells = new List<CellPoint>();              CellPoint headPoint = _bodies.First().Value;              for (int i = -5; i < 5; i++)              {                  for (int j = -5; j < 5; j++)                  {                      CellPoint point = new CellPoint(headPoint.X + i, headPoint.Y + j);                      point = CorrectCellPoint(point);                       aroundHeadCells.Add(point);                  }              }              // skin 的占位情况因为确定了就不变了,所以在 AddSkin() 处计算              // 为了以下 LINQ 的可用,需要重写 CellPoint 的 public override bool Equals(object obj)              emptyCells = _emptyCells.Where(p => !_bodies.Select(x => x.Value).Contains(p)).ToList();              emptyCells = emptyCells.Where(p => !_beans.Select(x => x.Value).Contains(p)).ToList();              emptyCells = emptyCells.Where(p => !aroundHeadCells.Contains(p)).ToList();              return emptyCells;          }          #endregion          #region 属性          public Direction MoveDirection          {              set              {                  Body head = _bodies.First().Key;                   if (head.MoveDirection == Direction.Up && value == Direction.Down)                      return;                  if (head.MoveDirection == Direction.Down && value == Direction.Up)                      return;                  if (head.MoveDirection == Direction.Left && value == Direction.Right)                      return;                  if (head.MoveDirection == Direction.Right && value == Direction.Left)                      return;                  _moveDirection = value;              }          }          public bool Enabled          {              get { return _enabled; }              set { _enabled = value; }          }          public double Speed          {              get { return _speed; }              set { _speed = value; }          }          public int AteCapacity          {              get { return _ateCapacity; }              set { _ateCapacity = value; }          }          #endregion          #region 事件 GameOver 和 Ate          public event EventHandler GameOver;          public event EventHandler Ate;          #endregion      }  }

看完上述内容,你们对如何用Silverlight开发贪吃蛇游戏有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注编程网行业资讯频道,感谢大家的支持。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何用Silverlight开发贪吃蛇游戏

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何用Silverlight开发贪吃蛇游戏

今天就跟大家聊聊有关如何用Silverlight开发贪吃蛇游戏,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。介绍使用 Silverlight 3.0(c#) 开发一个贪吃蛇游戏玩法W
2023-06-17

C#游戏开发之实现贪吃蛇游戏

这篇文章主要为大家详细介绍了C#如何实现经典贪吃蛇游戏,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以跟随小编一起了解一下
2023-01-04

Android开发之经典游戏贪吃蛇

前言 这款游戏实现的思路和源码参考了Google自带的Snake的例子,其中修改了一些个人认为还不够完善的地方,加入了一些新的功能,比如屏幕上的方向操作盘,暂停按钮,开始按钮,退出按钮。另外,为了稍微增加些用户体验,除了游戏的主界面,本人自
2022-06-06

js如何实现贪吃蛇游戏

本篇内容介绍了“js如何实现贪吃蛇游戏”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!两个小时完成的,有点简陋。直接看效果。打开调试面板,在r
2023-06-14

QT如何实现贪吃蛇游戏

这篇文章主要介绍了QT如何实现贪吃蛇游戏,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。为了熟悉QT的相关知识,我用了大约8个小时的时间用QT再次写了一遍贪吃蛇。因为QT的机制
2023-06-15

python如何实现贪吃蛇游戏

这篇文章主要介绍了python如何实现贪吃蛇游戏,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。游戏实现效果如下:后面有完整代码和解析import sysimport pyga
2023-06-14

C语言实现贪吃蛇小游戏开发

这篇文章主要为大家详细介绍了C语言实现贪吃蛇小游戏开发,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
2022-11-13

如何利用pygame实现贪吃蛇游戏

这篇文章主要介绍如何利用pygame实现贪吃蛇游戏,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!创建蛇首先,先分析一下蛇的移动,不然我们一定会吃亏的(别问,问就是自己写了一堆无效代码)。蛇的移动其实并没有想象中那样复
2023-06-15

如何实现贪吃蛇Python小游戏

这篇文章主要介绍“如何实现贪吃蛇Python小游戏”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何实现贪吃蛇Python小游戏”文章能帮助大家解决问题。贪吃蛇Python小游戏(源码+注释+粘贴即
2023-07-05

如何使用Canvas写一个贪吃蛇游戏

这篇文章主要介绍了如何使用Canvas写一个贪吃蛇游戏,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。之前在慕课网看了几集Canvas的视频,一直想着写点东西练练手。感觉贪吃蛇
2023-06-09

怎么用Python写贪吃蛇游戏

怎么用Python写贪吃蛇游戏,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。前几天,有人提到贪吃蛇,一下子就勾起了我的兴趣,毕竟在那个Nokia称霸的年代,这款游戏可是经典
2023-06-02

如何用C语言做贪吃蛇小游戏

这篇文章主要讲解了“如何用C语言做贪吃蛇小游戏”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何用C语言做贪吃蛇小游戏”吧!C语言作为计算机编程最初学的语言,作为高级语言的C语言,那么它又可
2023-06-16

C++如何实现简易贪吃蛇游戏

这篇文章主要介绍C++如何实现简易贪吃蛇游戏,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!C++实现建议贪吃蛇(不会闪屏幕)使用vs2013完成。记录踏上游戏开发的道路。效果图代码// 2021.7.24.1贪吃蛇.
2023-06-20

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录