目录
操作系统课程设计文档 1
项目设计与功能说明文档 1
一. 项目描述 2

  1. 项目目的 2
  2. 开发环境 2
  3. 项目完成指标 3
    一. 功能说明 3
  4. 图形化界面 3
  5. 开机动画 4
  6. 图片显示 4
  7. 进程管理 5
  8. 文件系统 6
    5.1 显示文件列表 6
    5.2 创建文件 7
    5.3 删除文件/文件夹 7
    5.4 写文件 8
    5.5 读文件 8
    5.6 创建目录 9
    5.6 进入多级目录 10
  9. 游戏 10
    6.1 2048 10
    6.2 flappybird 11
    三. 核心代码 12
  10. print_char() 12
  11. GoDir() 14
    鸟死亡 16
    四. 成员分工 17
    2.开发环境
    1.Ubuntu 16.04
    2.Bochs 模拟器

3.项目完成指标
本次操作系统课程设计小组成员为 3 人,基于《Orange’s⼀个操作系统的实现》,通过修改或重新实现源码的一个或多个模块来实现一个简单得操作系统。
本次课程设计主要实现了图形化,对外设管理部分进行重新实现,实现了 B 级项目难度;同时对文件系统进行修改,支持多级文件系统,实现了 B 级难度; 并实现了显示图片和保存图片等系统级应用,实现了 C 级难度;最后在图形化的基础上实现了一个图形化的小游戏,完成了 D 级难度。
一. 功能说明
1.图形化界面
本系统修改了外设显卡部分,使系统支持图形化界面,但由于时间精力有限, 我们的主要界面仍然是命令行的形式,但是命令行中所有的文字都是使用像素点拼凑的形式展现出来的,同时在图形化的基础上实现了开机动画,图片显示,以及一个小游戏。


#include "type.h"
#include "stdio.h"
#include "const.h"
#include "protect.h"
#include "string.h"
#include "fs.h"
#include "proc.h"
#include "tty.h"
#include "console.h"
#include "global.h"
#include "proto.h"/*======================================================================*//* global variable of game Tictactoe */
int tmpQP[3][3]; //表示棋盘数据的临时数组,其中的元素0表示该格为空,
//1表示计算机放下的子,-1表示人放下的子。#define MAX_NUM 1000//扩展生成状态节点的最大数目
const int NO_BLANK=-1001; //表示没有空格
const int TREE_DEPTH=3; //搜索树的最大深度,如果增加此值可以提高计算机的“智力”,
//但同时也需要增加MAX_NUM的值。
const int NIL=1001;    //表示空
static int s_count;     //用来表示当前分析的节点的下标struct State//该结构表示棋盘的某个状态,也可看做搜索树中的一个节点
{int QP[3][3]; //棋盘格局int e_fun; //当前状态的评估函数值int child[9]; //儿女节点的下标int parent; //双亲节点的下标int bestChild; //最优节点(评估函数值最大)的儿女节点下标
}States[MAX_NUM]; //用来保存搜索树中状态节点的数组void Init()   //初始化函数,当前的棋盘格局总是保存在States[0]中
{int i,j;s_count=0;for(i=0;i<3;i++)for(j=0;j<3;j++)States[0].QP[i][j]=0; //将棋盘清空States[0].parent=NIL;   //初始节点没有双亲节点
}void PrintQP() //打印当棋盘格局的函数
{int i,j;for(i=0;i<3;i++){for(j=0;j<3;j++)if (States[0].QP[i][j] == -1){printf("%c       ",1);}else if (States[0].QP[i][j] == 1){printf("%c       ",2);}else{printf("%d       ",0);}printf("\n");}
}int IsWin(struct State s) //有人赢了吗?返回0表示没有人赢,返回-1表示人赢了,返回1表示计算机赢了
{int i,j;for(i=0;i<3;i++){if(s.QP[i][0]==1&&s.QP[i][1]==1&&s.QP[i][2]==1)return 1;if(s.QP[i][0]==-1&&s.QP[i][1]==-1&&s.QP[i][2]==-1)return -1;}for(i=0;i<3;i++){if(s.QP[0][i]==1&&s.QP[1][i]==1&&s.QP[2][i]==1)return 1;if(s.QP[0][i]==-1&&s.QP[1][i]==-1&&s.QP[2][i]==-1)return -1;}if((s.QP[0][0]==1&&s.QP[1][1]==1&&s.QP[2][2]==1)||(s.QP[2][0]==1&&s.QP[1][1]==1&&s.QP[0][2]==1))return 1;if((s.QP[0][0]==-1&&s.QP[1][1]==-1&&s.QP[2][2]==-1)||(s.QP[2][0]==-1&&s.QP[1][1]==-1&&s.QP[0][2]==-1))return -1;return 0;
}int e_fun(struct State s)//评估函数
{int flag=1;int i,j;for(i=0;i<3;i++)for(j=0;j<3;j++)if(s.QP[i][j]==0)flag= FALSE;if(flag)return NO_BLANK;if(IsWin(s)==-1)return -MAX_NUM;//如果计算机输了,返回最小值if(IsWin(s)==1)return MAX_NUM;//如果计算机赢了,返回最大值int count=0;//该变量用来表示评估函数的值//将棋盘中的空格填满自己的棋子,既将棋盘数组中的0变为1for(i=0;i<3;i++)for(j=0;j<3;j++)if(s.QP[i][j]==0)tmpQP[i][j]=1;else tmpQP[i][j]=s.QP[i][j];//电脑一方//计算每一行中有多少行的棋子连成3个的for(i=0;i<3;i++)count+=(tmpQP[i][0]+tmpQP[i][1]+tmpQP[i][2])/3;//计算每一列中有多少列的棋子连成3个的for(i=0;i<3;i++)count+=(tmpQP[0][i]+tmpQP[1][i]+tmpQP[2][i])/3;//斜行有没有连成3个的?count+=(tmpQP[0][0]+tmpQP[1][1]+tmpQP[2][2])/3;count+=(tmpQP[2][0]+tmpQP[1][1]+tmpQP[0][2])/3;//将棋盘中的空格填满对方的棋子,既将棋盘数组中的0变为-1for(i=0;i<3;i++)for(j=0;j<3;j++)if(s.QP[i][j]==0)tmpQP[i][j]=-1;else tmpQP[i][j]=s.QP[i][j];//对方//计算每一行中有多少行的棋子连成3个的for(i=0;i<3;i++)count+=(tmpQP[i][0]+tmpQP[i][1]+tmpQP[i][2])/3;//计算每一列中有多少列的棋子连成3个的for(i=0;i<3;i++)count+=(tmpQP[0][i]+tmpQP[1][i]+tmpQP[2][i])/3;//斜行有没有连成3个的?count+=(tmpQP[0][0]+tmpQP[1][1]+tmpQP[2][2])/3;count+=(tmpQP[2][0]+tmpQP[1][1]+tmpQP[0][2])/3;return count;
}//计算机通过该函数决定走哪一步,并对当前的棋局做出判断。
int AutoDone()
{intMAX_F=NO_BLANK, //保存对自己最有利的棋局(最大)的评估函数值parent=-1, //以当前棋局为根生成搜索树,所以当前棋局节点无双亲节点count,   //用来计算当前生成的最后一个扩展节点的下标tag;   //标示每一层搜索树中最后一个节点的下标intmax_min=TREE_DEPTH%2, //标识取下一层评估函数的最大值还是最小值?//max_min=1取下一层中的最大值,max_min=0取最小值IsOK=FALSE;    //有没有找到下一步落子的位置?s_count=0;   //扩展生成的节点数初始值为0if(IsWin(States[0])==-1)//如果人赢了{printf("Conguatulations! You Win! GAME OVER.\n");return TRUE;}int i,j,t,k,i1,j1;for(t=0;t<TREE_DEPTH;t++)//依次生成各层节点{count=s_count;//保存上一层节点生成的最大下标for(k=parent+1;k<=count;k++)//生成一层节点{int n_child=0;//该层节点的孩子节点数初始化为0for(i=0;i<3;i++)for(j=0;j<3;j++)if(States[k].QP[i][j]==0)//如果在位置(i,j)可以放置一个棋子{       //则s_count++;    //生成一个节点,节点数(最大下标)数加1for(i1=0;i1<3;i1++) //该3×3循环将当前棋局复制到新节点对应的棋局结构中for(j1=0;j1<3;j1++)States[s_count].QP[i1][j1]=States[k].QP[i1][j1];States[s_count].QP[i][j]=t%2==0?1:-1;//根据是人下还是计算机下,在空位上落子States[s_count].parent=k;   //将父母节点的下标k赋给新生成的节点States[k].child[n_child++]=s_count; //下标为k的父母节点有多了个子女//如果下一步有一步期能让电脑赢,则停止扩展节点,转向结局打印语句if(t==0&&e_fun(States[s_count])==MAX_NUM){States[k].e_fun=MAX_NUM;States[k].bestChild=s_count;//最好的下一步棋所在的节点的下标为s_countgoto L2;}}}parent=count;   //将双亲节点设置为当前双亲节点的下一层节点
//      printf("%d\n",s_count); //打印生成节点的最大下标}tag=States[s_count].parent;//设置最底层标志,以便从下到上计算最大最小值以寻找最佳解路径。int pos_x,pos_y;//保存计算机落子的位置for(i=0;i<=s_count;i++){if(i>tag) //保留叶节点的评估函数值{States[i].e_fun=e_fun(States[i]);}else //抹去非叶节点的评估函数值States[i].e_fun=NIL;}while(!IsOK)//寻找最佳落子的循环{for(i=s_count;i>tag;i--){if(max_min)//取子女节点的最大值{if(States[States[i].parent].e_fun<States[i].e_fun||States[States[i].parent].e_fun==NIL){States[States[i].parent].e_fun=States[i].e_fun; //设置父母节点的最大最小值States[States[i].parent].bestChild=i;   //设置父母节点的最佳子女的下标}}else//取子女节点的最小值{if(States[States[i].parent].e_fun>States[i].e_fun||States[States[i].parent].e_fun==NIL){States[States[i].parent].e_fun=States[i].e_fun; //设置父母节点的最大最小值States[States[i].parent].bestChild=i;   //设置父母节点的最佳子女的下标}}}s_count=tag; //将遍历的节点上移一层max_min=!max_min; //如果该层都是MAX节点,则它的上一层都是MIN节点,反之亦然。if(States[s_count].parent!=NIL)//如果当前遍历的层中不包含根节点,则tag标志设为上一层的最后一个节点的下标tag=States[s_count].parent;elseIsOK=TRUE; //否则结束搜索}int x,y;
L2: //取落子的位置,将x,y坐标保存在变量pos_x和pos_y中,并将根(当前)节点中的棋局设为最佳儿子节点的棋局for(x=0;x<3;x++){for(y=0;y<3;y++){if(States[States[0].bestChild].QP[x][y]!=States[0].QP[x][y]){pos_x=x;pos_y=y;}States[0].QP[x][y]=States[States[0].bestChild].QP[x][y];}}MAX_F=States[0].e_fun;//cout<<MAX_F<<endl;printf("The computer put a Chessman at: %d,%d\nThe QP now is:\n",pos_x+1,pos_y+1);PrintQP();if(MAX_F==MAX_NUM) //如果当前节点的评估函数为最大值,则计算机赢了{printf("The computer WIN! You LOSE! GAME OVER.\n");return TRUE;}if(MAX_F==NO_BLANK) //否则,如果棋盘时候没空可放了,则平局。{printf("DRAW GAME!\n");return TRUE;}return FALSE;
}//用户通过此函数来输入落子的位置,
//比如,用户输入31,则表示用户在第3行第1列落子。
void UserInput(int fd_stdin,int fd_stdout)
{int n;int pos = -1,x,y;char szCmd[80]={0};
L1: printf("Please Input The Line Position where you put your Chessman (x): ");n = read(fd_stdin,szCmd,80);szCmd[1] = 0;atoi(szCmd,&x);printf("Please Input The Column Position where you put your Chessman (y): ");n = read(fd_stdin,szCmd,80);szCmd[1] = 0;atoi(szCmd,&y);if(x>0&&x<4&&y>0&&y<4&&States[0].QP[x-1][y-1]==0)States[0].QP[x-1][y-1]=-1;else{printf("Input Error!");goto L1;}}void TTT(int fd_stdin,int fd_stdout)
{char buf[80]={0};char IsFirst = 0;int IsFinish = FALSE;while(!IsFinish){Init();printf("The QiPan (QP) is: \n");PrintQP();printf("Do you want do first?(y/n):");read(fd_stdin,buf,2);IsFirst = buf[0];do{if(IsFirst=='y'){UserInput(fd_stdin, fd_stdout);IsFinish=AutoDone();}else{IsFinish=AutoDone();if(!IsFinish)UserInput(fd_stdin, fd_stdout);}}while(!IsFinish);if (IsFinish){printf("Play Again?(y/n)");char cResult;read(fd_stdin,buf,2);cResult = buf[0];printf("%c",cResult);if (cResult == 'y'){clear();IsFinish = FALSE;}else{clear();}}}}












基于Ubuntu+Bochs模拟器实现的操作系统图形化的小游戏(2048、flappybird、)相关推荐

  1. 基于stm32、0.96寸OLED实现的俄罗斯方块小游戏(详细源码注释)

    概述:本实验基于stm32最小系统.0.96寸OLED(68*128)和摇杆实现一个经典的俄罗斯方块小游戏.项目源码地址:点击下载. 硬件要求: 普通摇杆,两个电位器和一个开关组成,左右摇动控制一个电 ...

  2. 基于cocoCreator版本2.4.5整理一款2D小游戏快速开发的游戏框架

    前言:基于cocoCreator版本2.4.5整理一款2D小游戏快速开发的游戏框架. 一.cocosCreator的UI框架. 中心思想, 将所有的UI窗体分为3类管理(1级窗体, 2级窗体, 3级窗 ...

  3. 基于STL实现自动贪心寻路算法的贪吃蛇小游戏

    基于STL实现自动贪心寻路算法的贪吃蛇小游戏 写贪吃蛇小游戏的想法来自CometOJ-Contest#13的B题,当时用STL双端队列维护蛇身的时候觉得非常方便,现在用EasyX图形库实现一下. 运行 ...

  4. 基于Ubuntu安装opencv以及相关操作

    目录 一.基于Ubuntu下安装opencv 二.相关操作之图片 三.相关操作之视屏 四.总结 五.参考资料 一.基于Ubuntu下安装opencv 1.opencv依赖环境的安装 1.1 安装cma ...

  5. 基于声网 Flat 实现“成语解谜”的 Web 小游戏

    前言 本文作者赵杭天.他参加了"2022 RTE(Real-time Engagement,实时互动) 编程挑战赛"--"赛道二 场景化白板插件应用开发" , ...

  6. 动手实践丨基于ModelAtrs使用A2C算法制作登月器着陆小游戏

    摘要:在本案例中,我们将展示如何基于A2C算法,训练一个LunarLander小游戏. 本文分享自华为云社区<使用A2C算法控制登月器着陆>,作者:HWCloudAI . LunarLan ...

  7. 基于phaser引擎的JS打飞机闯关答题小游戏

    目录标题 游戏设计逻辑 游戏截图 开源项目下载 源代码 游戏设计逻辑 主要是基于phaser游戏引擎做的打飞机游戏为主的闯关答题小游戏.通过打飞机获得积分,根据积分的多少设置了不同关卡,关卡的敌人难度 ...

  8. centos7操作系统图形化界面和命令行界面切换

    centos7操作系统 由图形化界面切换到命令行界面:ctrl+alt+f2+(fn) 由命令行界面切换到图形化界面:ctrl+alt+f1+(fn) 如果是笔记本电脑,输入上述命令时记得加上fn,即 ...

  9. 【Python游戏】Python基于pygame实现的人机大战的斗兽棋小游戏 | 附源码

    前言 有粉丝说要我出一期Python版本的斗兽棋,今天宠粉狂魔的我不就来啦!! 虽然是一个简单的小游戏,但是对于新手小伙伴来说还是有一定的小难度的哟!要是不理解都可以找到小编的哈!! 相关文件 关注小 ...

最新文章

  1. Fault,Error与Failure的联系与区别
  2. 如何轻松应对DNS劫持
  3. 关于使用mail命令产生:-bash: mail: command not found的解决方法
  4. vo生成MySQL表_跟我学微服务统一开发平台-代码生成器
  5. liferay form 小案例
  6. C# Weifenluo教程
  7. 6park留园 android,‎App Store 上的“掌上留园-6park”
  8. 卡尔曼滤波,高斯函数
  9. thinkpad重装系统不引导_不重装系统修改引导方式为UEFI模式
  10. Linux 文件系统(二)---执行过程及结构间的关系
  11. Java创建型设计模式之简单工厂,工厂方法,抽象工厂
  12. 玩游戏显示计算机内存不足怎么办,电脑魔兽世界内存不足怎么办
  13. win10安装wireshark经常报“KB2999226 和 KB3118401”补丁未安装的问题
  14. 内存映射技术(共享内存)
  15. 电机驱动软件学习笔记——ADC采样电流、温度、按键值
  16. scratch小游戏2048
  17. css 细线表格,如何在Dreamweaver中制作细线表格?
  18. Thinkpad R400待机后自动唤醒的解决办法
  19. Cookie--防劫持的处理
  20. 深度学习秋招面试题集锦(一)

热门文章

  1. 基于MATLAB的GMSK调制解调系统的设计仿真
  2. 联想拯救者R720加装固态硬盘过程中遇到的小问题
  3. py语言和php,php和python什么区别
  4. 基于OpenXR,Collabora推开源VI-SLAM AR/VR定位系统
  5. 卷积神经网络分类实战
  6. JQuery加载图片自适应DIV大小
  7. 如何打开计算机任务管理器,电脑任务管理器怎么打开
  8. 软件架构中的层次依赖
  9. Manjaro通过deepin/Arch库安装Tim出现版本太低无法登录问题[解决]
  10. php7.2.3下载,最新PHP编程软件v7.3.2.0 官方版下载地址电脑版-锐品软件