java开发体系基本:放大招!为系统开发星球大战游戏程序

by admin on 2018年9月14日

眼前,我们的体系曾发展到了一定较为圆满之程度,当然最一个演习系统,它不可能同专业的windows或linux相比,但麻雀虽小五腑俱全,我们的网或能支撑用户在那个上面开发有广大犬牙交错而以幽默之应用程序的,它所展现的效应全可称得上是一个鲁棒的操作系统。

(一)

我们看第一只有意思之应用程序:不规则窗口。
众多独居特色之应用程序,一死特色之一就是是颠三倒四窗口,奇形怪状的窗体形态确实好让丁耳目一新的觉得,不规则窗口要是将窗体的有有些用透明色来呈现,现在我们便来尝试一下,在app.c中完成以下代码:

大家吓,欢迎路过晾书石。石主最近读之等同本书的王东岳先生的哲学随笔集《知鱼之乐》。

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);
    }

重新依,作者在论述文明发展之冷规律时,提到,不周到和莫安宁是更分化前衍的先决条件。他坐古希腊—古罗马—基督教文明也例,作了阐释,分析该文明在政治、经济、文化各个层面上之动荡、摇摆和分化,最终推动资本主义形态的过来。这同我们经常称的“分久必合”也多少发相通之处在。反观中国数千年文明,也是于激荡的时(春秋战国、魏晋南北向、民国)容易出现思想的萌与文武之喷涂,继而隐性地推动后续的王国奠基与建设,推动中国跻身新的开拓进取等。这也刚好若马克思主义哲学里之对立统一规律,事物发展的螺旋式上升规律。

尽管如此是绘制了图上的老三排除外星人。

苟石主认为吃咱带最好充分的启迪,是全人类要是发出尽的危机感,以一个物种的定义来应本着咱或许会见面临的各种危难,长存敬天保命之心,审时度势,通权达变,强化我们的是意识,切勿盲目自满,而成为坐井之蛙。

继之我们若想艺术让图像动起来,这即需要用及我们前面做了的定时器。首先,我们先行补充加代码,让飞机因我们按键输入以便实现左右移动,因此我们上加日下代码:

石主才德浅薄,略发粗浅解读。晾书石头非宝石,却常存书香,欢迎诸君石上留名,共享高见。欢迎关注微信公众号“晾书石”,更多美,期待跟您见面。

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

此间描绘图片描述

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图