{"id":13655148,"url":"https://github.com/doubleZ0108/cherryOS","last_synced_at":"2025-04-23T10:32:11.647Z","repository":{"id":109609705,"uuid":"204666865","full_name":"doubleZ0108/cherryOS","owner":"doubleZ0108","description":"Personal Operating System | Tongji Univ. SSE Course Project","archived":false,"fork":false,"pushed_at":"2020-09-19T12:36:25.000Z","size":13279,"stargazers_count":16,"open_issues_count":0,"forks_count":7,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-11-10T06:34:31.480Z","etag":null,"topics":["bochs","linux","operating-systems-project","tongji-university"],"latest_commit_sha":null,"homepage":"","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/doubleZ0108.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2019-08-27T09:22:23.000Z","updated_at":"2024-07-15T09:47:34.000Z","dependencies_parsed_at":"2023-03-27T21:19:29.397Z","dependency_job_id":null,"html_url":"https://github.com/doubleZ0108/cherryOS","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/doubleZ0108%2FcherryOS","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/doubleZ0108%2FcherryOS/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/doubleZ0108%2FcherryOS/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/doubleZ0108%2FcherryOS/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/doubleZ0108","download_url":"https://codeload.github.com/doubleZ0108/cherryOS/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250416536,"owners_count":21427008,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bochs","linux","operating-systems-project","tongji-university"],"created_at":"2024-08-02T03:00:58.664Z","updated_at":"2025-04-23T10:32:06.632Z","avatar_url":"https://github.com/doubleZ0108.png","language":"C","funding_links":[],"categories":["目录"],"sub_categories":["操作系统"],"readme":"# CherryOS——操作系统课程设计文档\n\n* [\u003cstrong\u003e1.\u003c/strong\u003e 项目概述](#1-项目概述)\n   * [\u003cstrong\u003e1.1\u003c/strong\u003e 项目简介](#11-项目简介)\n   * [\u003cstrong\u003e1.2\u003c/strong\u003e 项目配置](#12-项目配置)\n   * [\u003cstrong\u003e1.3\u003c/strong\u003e 项目分工](#13-项目分工)\n* [2. 如何运行项目](#2-如何运行项目)\n   * [2.1 安装Bochs](#21-安装bochs)\n   * [2.2 安装NASM](#22-安装nasm)\n   * [2.3 修改工作路径](#23-修改工作路径)\n   * [2.4 运行cherryOS](#24-运行cherryos)\n* [3. 操作说明](#3-操作说明)\n   * [3.1 开机动画](#31-开机动画)\n   * [3.2 主界面](#32-主界面)\n   * [3.3 帮助界面：](#33-帮助界面)\n      * [无该指令](#无该指令)\n      * [man help](#man-help)\n      * [man clear](#man-clear)\n      * [man man](#man-man)\n      * [man math](#man-math)\n      * [man cal](#man-cal)\n      * [man process](#man-process)\n      * [man file](#man-file)\n   * [3.4 系统级应用—进程管理](#34-系统级应用进程管理)\n      * [主页](#主页)\n      * [ps](#ps)\n      * [kill [id]](#kill-id)\n         * [不可结束：](#不可结束)\n         * [id非法：](#id非法)\n         * [成功执行：](#成功执行)\n      * [restart [id]](#restart-id)\n         * [成功执行：](#成功执行-1)\n         * [正在运行：](#正在运行)\n         * [id非法：](#id非法-1)\n   * [3.5 系统级应用—文件管理](#35-系统级应用文件管理)\n      * [主页](#主页-1)\n      * [创建文本文件](#创建文本文件)\n      * [创建文件夹](#创建文件夹)\n      * [显示本目录级别的文件目录](#显示本目录级别的文件目录)\n      * [打开文件夹](#打开文件夹)\n      * [回退上一级文件](#回退上一级文件)\n      * [打开文本文件](#打开文本文件)\n         * [查看和退出（上图）\t编辑和保存（下图）](#查看和退出上图编辑和保存下图)\n      * [删除文件](#删除文件)\n      * [文件保存](#文件保存)\n   * [3.6 用户级应用**—计算器**](#36-用户级应用计算器)\n      * [计算表达式的值 math [expression]](#计算表达式的值-math-expression)\n      * [对表达式进行美化 math -beauty [expression]](#对表达式进行美化-math--beauty-expression)\n      * [将中缀表达式转换为后缀表达式 math -rev [expression]](#将中缀表达式转换为后缀表达式-math--rev-expression)\n      * [表达式中含有非法字符](#表达式中含有非法字符)\n      * [表达式括号不匹配](#表达式括号不匹配)\n   * [3.7 用户级应用—日历](#37-用户级应用日历)\n      * [显示某月月历](#显示某月月历)\n      * [计算某一天是周几](#计算某一天是周几)\n      * [计算某一天是该年的第几天](#计算某一天是该年的第几天)\n      * [年份检测](#年份检测)\n      * [月份检测](#月份检测)\n      * [日期检测](#日期检测)\n      * [平年二月份检测](#平年二月份检测)\n      * [闰年二月份检测](#闰年二月份检测)\n   * [3.8 用户级应用—2048](#38-用户级应用2048)\n   * [3.9 用户级应用—推箱子](#39-用户级应用推箱子)\n   * [3.10 用户级应用—井字棋](#310-用户级应用井字棋)\n   * [3.11 用户级应用—五子棋](#311-用户级应用五子棋)\n   * [3.12 用户级应用—扫雷](#312-用户级应用扫雷)\n* [4. 功能实现](#4-功能实现)\n   * [4.1 用户级应用—日历](#41-用户级应用日历)\n   * [4.2 用户级应用—计算器](#42-用户级应用计算器)\n   * [4.3 用户级应用—2048](#43-用户级应用2048)\n   * [4.4 用户级应用—扫雷](#44-用户级应用扫雷)\n   * [4.5 用户级应用—井字棋](#45-用户级应用井字棋)\n   * [4.6 用户级应用—五子棋](#46-用户级应用五子棋)\n   * [4.7 用户级应用—推箱子](#47-用户级应用推箱子)\n   * [4.8 系统级应用—进程管理](#48-系统级应用进程管理)\n   * [4.9 系统级应用—文件管理](#49-系统级应用文件管理)\n-----\n\n## **1.** 项目概述\n\n### **1.1** 项目简介\n\n​\t本项目以 Oranges’操作系统作为基本框架，完成了 3 个系统级应用: 多功能控制台、进程管理和文件管理。同时，还实现了 7 个用户级应用，包括计算器，日历和 5 个小游戏（2048，推箱子，井字棋，五子棋，扫雷）。系统将根据输入的命令进行不同的操作。\n\n​\t额外的，项目还有许多附加的小功能，例如开机动画（逐帧动画），清屏等。\n\n### **1.2** 项目配置\n\n​\t编写语言：汇编语言，C语言\n\n​\t开发环境：Linux系统下的Bochs 2.6.9\n\n​\t运行环境：windows上的VMWare\n\n### **1.3** 项目分工\n\n​\t张喆：框架搭建、文件管理、计算器、日历\n\n​\t卜滴：推箱子、井字棋、五子棋、扫雷\n\n​\t刘一默：进程管理、日历、2048、五子棋\n\n\n\n## 2. 如何运行项目\n\n### 2.1 安装Bochs\n\n- 安装插件\n\n  ```bash\n  sudo apt-get install build-essential\n  sudo apt-get install xorg-dev\n  sudo apt-get install bison\n  sudo apt-get install libgtk2.0-dev\n  ```\n\n- 安装Bochs\n\n  - 下载`bochs-2.x.x.tar.gz`包\n\n  - 进入到`bochs-2.x.x.tar.gz`的上级目录\n\n    ```bash\n    tar -axvf bochs-2.x.x.tar.gz\n    cd bochs-2.x.x.tar.gz\n    ./configure --enable-debugger --enable-disasm\n    ```\n\n  - 打开Makefile, 找到92行左右的LIBS=..., 在行尾添加-lpthread\n\n    ```bash\n    make\n    sudo make install\n    ```\n\n### 2.2 安装NASM\n\n- 下载`nasm-x.x.x.tar.gz`包\n\n- 进入到`nasm-x.x.x.tar.gz`的上级目录\n\n  ```bash\n  cd nasm-x.x.x.tar.gz\n  ./configure\n  make\n  sudo make install\n  ```\n\n### 2.3 修改工作路径\n\n- 进入到cherryOS目录中\n\n- 修改`bochsrc`, 将如下三个路径更换为自己的工作路径\n\n  ![image.png](https://upload-images.jianshu.io/upload_images/12014150-36bc9d6020a34346.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)\n\n### 2.4 运行cherryOS\n\n- 在`cherryOS/`中打开命令行\n\n- 输入 `bochs` -\u003e 6 -\u003e c\n\n  ![image.png](https://upload-images.jianshu.io/upload_images/12014150-bd91132886d3fd04.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)\n\n- ***\u003cu\u003e这里放张系统主界面的截屏\u003c/u\u003e***\n\n\n\n## 3. 操作说明\n\n​\t打开终端，输入 bochs、回车、’c’ 进入调试模式。\n\n### 3.1 开机动画 \n\n![开机动画](Interface/开机动画.gif)\n\n### 3.2 主界面\n\n​\t菜单显示系统提供的所有功能编号及概要。输入各命令或其编号，进入相应功能界面。\n\n​\t若想要回到主界面（help界面），在命令行中输入“help”按下回车即可。\n\n![主界面](Interface/主界面.png)\n\n### 3.3 帮助界面：\n\n​\t在命令行中输入 man -XXX 即可进入相关的帮助界面，系统会对指令的功能进行具体的介绍。\n\n#### \t无该指令\n\n![not found](Interface/man/not-found.png)\n\n#### \tman help\n\n![help](Interface/man/help.png)\n\n#### \tman clear\n\n![clear](Interface/man/clear.png)\n\n#### \tman man\n\n![man](Interface/man/man.png)\n\n#### \tman math\n\n![math](Interface/man/math.png)\n\n#### \tman cal\n\n![cal](Interface/man/cal.png)\n\n#### \tman process\n\n![process](Interface/man/process.png)\n\n#### \tman file\n\n![file](Interface/man/file.png)\n\n### 3.4 系统级应用—进程管理\n\n​\t在命令行中输入 process 即可进入进程管理。\n\n#### \t主页\n\n​\t\t进程管理欢迎界面，并显示进程管理支持的所有指令以及它们的功能。\n\n![主页](Interface/进程管理/主页.png)\n\n#### \tps\n\n​\t\t输入 ps ，展示该系统当前所有进程的ID，进程名称，优先级以及是否正在运行。\n\n![ps](Interface/进程管理/ps.png)\n\n#### \tkill [id]\n\n​\t\t输入 kill [id]，即可结束目标进程。若目标进程不存在，id 非法或不可结束将弹出反馈信息。\n\n##### \t不可结束：\n\n![kill system process](Interface/进程管理/kill_system_process.png)\n\n##### \tid非法：\n\n![kill exceed](Interface/进程管理/kill_exceed.png)\n\n##### \t成功执行：\n\n![kill](Interface/进程管理/kill.png)\n\n#### \trestart [id]\n\n​\t\t输入 restart [id]，即可启动未运行进程。若目标进程不存在，id 非法或目标进程已在运行，则弹出反馈信息。输入quit，即可退出进程管理系统。\n\n##### \t成功执行：\n\n![restart](Interface/进程管理/restart.png)\n\n##### \t正在运行：\n\n![restart running](Interface/进程管理/restart_running.png)\n\n##### \tid非法：\n\n![restart exceed](Interface/进程管理/restart_exceed.png)\n\n### 3.5 系统级应用—文件管理\n\n​\tTestB：文件系统\n\n​\t该文件系统模拟linux的部分简单的文件操作，并设置初始用户为home。\n\n​\t该文件系统中文件保存在名为 ss 的“虚拟文件”里，该文件刻在 80.img 的“硬盘”里，所以可以进行长期的保存。\n\n#### \t主页\n\n![主页](Interface/文件管理/主页.png)\n\n#### \t创建文本文件\n\n​\t\t输入 touch XXX 创建文件\n\n![touch](Interface/文件管理/touch.png)\n\n#### \t创建文件夹\n\n​\t\t输入 mkdir XXX 创建\n\n![mkdir](Interface/文件管理/mkdir.png)\n\n#### \t显示本目录级别的文件目录\n\n​\t\t后缀为 txt 代表文本文件，fd 代表文件夹类型文件。\n\n![ls](Interface/文件管理/ls.png)\n\n#### \t打开文件夹\n\n​\t\t输入 cd XXX 打开文件夹，进入下一级文件。\n\n![跳转到子目录并在子目录下创建文件](Interface/文件管理/跳转到子目录并在子目录下创建文件.png)\n\n#### \t回退上一级文件\n\n​\t\t输入 cd ..\n\n![返回上一级目录](Interface/文件管理/返回上一级目录.png)\n\n#### \t打开文本文件\n\n​\t\t可以进行三种操作：查看、编辑文本文件以及退出保存。\n\n![查看文本文件](Interface/文件管理/查看文本文件.png)\n\n##### \t\t\t\t查看和退出（上图）\t编辑和保存（下图）\n\n![编辑文本文件并保存](Interface/文件管理/编辑文本文件并保存.png)\n\n#### \t删除文件\n\n​\t\trm XXX 删除文件\n\n![rm](Interface/文件管理/rm.png)\n\n#### \t文件保存\n\n​\t\t输入 sv 保存内容，将更新过的文件信息保存进文件系统。\n\n![sv](Interface/文件管理/sv.png)\n\n### 3.6 用户级应用**—计算器**\n\n#### \t计算表达式的值 math [expression]\n\n![math](Interface/math/math.png)\n\n#### \t对表达式进行美化 math -beauty [expression]\n\n![beauty](Interface/math/beauty.png)\n\n#### \t将中缀表达式转换为后缀表达式 math -rev [expression]\n\n![rev](Interface/math/rev.png)\n\n#### \t表达式中含有非法字符\n\n![表达式中有非法字符](Interface/math/表达式中有非法字符.png)\n\n#### \t表达式括号不匹配\n\n![括号不匹配](Interface/math/括号不匹配.png)\n\n### 3.7 用户级应用—日历\n\n​\t本项目实现了日历功能，能够进行经典的日历操作，并对不符的输入进行检测与提示。\n\n#### \t显示某月月历\n\n![cal月份](Interface/cal/cal月份.png)\n\n#### \t计算某一天是周几\n\n![cal星期](Interface/cal/cal星期.png)\n\n#### \t计算某一天是该年的第几天\n\n![cal日期](Interface/cal/cal日期.png)\n\n#### \t年份检测\n\n![年份检测](Interface/cal/年份检测.png)\n\n#### \t月份检测\n\n![月份检测](Interface/cal/月份检测.png)\n\n#### \t日期检测\n\n![日期检测](Interface/cal/日期检测.png)\n\n#### \t平年二月份检测\n\n![平年二月份检测](Interface/cal/平年二月份检测.png)\n\n#### \t闰年二月份检测\n\n![闰年二月份检测](Interface/cal/闰年二月份检测.png)\n\n### 3.8 用户级应用—2048\n\n​\t本项目实现了经典的2048小游戏，通过 wsad 进行上下左右移动的操作，并给出实时分数，并可通过 q 退出（quit）。\n\n​\t初始界面\n\n![2048_start](Interface/game/2048_start.png)\n\n​\t退出\n\n![2048_quit](Interface/game/2048_quit.png)\n\n### 3.9 用户级应用—推箱子\n\n​\t本项目实现了经典的推箱子游戏功能。\n\n​\t初始界面\n\n![pushbox_start](Interface/game/pushbox_start.png)\n\n​\t游戏界面\n\n![pushbox](Interface/game/pushbox.png)\n\n### 3.10 用户级应用—井字棋\n\n​\t本项目实现了经典的井字棋小游戏，支持人机对战，实现了系统AI。\n\n​\t初始界面\n\n![tictactoe_start](Interface/game/tictactoe_start.png)\n\n​\t游戏界面\n\n![tictactoe](Interface/game/tictactoe.png)\n\n### 3.11 用户级应用—五子棋\n\n​\t本项目实现了经典的五子棋游戏功能。\n\n​\t初始界面\t\n\n![fivechess_start](Interface/game/fivechess_start.png)\n\n​\t游戏界面\n\n![fivechess_play](Interface/game/fivechess.png)\n\n### 3.12 用户级应用—扫雷\n\n​\t本项目实现了经典的扫雷游戏功能。\n\n​\t初始界面\n\n![swepmine_start](Interface/game/swepmine_start.png)\n\n​\t游戏界面\n\n![swep mine](Interface/game/swepmine.png)\n\n## 4. 功能实现\n\n### 4.1 用户级应用—日历\n\n主要函数\n\n| 函数名称      | 返回值类型 | 函数参数                     | 作用                       |\n| ------------- | ---------- | ---------------------------- | -------------------------- |\n| Isleap        | int        | Int year                     | 判断概念是否为闰年         |\n| Total_dat     | int        | Int year, int month, int day | 计算改日期是该年的第多少天 |\n| Weekday       | int        | Int year, int month, int day | 判断该日期是周几           |\n| display_month | void       | Int year, int month          | 显示该月日历               |\n\n代码展示\n\n```c\n/*****************************************************************************\n *                                calendar\n *****************************************************************************/\nint Isleap(int year);\n\n/*判断输入年份二月份的天数\n返回值:month的天数*/\nint Max_day(int year, int month);\n\n/*计算输入的日期是这一年的多少天*/\nint Total_day(int year, int month, int day);\n\n/*由输入的日期判断当天是星期几\n**返回值:count,0～6，分别表示星期日～星期六\n*/\nint Weekday(int year, int month, int day);\n\n\n/*显示输入的日期是星期几*/\nvoid display_week(int year, int month, int day);\n\n/*显示输入的日期的当月日历*/\nvoid display_month(int year, int month);\n```\n\n### 4.2 用户级应用—计算器\n\n​\t主要函数\n\n| 函数名称         | 返回值类型 | 函数参数                                          | 作用                     |\n| ---------------- | ---------- | ------------------------------------------------- | ------------------------ |\n| calculate        | int        | char* origin_exp, bool if_showrev, bool if_beauty | 计算主函数               |\n| calResult        | int        | struct Data result[], int size                    | 计算后缀表达式           |\n| check_exp_bucket | bool       | char* exp                                         | 判断表达式括号是否匹配   |\n| check_exp_notion | bool       | char* exp                                         | 判断表达式是否有非法符号 |\n\n​\t代码展示 \n\n```c\n/*****************************************************************************\n *                                计算器\n *****************************************************************************/\n\ntypedef int bool;\ntypedef int DATA;\n#define False 0\n#define True 1\n#define EMPTY_CH '\\0'\n#define EMPTY_NUM -999999\n#define SIZE 50\n\n\n/*============ 操作数栈 ============*/\nint num_stack[100] = { 0 };\nint num_stack_index = -1;\n\nbool isempty_num_stack();\n\nvoid num_stack_push(int num);\n\nint num_stack_pop(void);\n\nvoid num_stack_clear(void);\n\n/*============ 优先级 ============*/\nint isp(char ch);\n//栈内优先级\nint icp(char ch);\n//栈外优先级\n\n\n/*============ 运算符判断 ============*/\nbool isOperator(char c);\n\n/*============ 单个数字字符判断 ============*/\nbool isDigit(char ch);\n\n/*============ 数字判断 ============*/\nbool isNum(char* exp);\n//数字包括 正数 负数 浮点数 (其中+3要进行特殊处理)\n\n\n/*============ 在表达式最后添加 # 标识符 ============*/\nvoid addTail(char* exp);\n\n/*============ 封装表达式中的项 ============*/\nstruct Data {\n\tint data;\t//数据本身\n\tint flag;\t//0-\u003echar, 1-\u003eint\n};\nint _current = 0;\n\n/*============ 获取表达式中的下一项 ============*/\nstruct Data NextContent(char* exp);\n\n\n/*============ 根据运算符和两个操作数计算值 ============*/\nint Cal(int left, char op, int right);\n\n/*============ 输出后缀表达式 ============*/\nvoid showBackMode(struct Data result[], int size);\n\n/*============ 计算后缀表达式的结果 ============*/\nint calResult(struct Data result[], int size);\n\n\n/*============ 顶层计算函数 ============*/\nint calculate(char* origin_exp, bool if_showrev, bool if_beauty) ;\n\n/*判断表达式括号是否匹配*/\nbool check_exp_bucket(char* exp);\n\n/*判断表达式是否有非法符号*/\nbool check_exp_notion(char* exp);\n```\n\n### 4.3 用户级应用—2048\n\n​\t主要函数\n\n| 函数名称        | 返回值类型 | 函数参数                    | 作用                   |\n| --------------- | ---------- | --------------------------- | ---------------------- |\n| Run2048         | void       | int fd_stdin, int fd_stdout | 程序入口               |\n| loop_game       | void       | int fd_stdin                | 循环的游戏输入输出逻辑 |\n| reset_game      | void       | null                        | 重置游戏               |\n| add_rand_num    | void       | null                        | 生成并加入一个随机数   |\n| check_game_over | void       | null                        | 检查游戏是否结束       |\n| move_left       | void       | null                        | 左移                   |\n| move_right      | void       | null                        | 右移                   |\n| move_up         | void       | null                        | 上移                   |\n| move_down       | void       | null                        | 下移                   |\n| refresh_show    | void       | null                        | 刷新界面               |\n\n​\t代码展示\n\n```c\n/*****************************************************************************\n *                                2048\n *****************************************************************************/\n\n#define KEY_CODE_UP    0x41\n#define KEY_CODE_DOWN  0x42\n#define KEY_CODE_LEFT  0x44\n#define KEY_CODE_RIGHT 0x43\n#define KEY_CODE_QUIT  0x71\n\nstruct termios old_config; /* linux下终端属性配置备份 */\n\n\nstatic char config_path[4096] = { 0 }; /* 配置文件路径 */\n\nstatic void init_game();    /* 初始化游戏 */\nstatic void loop_game(int fd_stdin);    /* 游戏循环 */\nstatic void reset_game();   /* 重置游戏 */\nstatic void release_game(int signal); /* 释放游戏 */\n\nstatic char* read_keyboard(int fd_stdin);\n\nstatic void move_left();  /* 左移 */\nstatic void move_right(); /* 右移 */\nstatic void move_up();    /* 上移 */\nstatic void move_down();  /* 下移 */\n\nstatic void add_rand_num();    /* 生成随机数，本程序中仅生成2或4，概率之比设为9:1 */\nstatic void check_game_over(); /* 检测是否输掉游戏，设定游戏结束标志 */\nstatic int get_null_count();   /* 获取游戏面板上空位置数量 */\nstatic void clear_screen();    /* 清屏 */\nstatic void refresh_show();    /* 刷新界面显示 */\n\nstatic int board[4][4];     /* 游戏数字面板，抽象为二维数组 */\nstatic int score;           /* 游戏得分 */\nstatic int best;            /* 游戏最高分 */\nstatic int if_need_add_num; /* 是否需要生成随机数标志，1表示需要，0表示不需要 */\nstatic int if_game_over;    /* 是否游戏结束标志，1表示游戏结束，0表示正常 */\nstatic int if_prepare_exit; /* 是否准备退出游戏，1表示是，0表示否 */\n```\n\n### 4.4 用户级应用—扫雷\n\n​\t主要函数\n\n| 函数名称    | 返回值类型 | 函数参数                    | 作用               |\n| ----------- | ---------- | --------------------------- | ------------------ |\n| sl_init     | void       | int fd_stdin, int fd_stdout | 初始化游戏         |\n| sl_set_mine | void       | int fd_stdin                | 埋地雷             |\n| sl_display  | void       | null                        | 打印地图           |\n| sl_get_num  | int        | int x, int y                | 计算某个位置的数字 |\n| sl_sweep    | int        | null                        | 展开地图           |\n| runMine     | int        | int fd_stdin, int fd_stdout | 程序入口           |\n\n​\t代码展示\n\n```c\n/*======================================================================*\n\t\t\t\t\t\t\t\t\t\tmine\n *======================================================================*/\n\n#define rows 11\n#define cols 11\n#define Count 10\n\nchar mine[rows][cols];\nchar show[rows][cols];\n\nvoid sl_init();\n\nvoid sl_set_mine();\n\nvoid sl_display(char a[rows][cols]);\n\nint sl_get_num(int x, int y);\n  \nint sl_sweep();\n\nint runMine(fd_stdin, fd_stdout);\n```\n\n### 4.5 用户级应用—井字棋\n\n​\t主要函数\n\n| 函数名称        | 返回值类型 | 函数参数                    | 作用       |\n| --------------- | ---------- | --------------------------- | ---------- |\n| Printchessboard | void       | null                        | 打印棋盘   |\n| IsWin           | int        | struct State s              | 判断输赢   |\n| e_fun           | int        | struct State s              | 评估函数   |\n| AutoDone        | int        | null                        | 计算机落子 |\n| UserInput       | int        | int fd_stdin, int fd_stdout | 用户落子   |\n| TicTacToe       | int        | int fd_stdin, int fd_stdout | 程序入口   |\n\n​\t代码展示\n\n```c\n/*======================================================================*\n\t\t\t\t\t\t\t\t\t\tTicTacToe\n *======================================================================*/\nint tmpQP[3][3]; //定义棋盘，0为空，1为敌方棋子，-1为我方棋子\n#define MAX_NUM 1000\nconst int NO_BLANK = -1001;\nconst int TREE_DEPTH = 3; //搜索树的最大深度\nconst int NIL = 1001;    //空\nstatic int s_count;\n\n\nstruct State//棋盘状态\n{\n\tint QP[3][3];\n\tint e_fun; //评估函数值\n\tint child[9];\n\tint parent;\n\tint bestChild;\n}States[MAX_NUM];\n\n\nvoid chessMenu();\n\nvoid Init();//初始化\n\nvoid Printchessboard(); //打印棋盘\n\nint IsWin(struct State s); //判断输赢\n\nint e_fun(struct State s); //评估函数\n\nint AutoDone(); //计算机决定落子位置，并判断当前棋局。\n\nvoid UserInput(int fd_stdin, int fd_stdout); //用户输入落子位置\n\nvoid TicTacToe(int fd_stdin, int fd_stdout);\n```\n\n### 4.6 用户级应用—五子棋\n\n​\t主要函数\n\n| 函数名称   | 返回值类型 | 函数参数                       | 作用                     |\n| ---------- | ---------- | ------------------------------ | ------------------------ |\n| fiveChess  | int        | int fd_stdin                   | 程序入口                 |\n| horizontal | int        | int row, int col, char whoFlag | 在横向上评估某位置的分数 |\n| vertical   | int        | int row, int col, char whoFlag | 在纵向上评估某位置的分数 |\n| leftSlope  | int        | int row, int col, char whoFlag | 在左斜上评估某位置的分数 |\n| rightSlope | int        | int row, int col, char whoFlag | 在右斜上评估某位置的分数 |\n| pcLoad     | void       | null                           | 计算机落子               |\n| playerLoad | int        | Int fe_stdin                   | 用户落子                 |\n| Win        | int        | null                           | 判断某方是否胜利         |\n\n​\t代码展示\n\n```c\n/*****************************************************************************\n *                               five chess\n *****************************************************************************/\n#define WIDTH 15\n#define HIGHT 15\n#define WHITE 0\n#define BLACK 1\n#define WIN 2\n\nchar WHITE_FLAG = 'O';//大写o\nchar BLACK_FLAG = 'X';\n\nchar map[WIDTH][HIGHT];\nint situationPC[WIDTH][HIGHT] = { 0 };  //situation\nint situationPlayer[WIDTH][HIGHT] = { 0 };\n\nint player = BLACK;\n\nvoid init_map();\nvoid draw_pc_map();\nvoid draw_player_map();\nvoid draw_map_chess();\nint horizontal(int row, int col, char whoFlag);\nint vertical(int row, int col, char whoFlag);\nint leftSlope(int row, int col, char whoFlag);\nint rightSlope(int row, int col, char whoFlag);\nint result(int left, int right, int count, int k, char num);\nvoid pcLoad();\nvoid benefit();\nint playerLoad(fd_stdin);\nint win();\nint fiveChess(fd_stdin);\n\n```\n\n### 4.7 用户级应用—推箱子\n\n​\t主要函数\n\n| 函数名称   | 返回值类型 | 函数参数                    | 作用     |\n| ---------- | ---------- | --------------------------- | -------- |\n| Runpushbox | void       | int fd_stdin, int fd_stdout | 程序入口 |\n| draw_map   | void       | Int map[9][11]              | 打印地图 |\n| boxMenu    | void       | Null                        | 打印菜单 |\n\n​\t代码展示\n\n```c\n/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t push box\n++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/\n\nint pi = 0;\nint pj = 0;\nvoid draw_map(int map[9][11]);\n\nvoid boxMenu();\n\nvoid Runpushbox(fd_stdin, fd_stdout);\n```\n\n### 4.8 系统级应用—进程管理\n\n​\t主要功能\n\n​\t该进程管理小工具主要包括进程状态的展示，以及进程的结束与重启 。\n\n​\t进程展示:该功能读取系统进程表 proc_table 表项以及其各个属性并打印到屏幕 \n\n​\t结束进程:该功能通过读取进程 ID 字符串，并将其换算为数值，以该数值做下表读取 系统进程表，修改目标表项 priority 与置 p_flags 属性值为-1 以达到结束进程目的。 \n\n​\t启动进程:该功能通过读取进程 ID 字符串，并将其换算为数值，以该数值做下表读取 系统进程表，恢复目标表项 priority 与置 p_flags 属性值为 1 以达到启动进程目的。 \n\n​\t代码展示\n\n```c\n/*****************************************************************************\n *                                processManager\n *****************************************************************************/ \n//进程管理主函数\nvoid runProcessManage(int fd_stdin);\n//打印欢迎界面\nvoid showProcessWelcome();\n//打印所有进程\nvoid showProcess();\nint getMag(int n);\n//计算进程pid\nint getPid(char str[]);\n//结束进程\nvoid killProcess(char str[]);\n//重启进程\nvoid restartProcess(char str[]);\n```\n\n### 4.9 系统级应用—文件管理\n\n​\t概述\n\n​\t该文件系统利用Oranges’代码样例中给出的open(),write()函数进行硬盘读写的模拟操作，将界面上各种文件控制操作和对应文件记录记录在80.img硬盘上。而该文件系统中文件类型分为文本文件以及文件夹类型的文件\n\n​\t主要函数\n\n| 函数名称      | 返回值类型 | 函数参数                                 | 作用                               |\n| ------------- | ---------- | ---------------------------------------- | ---------------------------------- |\n| InitFiliBlock | void       | Int fileID, char* filename, int filetype | 初始话结构体                       |\n| InttoStr3     | void       | char* temp, int I                        | 将Temp转化成对应的数，i代表数字    |\n| WriteDisk     | void       | Int len                                  | 将文件结果存入硬盘                 |\n| toInt         | int        | Char temp                                | 将temp数组对应数字转化为int值      |\n| ReadDisk      | int        | void                                     | 读取硬盘内容                       |\n| FSInt         | void       | void                                     | 初始化全局变量                     |\n| CreateFile    | int        | char* filename, int filetype             | 根据文件类型创建文件，返回成功与否 |\n| ShowFileList  | void       | void                                     | 展示这一级所有文件名               |\n| SearchFile    | int        | char* name                               | 搜索该目录下特定文件名的文件       |\n| ReturnFile    | void       | Int id                                   | 返回上一级文件夹ID                 |\n| DeleteFile    | int        | Int id                                   | 删除特定ID的文件，返回成功与否的值 |\n| ShowMessage   | void       | void                                     | 输出提示信息                       |\n\n​\t代码展示\n\n```c\n/*======================================================================*\n\t\t\t\t\t\t\t文件系统\n *======================================================================*/\n#define MAX_FILE_PER_LAYER 10\n#define MAX_FILE_NAME_LENGTH 20\n#define MAX_CONTENT_ 50\n#define MAX_FILE_NUM 100\n\n //文件ID计数器\nint fileIDCount = 0;\nint currentFileID = 0;\n\nstruct fileBlock {\n\tint fileID;\n\tchar fileName[MAX_FILE_NAME_LENGTH];\n\tint fileType; //0 for txt, 1 for folder\n\tchar content[MAX_CONTENT_];\n\tint fatherID;\n\tint children[MAX_FILE_PER_LAYER];\n\tint childrenNumber;\n};\nstruct fileBlock blocks[MAX_FILE_NUM];\nint IDLog[MAX_FILE_NUM];\n\n//文件管理主函数\nvoid runFileManage(int fd_stdin);\n\nvoid initFileBlock(int fileID, char* fileName, int fileType);\nvoid toStr3(char* temp, int i);\nvoid WriteDisk(int len);\nint toInt(char* temp);\nint ReadDisk();\nvoid FSInit();\nint CreateFIle(char* fileName, int fileType);\nvoid showFileList();\nint SearchFile(char* name);\nvoid ReturnFile(int ID);\nvoid DeleteFile(int ID);\nvoid ShowMessage();\n\n```\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FdoubleZ0108%2FcherryOS","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FdoubleZ0108%2FcherryOS","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FdoubleZ0108%2FcherryOS/lists"}