葡京游戏网址余医生同步一步走向深渊

脚下,我们的体系已经进步至了自然较为圆满之品位,当然最一个练习系统,它不可能同正规的windows或linux相比,但麻雀虽小五腑俱全,我们的体系要会支撑用户以该上面开发有成千上万复杂而还要幽默之应用程序的,它所呈现的功能了可称得上是一个鲁棒的操作系统。

咱们看第一单有意思的应用程序:不规则窗口。
成千上万独居特色之应用程序,一那个特色有就是是怪窗口,奇形怪状的窗体形态确实好给人耳目一新的痛感,不规则窗口要是拿窗体的之一部分用透明色来显现,现在咱们就算来尝试一下,在app.c中成功以下代码:

2017年12月23日    星期六    天气晴

void main() {
    int win;
    char buf[150*70];
    win = api_openwin(buf, 150, 70, 255, "noterec");
    api_boxfilwin(win, 0, 50, 34, 69, 255);
    api_boxfilwin(win, 115, 50, 149, 69, 255);
    api_boxfilwin(win, 50, 30, 99, 49, 255);
    for (;;) {
        if (api_getkey(1) == 0x1c) {
            break;
        }
    }
    api_closewin(win);
    return;
}

余医生出生让悬壶济世的传世医家,父亲是远近闻名的乡医,家道殷实,从小聪明绝顶,眉清目秀,子承父业成为总医院主任医师,娶贤妻得女儿,日子了得和美。

地方代码先创造一个窗体,然后拿窗体的多个组成部分填充成透明色,于是窗体形态变成一个好玩的非矩形,上面代码完成后,运行起来情况如下:

可就多余医心术不正,花花肚肠贪恋美色,与同事妙龄少妇兰勾搭成奸,于是对家中贤妻百般挑剔,可怜那母女成了其婚外恋的旧货。母女俩让扫地出门孤苦伶仃,余医生只静等兰与外重新收秦晋之好。

葡京游戏网址 1

也许是兰对余医生的为人处世有所顾忌,突然中途退出回归家庭。却说这余医生志得意满,没人当外眼里瞧得上,医院里除比较他位置高的院长肯打个招呼,其余皆爱搭不理。若是回到村达到,遇见有人数犹嗤之以鼻子,恨不得别人都低头哈腰向他尽鞠躬礼。

此地描绘图片描述

却说余医生离婚成了寥寥,再回到接受前妻女不是他生性。正在他吗这么窝囊事心烦意乱、焦躁不堪时,秋成了他的及时雨。

连片下去我们再望一个再次幽默的用户程序,线团火球!在app.c中补充加代码如下:

如说立刻秋非同小但是,凭着一套狐骚气,专门靠爱人上号如名声鹊起。原先单位实际臭名昭著混不下去了,才改成余医生同事。

struct POINT {
    int x;
    int y;
};

void main() {
    int win;
    char buf[216*237];
    struct POINT table[18] = {
    {204,129},{195,90},{172,58},{137,38},{98,34},
    {61,46},{31,73},{15,110},{15,148},{31,185},
    {61,212},{98,224},{137,220},{172,200},{195,168},
    {204,129}
    };

    win = api_openwin(buf, 216, 237, -1, "bball");
    api_boxfilwin(win, 8, 29, 207, 228, 255);
    int i = 0, j = 0, dis = 0;
    for (i = 0; i <= 14; i++) {
      for(j = i+1; j <= 15; j++) {
          dis = j - i;
          if (dis >= 8) {
             dis = 15 - dis;
          }
          if (dis != 0) {
             api_linewin(win, table[i].x, table[i].y,
                         table[j].x, table[j].y, 8-dis);
          }
      }
    }

    api_refreshwin(win, 8, 29, 207, 228);
    for (;;) {
        if (api_getkey(1) == 0x1c) {
            break;
        }
    }
    api_closewin(win);

    return;    
}

熟是怎么样会察言观色的老小,余医生很快变成其猎物。正好填补了空档,余医生又美。好心人提醒过他转移招惹秋这样的“心机婊”,余医生不以为然,自以为把控秋这样的略微女儿就是区区小事。

地方代码运行后效果如下:

快快,秋和余医生结为夫妇,心怀叵测之秋之计划开始实施。余医生的舅舅是合镇长,仕途方面肯定救助得上余医生的忙碌。舅舅及余医生母亲同父异母平时事关一般没啥来往,此时此刻秋的本领充分呈现。

葡京游戏网址 2

刚遇镇医院老院长行将退居二线,余医生也试试。秋出谋划策,副镇长这样的官场资源岂然白白浪费。余医生面露难色,秋拍拍胸脯确保在其随身。

此处描绘图片描述

果然,余医生夫妇登门拜访,舅舅尽弃前嫌,大人大量热情接待。秋的三寸不烂之舌功夫发挥到最致,余医生也为了协调前程,在舅舅面前摆有极端不安的样板。

制图出的图画是未是坏惊艳,非常灿烂,我们的系统平台要蛮给力的。

话表两头。在成熟之苦心操控下,夫妇俩转性似的,变得和蔼可亲起来。尤其是直医院同事值夜班,夫妇俩尚见面准备好优质的夜宵,带及诊所里供大家享受。医生护士等得人恩惠,对这对准夫妻刮目相看。

连接下我们设放大招,开发一个妙不可言的星球大战游戏。星球大战是一律款款像素级游戏,它的形状于自己回忆早年,大概是98年,所谓电脑刚传入中华,系统要DOS时,当时达成电脑课最爱的实际上有玩而游戏。代码比较丰富,我们分实现,首先以app.c中输入以下代码:

舅舅的暗中相助,同事们的卖力推介,余医生如愿以偿坐上了直医院院长宝座。权杖到手,余医生摇身一变成为院长大人,立马恢复了原始,有过之而无不及。

#define win_width 240

void putstr(int win, char *winbuf,char * charset,
 int x, int y, int col, unsigned char *s) {
    int c, x0, i = 0, j;
    char *p, *q, t[2];
    x = x*8+8;
    y = y*16+29;
    x0 = x;
    while (s[i] != 0) {
        i++;
    }

    api_boxfilwin(win, 8, y, win_width - 8 , y+15, 0);

    q = winbuf + y * win_width; 
    t[1] = 0;
    for (;;) {
        c = *s;
        if (c == 0) {
            break;
        }

        if (c != ' ') {
            if ('a' <= c && c <= 'h') {
                p = charset + 16 * (c-'a');
                q += x;
                for (i = 0; i < 16; i++) {

                    if ((p[i] & 0x80) != 0) {q[0] = col;}
                    if ((p[i] & 0x40) != 0) {q[1] = col;}
                    if ((p[i] & 0x20) != 0) {q[2] = col;}
                    if ((p[i] & 0x10) != 0) {q[3] = col;}
                    if ((p[i] & 0x08) != 0) {q[4] = col;}
                    if ((p[i] & 0x04) != 0) {q[5] = col;}
                    if ((p[i] & 0x02) != 0) {q[6] = col;}
                    if ((p[i] & 0x01) != 0) {q[7] = col;}

                    q += win_width; 
                }
                q -= win_width * 16 + x;
            } else if((c>='i' && c <= 'z') || (c>='A' && c <= 'Z')){
                t[0] = *s;
                api_putstrwin(win, x, y, col,1,t);
            }
        }

        s++;
        x += 8;
    }

    api_refreshwin(win,  8, y, win_width - 8, y+15);
}



void main() {
    int win, i, j, ix, iy, fx;
    char winbuf[win_width * 237], invstr[32*6], s[12];
    char* p = winbuf;

    char invstr0[36] = {' ' , 'a','b','c','d',' ' ,'a','b','c','d', ' ',
                         'a','b','c','d',' ',  'a','b','c','d',' ',
                           'a','b','c','d', ' ',
                         0};

    char charset[18 * 8] = {
    0x00, 0x00, 0x00, 0x43, 0x5f, 0x5f, 0x5f, 0x7f,
    0x1f, 0x1f, 0x1f, 0x1f, 0x00, 0x20, 0x3f, 0x00,

    0x00, 0x0f, 0x7f, 0xff, 0xcf, 0xcf, 0xcf, 0xff,
    0xff, 0xe0, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0x00,

    0x00, 0xf0, 0xfe, 0xff, 0xf3, 0xf3, 0xf3, 0xff,
    0xff, 0x07, 0xff, 0xff, 0x03, 0x03, 0x03, 0x00,

    0x00, 0x00, 0x00, 0xc2, 0xfa, 0xfa, 0xfa, 0xfe,
    0xf8, 0xf8, 0xf8, 0xf8, 0x00, 0x04, 0xfc, 0x00,

    0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
    0x01, 0x43, 0x47, 0x4f, 0x5f, 0x7f, 0x7f, 0x00,

    0x18, 0x7e, 0xff, 0xc3, 0xc3, 0xc3, 0xc3, 0xff,
    0xff, 0xff, 0xe7, 0xe7, 0xe7, 0xe7, 0xff, 0x00,

    0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
    0x80, 0xc2, 0xe2, 0xf2, 0xfa, 0xfe, 0xfe, 0x00,

    0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
    0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00
    };

    win = api_openwin(winbuf, win_width, 237, -1, "invader");
    api_boxfilwin(win, 8, 29, win_width - 6, 228, 0);
    //putstr(win, winbuf, 22, 0, 7, "HIGH:00000000");

restart:
    fx = 18;
    char fly[8] = {'e', 'f', 'g', 0};
    putstr(win, winbuf, charset, 18, 11, 6, fly);

nextgroup:
    ix =  7;
    iy = 1;
    int invline = 6;
    for (i = 0; i < 3; i++) {
        for (j = 0; j < 20; j++) {
            invstr[i * 32 + j] = invstr0[j];
        }
        putstr(win, winbuf,charset, ix, iy + i, 2, invstr + i * 32);
    }


    api_refreshwin(win, 8, 29, 207, 228);

    for(;;) {
        if (api_getkey(1) == 0x1c) {
            break;
        }
    }

    api_closewin(win);

    return;
}

戏来权力之游乐,余医生在物欲横流的秋策动下狮子大开口,贪污受贿无所不能,没多长时间就钵满盆满富得流油。已经升级副县长的舅舅略发耳闻大令人担忧,主动搜索这个外甥敲警钟。尤其是蛇足大夫对前面妻女匪随便不顾这档子事,舅舅苦口婆心奉劝其至少得承受一个做父亲的责任。然而,余医生置若罔闻。

putstr函数有有限只职能,当输入字符在’a’到’h’之间常,它根据点阵表charset,通过安装有像素点的水彩来绘制图像。其中参数x,y是图像起始坐标,最后一个参数s用来决定图像绘制的办法,例如当最后之s内容为”abcd”时,该函数从charset表中取出前四行数据,其中各级一个数值还当报告代码在绘制哪一个诸如素点,它的绘图原理和早前我们讲解的怎么样绘制字符是一律的。我们事先看上面代码运行起来后的景象:

发妻女真是殊,因为缺失经济自,成绩出色的丫头连读大学为不得不无可奈何放弃。

葡京游戏网址 3

出去混迟早只要还的。水性杨花的秋不甘寂寞,在医务室里偷找年轻男同事满足自己之淫欲。那个夜晚,一值班阳医生裸着身躯虚脱在成熟之卧榻上,当班护士来紧急病情才察觉了这丑一幕。余医生大为恼火,却顾及身份和脸面,只能选择忍气吞声。

此描绘图片描述

话说余医生还是那耀武扬威,开在医院公车去老家探亲,结果受人检举。纪检部门高度重视,展开专项调查,一查触目惊心。

代码绘制了三消除外星人和同架战斗机,在main函数中,代码:

斯时的秋为了保障好自己,主动找纪检人员交代事项。如此这般,余医生的题材一清二楚,所犯罪行铁证如山。经法院起诉审判,余医生获刑六年即实施。

restart:
    fx = 18;
    char fly[8] = {'e', 'f', 'g', 0};
    putstr(win, winbuf, charset, 18, 11, 6, fly);

地牢里的余医生尝尽红颜祸水味道之还要,也得好检查自己的行为。秋这样的家不要也它们差不多操心,吃了达到寒吃生小,一个余医生倒下,千万只“余医生”在待。

绘制的饶是美术底部的战斗机,而代码有:

顶充分是多此一举大夫亲自女儿从来不得到父爱,只能借助自己微小的打工收入和母亲近……

nextgroup:
    ix =  7;
    iy = 1;
    int invline = 6;
    for (i = 0; i < 3; i++) {
        for (j = 0; j < 20; j++) {
            invstr[i * 32 + j] = invstr0[j];
        }
        putstr(win, winbuf,charset, ix, iy + i, 2, invstr + i * 32);
    }

(无防护365终端挑战日还营~第62上)

虽说是绘制了绘画上的老三免去外星人。

随着我们只要想艺术吃图像动起来,这就算得使用到我们前面做了之定时器。首先,我们事先补充加代码,让飞机因我们按键输入以便实现左右挪,因此我们上加日下代码:

void putstr(int win, char *winbuf,char * charset,
 int x, int y, int col, unsigned char *s) {
 ....
 }

 void waitting(int i, int timer, char* keyflag) {
    int j;
    if (i > 0) {
        api_settimer(timer, i);
        i = 128;
    } else {
        i = 0x1c;
    }

    for(;;) {
        j = api_getkey(1);
        if (i == j) {
            break;
        }

        if (j == 0x24) {
          //key j
            keyflag[0] = 1;
        }
        if (j == 0x25) {
            //key k
            keyflag[1] = 1;
        }
        if (j == 0x39) {
            //key space
            keyflag[2] = 1;
        }
    }

    return;
}

void main() {
    char keyflag[6];
    ....
    nextgroup:
    ....
    keyflag[0] = 0;
    keyflag[1] = 0;
    keyflag[2] = 0;

    for(;;) {
        waitting(4, timer, keyflag);
        if (keyflag[0] != 0 && fx > 1) {
           //fighter fly to left
           fx--;
           fly[0] = 'e', fly[1] = 'f', fly[2] = 'g', fly[3] = ' ';
           fly[4] = 0;
           putstr(win, winbuf, charset, fx, 11, 6, fly); 
           keyflag[0] = 0;
        }
        if (keyflag[1] != 0 && fx < 24) {
           fx++;
           fly[0] = ' ', fly[1] = 'e', fly[2] = 'f', fly[3] = 'g';
           fly[4] = 0;
           putstr(win, winbuf, charset, fx, 11, 6, fly);
           keyflag[1] = 0;
        }
    }
}

waitting
函数的来意是伺机定时器放回结果,同时监控键盘按键,如果用户以键盘上点击按键’j’,那么它通过调用api_getkey就会得对承诺扫描码,也即是0x24,
如果用户点击按键’k’,那么相应的扫描码为0x25,在main函数里,我们添加一个for循环,在其间我们调用waitting函数获取用户按键信息,当用户以下’j’后,我们拿飞机为左移动一个单位,然后刷新窗口,如果用户点击的是k,那么我们管飞机为右侧走一个单位,然后刷新窗口,上面代码完成后,编译加载到虚拟机,启动程序后,尝试以下仍键’j’,我们可发现飞机一直向左移动,知道到窗口左边界为止,效果如下:

葡京游戏网址 4

此描绘图片描述

飞机能够移动继,我们得外星人也飘飘起来,因此我们抬高如下代码:

void main () {
....
    for(;;) {
        waitting(4, timer, keyflag);
        ....
                //move aliens
        if (movewait != 0) {
            movewait--;
        } else {
            movewait = movewait0;
            if (ix + idir > 12 || ix + idir < 1) {
                if (iy + invline == 13) {
                   //game over
                   break;
                }
                idir = -idir;
                putstr(win, winbuf, charset,ix + 1, iy, 0, "  ");
                iy++;
            } else {
                ix += idir;
            }
            for (i = 0; i < invline; i++) {
                putstr(win, winbuf,charset, ix, iy + i, 2, invstr + i * 32);
            }
        } 
    }   
}

面代码先拿外星人向右侧走,直到边缘时,iy++,这就算使得外星人向下活动,与此同时idir
= -idir;
使得外星人开始倒转为移动,一直顶左边缘,这种走一直在展开,直到外星人的y坐标做够好时,游戏结束。

葡京游戏网址 5

这里描绘图片描述

打地方我们好见到,飞机活动到左手时,外星人移动及右手。接着我们只要兑现用户仍下空格键时,飞机能够发出炮弹,并且判断一旦炮弹中外星人后,外星人会见让消灭掉,这个功效的落实主要指下面代码:

for(;;) {
       if (laserwait != 0) {
            laserwait--;
            keyflag[2] = 0;
        }
        ....
       //draw laser bullet
        if (ly > 0) {
            if (ly < 8) {
                if (ix < lx && lx < ix + 25 && iy <= ly && ly < iy + invline) {
                    putstr(win, winbuf, charset, ix, ly, 2, invstr + (ly - iy) * 32);
                }//if (ix < lx ...)
                else {
                    putstr(win, winbuf, charset, lx, ly, 0, "  ");
               }
            }//if(ly < 13)
            ly--;
            if (ly > 0) {
                char c[2] = {'h', 0};
                putstr(win, winbuf,charset, lx, ly, 3, c);
            } // if(ly > 0)

            if (ix < lx && lx < ix + 25 && iy <= ly && ly < iy + invline) {
               p = invstr + (ly - iy) * 32 + (lx - ix);
               if (*p != ' ' ) {
                   //hit
                   for(p--; *p != ' '; p--) {}
                   for (i = 1; i < 5; i++) {
                       p[i] = ' ';
                   }
                  putstr(win, winbuf, charset, ix, ly, 2, invstr+(ly-iy)*32);
                  for(; invline > 0; invline--) {
                      for(p = invstr + (invline-1)*32; *p != 0; p++) {
                          if (*p != ' ') {
                              goto alive;
                          }
                      }
                  } 
            gameover:
                  //hit all 
                  movewait0 -= movewait0 / 3;
                  char gameover[12] = {'G','A','M','E',' ','O','V','E','R'};
                  putstr(win, winbuf, charset, 15, 6, 1, gameover);
                  waitting(10, timer, keyflag);

                  goto nextgroup;
            alive:
                  ly = 0;
               }
            } //if(ix < lx...)

        }//if (ly > 0)
    }
}

地方代码使得,当用户点击空格键时,程序即使准备由飞机处于放出导弹。代码有:

 if (ly > 0) {
                char c[2] = {'h', 0};
                putstr(win, winbuf,charset, lx, ly, 3, c);
            } // if(ly > 0)

它们的来意是,如果用户点击了空格,同时外星人还从来不侵犯到飞机所当的势力范围,那么我们便绘制一个打脚向上发射的炮弹,接下去的千家万户代码是,当炮弹发射后,判断炮弹是否中外星人,如果打到了,被击中的外星人要自屏幕上消失不见,这有的逻辑实现之情状如下:

葡京游戏网址 6

此处描绘图片描述

起上图可以视,黄色的竖线块就是飞机发射出的导弹,中间就排外星人给击毙了,所以于屏幕及从未有过显示出来。如果外星人下降到飞机所在高度,那么有打闹葡京游戏网址了,如果外星人全部让击毙,那么战机成功保地球,游戏也终结:

葡京游戏网址 7

此间描绘图片描述

游玩了晚,”GAME OVER”会打印至界面上,然后一切娱乐又来平等整整。

此星球大战游戏是系统基本开发到这个,我们做了之尽复杂的客户程序,它调用了几乎有api,例如窗口绘制,字符串输出,时钟,键盘监听等等,这个复杂程序的功成名就运行,在大势所趋水平达到标明,我们的系统基本具备一定水准之繁杂和鲁棒性,虽然其不行与标准操作系统同日而语,但就是她再次略,再复杂,它为对得打一个“操作系统”的称谓。

再度详细的上书与代码调试演示过程,请参考视频
Linux kernel Hacker,
从零构建好之根本

双重多技术信息,包括操作系统,编译器,面试算法,机器上,人工智能,请看管我之大众号:

葡京游戏网址 8

这边描绘图片描述