- 01
 - 02
 - 03
 - 04
 - 05
 - 06
 - 07
 - 08
 - 09
 - 10
 - 11
 - 12
 - 13
 - 14
 - 15
 - 16
 - 17
 - 18
 - 19
 - 20
 - 21
 - 22
 - 23
 - 24
 - 25
 - 26
 - 27
 - 28
 - 29
 - 30
 - 31
 - 32
 - 33
 - 34
 - 35
 - 36
 - 37
 - 38
 - 39
 - 40
 - 41
 - 42
 - 43
 - 44
 - 45
 - 46
 - 47
 - 48
 - 49
 - 50
 - 51
 - 52
 - 53
 - 54
 - 55
 - 56
 - 57
 - 58
 - 59
 - 60
 - 61
 - 62
 - 63
 - 64
 - 65
 - 66
 - 67
 - 68
 - 69
 - 70
 - 71
 - 72
 - 73
 - 74
 - 75
 - 76
 - 77
 - 78
 - 79
 - 80
 - 81
 - 82
 - 83
 - 84
 - 85
 
                        #include <iostream>
#include <stdio.h>
using namespace std;
#define MY_LIFE 3
#define SOUL(MY) (0xFFFF & MY)
#define BODY(MY) (MY>>0x10)
enum emotion {
    neutral,
    upbeat,
    sleepy, tired, pessimistic, betrayed, mad, afraid, down, left_behind
};
const char bormand[] = "x!( \"@\"!, #(&!$ $\\&!$ %('!$ &T&!  'T& $ !, %0&!$ $X&!$ #$&!$ )$& $ ";
const int p_x = 15;
const int p_y = 10;
unsigned int podushka[p_x * p_y];
unsigned int embrace(const char* a, int i) {
    unsigned int x = 0;
    for(int j = 0; j<3; ++j)
        x += (a[i+j]-0x20)<<(j*6);
    return x;
}
void make_love(int x, int y) {
    unsigned int my = podushka[x + p_x*y];
    int my_soul = SOUL(my);
    if (my_soul >= sizeof(bormand) - 3)
        return;
    int my_happiness = embrace(bormand, my_soul);
    int dx = 0;
    int dy = 0;
    switch(my_happiness & 0xFF) {
        case upbeat:
            podushka[x + y*p_x] = my_soul + MY_LIFE + ((my_happiness & 0xFFFF00)<<8);
            break;
        case sleepy:
            dx = -1; goto sleep;
        case tired:
            dx = -1; dy = -1; goto sleep;
        case left_behind:
            dx = -1; dy = 1; goto sleep;
        case mad:
            dx = 1; goto sleep;
        case betrayed:
            dx = 1; dy = -1; goto sleep;
        case afraid:
            dx = 1; dy = 1; goto sleep;
        case pessimistic:
            dy = -1; goto sleep;
        case down:
            dy = 1; goto sleep;
      sleep:podushka[(x+dx)%p_x + (y+dy)%p_y*p_x] = BODY(my) ? my - 0x10000 : my_soul + MY_LIFE;
            podushka[x + p_x*y] = my_happiness>>8;
            break;
        default:
            return;
    }
}
int main(int argc, const char * argv[]) {
    //cout<<"Bormand: \"" << bormand << "\"\n";
    podushka[8+p_x*9] = 1;
    // Test
    //print2();
    for (int t = 0; t<20; ++t) {
        for (int i = 0; i<p_x*p_y; ++i)
            make_love(i%p_x, i/p_x);
        //cout << "step: "<<t<<endl;
        //print2();
    }
    for (int j = 0; j<p_y; ++j) {
        for (int i = 0; i<p_x; ++i) {
            auto c = podushka[i+p_x*j];
            putchar((c>0x20 && c <0x7e)?(char)c:' ');
        }
        cout<<endl;
    }
    return 0;
}