小游戏 · 17 蒟蒻的猫国建设者

xutongwei

2020-02-25 10:20:46

Relax & Ent.

v 1.2.1

最新更新:矿业

下一更新:工坊

忘记放上一次更新时间了,其实早就咕透了()

(咕透了是指没有出售,没有存档

(不会真有人不知道原版猫国建设者吧)

方向键控制,数字键确定

#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <windows.h>
#include <conio.h>
#include <bitset>
using namespace std;
#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)
#define KEY_DOWM(vk_c) (GetAsyncKeyState(vk_c)&0x8000?1:0)
void color(int a){
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a);
}
void HideCursor(){
    CONSOLE_CURSOR_INFO cursor_info = {1, 0}; 
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
void block(int x,int y){
    HANDLE   hCon;
    hCon = GetStdHandle(STD_OUTPUT_HANDLE);  
    COORD   setps;
    setps.X = x;
    setps.Y = y;
    SetConsoleCursorPosition(hCon,setps);  
}
bitset<128>pre;
bitset<128>down;
void pan(char c){
    bool hahbhchdhehfhg;
    if(c == 'w'){
        if(!KEY_DOWN(VK_UP))hahbhchdhehfhg=0;
        else hahbhchdhehfhg=1;
    }else if(c == 's'){
        if(!KEY_DOWN(VK_DOWN))hahbhchdhehfhg=0;
        else hahbhchdhehfhg=1;
    }else if(c == 'a'){
        if(!KEY_DOWN(VK_LEFT))hahbhchdhehfhg=0;
        else hahbhchdhehfhg=1;
    }else if(c == 'd'){
        if(!KEY_DOWN(VK_RIGHT))hahbhchdhehfhg=0;
        else hahbhchdhehfhg=1;
    }else if(c == '1'){
        if(!KEY_DOWN(VK_NUMPAD1) && !KEY_DOWN('1'))hahbhchdhehfhg=0;
        else hahbhchdhehfhg=1;
    }else if(c == '2'){
        if(!KEY_DOWN(VK_NUMPAD2) && !KEY_DOWN('2'))hahbhchdhehfhg=0;
        else hahbhchdhehfhg=1;
    }else if(c == '3'){
        if(!KEY_DOWN(VK_NUMPAD3) && !KEY_DOWN('3'))hahbhchdhehfhg=0;
        else hahbhchdhehfhg=1;
    }else{
        if(!KEY_DOWN(c))hahbhchdhehfhg=0;
        else hahbhchdhehfhg=1;
    }
    if(hahbhchdhehfhg)down[c]=1;
    else down[c]=0;
}
bool check(char c){
    if(down[c] != pre[c]){
        pre[c] = down[c];
        if(down[c]){
            return true;
        }
    }
    return false;
}
int heng[31] = {0, 1, 4};
int shu[31][101] = {{0},
{0, 1, 2, 3, 4},
{0, 1},
{0, 1}
};
string hengs[31] = {"0", "营火", "小村庄", "科学", "成就", "工坊", "贸易", "独角兽"};
string shus[31][101] = {{"0"}, 
{"0", "采集猫薄荷", "猫薄荷田", "锻造木头", "小屋", "图书馆", "粮仓", "矿井", "工坊"},
{"0", "伐木工", "农民", "学者", "猎人", "矿工"},
{"0", "日期", "农业", "箭业", "采矿", "畜牧业", "金属加工", "行政部门", "数学", "建筑业"}
}; 
int shus1[101] = {0, 1, 2, 3, 4, 5, 6, 7, 8};
int shus2[101] = {0, 1, 2, 3, 4, 5};
bool z1[1010];
int hengl = 2, shul[31] = {0, 4, 0, 1};
int x = 1;
int y = 1;
int zz11 = 1;
double zz12[101][5] = {{0}, {0, 0}, {0, 10}, {0, 100}, {0, 5}, {0, 25}, {0, 70}, {0, 100}, {0, 100, 400}};
int zz13[101] = {0, 0, 1, 1, 2, 2, 2, 2, 302};
string zz14[31] = {"0", "猫薄荷", "木头", "矿物"};
int zz15[101] = {0};
int zz16[101][5] = {{0}, {0, 0}, {0, 10}, {0, 100}, {0, 5}, {0, 25}, {0, 70}, {0, 100}, {0, 100, 400}};
double zz17[101]  = {0, 0, 1.12, 0, 2.5, 1.15, 1.25, 1.15, 1.15};
bool zz31[101];
int zz32[101] = {0, 30, 100, 300, 500, 500, 900};
int zz33 = 1;
int zz21[10];
int zz22 = 0;
int zz23 = 1;
double bohe1 = 0;
double mutou1 = 0;
double keji1 = 0;
double catli1 = 0;
double kuangwu1 = 0;
int cat1 = 0;
int cat2 = 0;
int bohe2 = 5000;
int mutou2 = 200;
int keji2 = 500;
int catli2 = 150;
int kuangwu2 = 250;
bool maopi1 = false;
double maopi = 0.0;
bool xiangya1 = false;
double xiangya = 0.0;
bool xinqing1 = false;
int xinqing = 100;
int tim0 = 0, tim1 = 1, tim2 = 1, tim3 = 0;
int timm1 = 0, timm2 = 0; 
string tim[5] = {"0", "春季", "夏季", "秋季", "冬季"};
bool h1 = true;

bool pai1(int x1, int y1){
    return shus1[x1] < shus1[y1];
}

bool pai2(int x1, int y1){
    return shus2[x1] < shus2[y1];
}

void output(double x){
    if(x >= 1000000){
        x /= 1000000;
        if((int)x != x){
            if((int)(x * 10) / 10.0 != x){
                printf("%.2fM", x);
            }else{
                printf("%.1fM", x);
            }
        }else{
            cout << x << "M"; 
        }
    }else if(x >= 10000){
        x /= 1000;
        if((int)x != x){
            if((int)(x * 10) / 10.0 != x){
                printf("%.2fK", x);
            }else{
                printf("%.1fK", x);
            }
        }else{
            cout << x << "K"; 
        }
    }else{
        if((int)x != x){
            if((int)(x * 10) / 10.0 != x){
                printf("%.2f", x);
            }else{
                printf("%.1f", x);
            }
        }else{
            cout << x; 
        }
    }
}

void output00(){
    int m1 = 3;
    if(xinqing1){
        color(13);
        block(1, m1);
        cout << "                    ";
        block(1, m1);
        cout << "幸福度:" << xinqing << "%";
        m1++;
    }
    color(15);
    block(1, m1);
    cout << "                    ";
    block(1, m1);
    cout << "猫薄荷:" ;
    if(bohe1 > bohe2){
        bohe1 = bohe2;
    }
    if(bohe1 >= bohe2 * 0.9){
        color(14);
    }
    output(bohe1);
    color(7);
    cout << "/";
    output(bohe2);
    m1++;
    color(15);
    block(1, m1);
    cout << "                    ";
    block(1, m1);
    cout << "木头:";
    if(mutou1 > mutou2){
        mutou1 = mutou2;
    }
    if(mutou1 >= mutou2 * 0.9){
        color(14);
    }
    output(mutou1);
    color(7);
    cout << "/";
    output(mutou2);
    m1++;
    if(zz31[4]){
        color(15);
        block(1, m1);
        cout << "                    ";
        block(1, m1);
        cout << "矿物:";
        if(kuangwu1 > kuangwu2){
            kuangwu1 = kuangwu2;
        }
        if(kuangwu1 >= kuangwu2 * 0.9){
            color(14);
        }
        output(kuangwu1);
        color(7);
        cout << "/";
        output(kuangwu2);
        m1++;
    }
    if(zz31[3]){
        color(15);
        block(1, m1);
        cout << "                    ";
        block(1, m1);
        color(12);
        cout << "猫力:";
        if(catli1 > catli2){
            catli1 = catli2;
        }
        if(catli1 >= catli2 * 0.9){
            color(14);
        }else{
            color(15);
        }
        output(catli1);
        color(7);
        cout << "/";
        output(catli2);
        m1++;
    }
    if(zz15[5] > 0){
        color(15);
        block(1, m1);
        cout << "                    ";
        block(1, m1);
        color(11);
        cout << "科技点:";
        if(keji1 > keji2){
            keji1 = keji2;
        }
        if(keji1 >= keji2 * 0.9){
            color(14);
        }else{
            color(15);
        }
        output(keji1);
        color(7);
        cout << "/";
        output(keji2);
        m1++;
    }
    if(cat2 > 0){
        color(15);
        block(1, m1);
        cout << "                    ";
        block(1, m1);
        cout << "小猫:";
        if(cat1 == cat2){
            color(14);
        }
        cout << cat1;
        color(7);
        cout << "/" << cat2;
        m1++;
    }
    if(maopi1){
        color(15);
        block(1, m1);
        cout << "                    ";
        block(1, m1);
        color(13);
        cout << "毛皮:";
        color(15);
        output(maopi);
        m1++;
    }
    if(xiangya1){
        color(15);
        block(1, m1);
        cout << "                    ";
        block(1, m1);
        color(13);
        cout << "象牙:";
        color(15);
        output(xiangya);
        m1++;
    }
}

void output01(){
    color(15);
    for(int i = 4; i <= 23; i++){
        block(20, i);
        cout << "                         ";
    }
}

void output02(){
    color(15);
    if(tim3 == 18){
        tim3 = 0;
        tim2++;
    }
    if(tim2 == 100){
        tim2 = 0;
        tim1++;
    }
    if(tim1 == 5){
        tim1 = 1;
        tim0++;
    }
    if(zz31[1]){
        block(1, 1);
        cout << "                    ";
        block(1, 1);
        cout << "第" << tim0 << "年," << tim[tim1] << "第" << tim2 << "天";
    }else{
        block(1, 1);
        cout << tim[tim1];
    }
}

void output0(){
    for(int i = 1; i <= hengl; i++){
        if(i == x){
            color(0 + 15 * 16);
        }else{
            color(15);
        }
        block(i * 8 + 20, 1);
        cout << "       |";
        block(i * 8 + 20, 1);
        cout << hengs[heng[i]];
        block(i * 8 + 20, 2);
        cout << "-------|";
    }
}

void output13(){
    block(43, zz11);
    color(15);
    cout << "                     ";
    block(43, zz11 + 1);
    cout << "                     ";
    block(43, zz11 + 2);
    cout << "                     ";
}

void output12(int x1){
    color(15);
    if(shu[1][y] == 1){
        block(43, x1);
        cout << "1.采集";
    }else if(shu[1][y] == 3){
        block(43, x1);
        cout << "1.锻造100猫薄荷";
    }else{
        block(43, x1);
        cout << "1.建造";
        int i = 1;
        while(zz12[shu[1][y]][i] != 0){
            block(49, x1 + i - 1);
            output(zz12[shu[1][y]][i]);
            cout << zz14[zz13[shu[1][y]] % (int)(pow(10, i * 2)) / (int)(pow(10, (i * 2 - 2)))];
            i++;
        }
    }
    zz11 = x1;
}

void output11(int y1){
    for(int i = 1; i <= 5; i++){
        if(i > shul[1]){
            break;
        }
        if(y1 + i == y){
            output12(i * 3 + 1);
            color(0 + 15 * 16);
        }else{
            color(15);
        }
        block(25, i * 3 + 1);
        cout << "╭——————╮";
        block(25, i * 3 + 2);
        cout << "|              |";
        block(27, i * 3 + 2);
        cout << shus[1][shu[1][y1 + i]] << "(" << zz15[shu[1][y1 + i]] << ")";
        block(25, i * 3 + 3);
        cout << "╰——————╯";
    }
}

void output1(){
    if(x != 1){
        cout << "???";
        Sleep(500);
        return;
    }
    output13();
    if(shul[1] <= 5){
        output11(0);
    }else if(y < 3) {
        output11(0);
    }else if(y > shul[1] - 2){
        output11(shul[1] - 5);
    }else{
        output11(y - 3);
    }
}

void output31(int x3, int y3){
    if(x3 == y){
        block(43, x3 * 3 + 1);
        if(zz31[shu[3][y3]]){
            cout << "已研发";
        }else{
            cout << "1.研发"; 
            output(zz32[shu[3][y3]]);
            cout << "科技点";
        }
        color(0 + 15 * 16);
        zz33 = x3 * 3 + 1;
    }else{
        color(15);
    }
    block(25, x3 * 3 + 1);
    cout << "╭——————╮";
    block(25, x3 * 3 + 2);
    cout << "|              |";
    block(27, x3 * 3 + 2);
    cout << shus[3][shu[3][y3]];
    block(25, x3 * 3 + 3);
    cout << "╰——————╯";
}

void output3(){
    color(15);
    block(43, zz33);
    cout << "                       ";
    int x3 = 1;
    for(int i = 1; i <= shul[3]; i++){
        output31(x3, i);
        x3++;
    }
}

void output2(){
    color(15);
    block(43, zz23);
    cout << "                       ";
    block(43, zz23 + 1);
    cout << "                       ";
    block(43, zz23 + 2);
    cout << "                       ";
    for(int i = 1; i <= shul[2]; i++){
        if(i == y){
            block(43, i * 3 + 1);
            cout << "1.加";
            block(43, i * 3 + 2);
            cout << "2.减";
            if(shu[2][i] == 4){
                block(43, i * 3 + 3);
                cout << "3.派出猎人";
                if(catli1 > 199){
                    cout << "×" << (int)(catli1 / 100);
                }
            }
            color(0 + 15 * 16);
            zz23 = i * 3 + 1;
        }else{
            color(15);
        }
        block(25, i * 3 + 1);
        cout << "╭——————╮";
        block(25, i * 3 + 2);
        cout << "|              |";
        block(27, i * 3 + 2);
        cout << shus[2][shu[2][i]] << "(" << zz21[shu[2][i]] << ")";
        block(25, i * 3 + 3);
        cout << "╰——————╯";
    }
}

void output_1(){
    if(heng[x] == 1){
        output1();
    }else if(heng[x] == 3){
        output3();
    }else if(heng[x] == 2){
        output2();
    }
}

int main( ){
    system("mode con cols=70 lines=25");
    color(15);
    HideCursor();
    Sleep(1500);
    cout << "欢迎来到(高仿版)猫国建设者!" << endl;
    Sleep(1000);
    cout << "   //本游戏原型为 https://likexia.gitee.io/cat-zh#/" << endl;
    Sleep(500);
    cout << "   //本游戏由XTW蒟蒻编制而成" << endl;
    Sleep(500);
    cout << endl << "请按任意键继续……";
    char zzzzzzzzzzzzzzzzzzzz = getch();
    system("cls");
    output0();
    output00();
    output1();
    while(true){
        output00();
        output02();
        pan('w');
        pan('s');
        pan('a');
        pan('d');
        pan('1');
        pan('2');
        pan('3');
        if(check('w')){
            if(y > 0){
                y--;
                output_1();
            }
        }else if(check('s')){
            if(y < shul[heng[x]]){
                y++;
                output_1();
            }
        }else if(check('a')){
            if(y == 0 && x > 1){
                x--;
                output0();
                output01();
                output_1();
            }
        }else if(check('d')){
            if(y == 0 && x < hengl){
                x++;
                output0();
                output01();
                output_1();
            }
        }else if(check('1')){
            if(heng[x] == 1){
                if(shu[1][y] == 1){
                    bohe1 += 1;
                }else if(shu[1][y] == 3){
                    if(bohe1 >= 100){
                        bohe1 -= 100;
                        mutou1 += 1;
                    }
                }else{
                    h1 = true;
                    int i = 1;
                    while(zz12[shu[1][y]][i] != 0){
                        if(zz13[shu[1][y]] % (int)(pow(10, i * 2)) / (int)(pow(10, (i * 2 - 2))) == 1){
                            if(bohe1 < zz12[shu[1][y]][i]){
                                h1 = false;
                                break;
                            }
                        }else if(zz13[shu[1][y]] % (int)(pow(10, i * 2)) / (int)(pow(10, (i * 2 - 2))) == 2){
                            if(mutou1 < zz12[shu[1][y]][i]){
                                h1 = false;
                                break;
                            }
                        }else if(zz13[shu[1][y]] % (int)(pow(10, i * 2)) / (int)(pow(10, (i * 2 - 2))) == 3){
                            if(kuangwu1 < zz12[shu[1][y]][i]){
                                h1 = false;
                                break;
                            }
                        }else{
                            block(1, 19);
                            cout << zz13[shu[1][y]] % (int)(pow(10, i * 2)) / (int)(pow(10, (i * 2 - 2)));
                            cout << "?????";
                            Sleep(1500);
                        }
                        i++;
                    }
                    if(h1){
                        i = 1;
                        while(zz12[shu[1][y]][i] != 0){
                            if(zz13[shu[1][y]] % (int)(pow(10, i * 2)) / (int)(pow(10, (i * 2 - 2))) == 1){
                                zz15[shu[1][y]]++;
                                bohe1 -= zz12[shu[1][y]][i];
                                zz12[shu[1][y]][i] = (int)(pow(zz17[shu[1][y]], zz15[shu[1][y]]) * zz16[shu[1][y]][i] * 100 + 0.5) / 100.0;
                            }else if(zz13[shu[1][y]] % (int)(pow(10, i * 2)) / (int)(pow(10, (i * 2 - 2))) == 2){
                                zz15[shu[1][y]]++;
                                mutou1 -= zz12[shu[1][y]][i];
                                zz12[shu[1][y]][i] = (int)(pow(zz17[shu[1][y]], zz15[shu[1][y]]) * zz16[shu[1][y]][i] * 100 + 0.5) / 100.0;
                            }else if(zz13[shu[1][y]] % (int)(pow(10, i * 2)) / (int)(pow(10, (i * 2 - 2))) == 3){
                                zz15[shu[1][y]]++;
                                kuangwu1 -= zz12[shu[1][y]][i];
                                zz12[shu[1][y]][i] = (int)(pow(zz17[shu[1][y]], zz15[shu[1][y]]) * zz16[shu[1][y]][i] * 100 + 0.5) / 100.0;
                            }
                            i++;
                        }
                        if(shu[1][y] == 4){
                            cat2 += 2;
                            catli2 += 75;
                            if(!z1[1]){
                                hengl++;
                                heng[2] = 2;
                                heng[3] = 4;
                                shul[2] = 1;
                                z1[1] = true;
                                shul[1]++;
                                shu[1][5] = 5;
                                output0();
                            }
                        }else if(shu[1][y] == 5){
                            keji2 += 250;
                            if(!z1[2]){
                                hengl++;
                                heng[3] = 3;
                                heng[4] = 4;
                                shu[2][2] = 3;
                                shul[2]++;
                                z1[2] = true;
                            }
                        }else if(shu[1][y] == 6){
                            bohe2 += 5000;
                            mutou2 += 200;
                            kuangwu2 += 250;
                        }else if(shu[1][y] == 7){
                            if(!z1[3]){
                                shul[2]++;
                                shu[2][shul[2]] = 5;
                                sort(shu[2] + 1, shu[2] + shul[2] + 1, pai2);
                                shul[1]++;
                                shu[1][shul[1]] = 8;
                                sort(shu[1] + 1, shu[1] + shul[1] + 1, pai1);
                                z1[3] = true;
                            }
                        }
                    }
                }
                output1();
            }else if(heng[x] == 2){
                if(zz22 > 0){
                    zz21[shu[2][y]]++;
                    zz22--;
                    output2();
                }
            }else if(heng[x] == 3){
                if(keji1 >= zz32[shu[3][y]]){
                    zz31[shu[3][y]] = true;
                    keji1 -= zz32[shu[3][y]];
                    if(shu[3][y] == 1){
                        shul[3] = 1;
                        shu[3][1] = 2;
                        output_1();
                    }else if(shu[3][y] == 2) {
                        shul[3] = 2;
                        shu[3][1] = 3;
                        shu[3][2] = 4;
                        shu[2][2] = 2;
                        shu[2][3] = 3;
                        shul[2]++;
                        shul[1]++;
                        shu[1][6] = 6;
                    }else if(shu[3][y] == 3){
                        shu[3][y] = 5;
                        shul[2]++;
                        shu[2][shul[2]] = 4;
                        sort(shu[2] + 1, shu[2] + 1 + shul[2], pai2);
                        xinqing1 = true;
                    }else if(shu[3][y] == 4){
                        shu[3][y] = 6;
                        shul[1]++;
                        shu[1][shul[1]] = 7;
                        sort(shu[1] + 1, shu[1] + 1 + shul[1], pai1);
                    }
                    output3();
                }
            }
        }else if(check('2')){
            if(heng[x] == 1){

            }else if(heng[x] == 2){
                if(zz21[shu[2][y]] > 0){
                    zz21[shu[2][y]]--;
                    zz22++;
                    output2();
                }
            }
        }else if(check('3')){
            if(heng[x] == 1){

            }else if(heng[x] == 2){
                if(shu[2][y] == 4 && catli1 >= 100){
                    catli1 -= 100;
                    srand(time(NULL));
                    int sui1 = (rand() % 2001) + 3000;
                    int sui2 = (rand() % 1001);
                    int sui3 = (rand() % 3);
                    maopi1 = true;
                    maopi += sui1 / 100.0;
                    if(sui3 == 0){
                        xiangya1 = true;
                        xiangya += sui2 / 100.0; 
                    }
                }
            }
        }
        if(tim1 == 1){
            bohe1 += zz15[2] * 0.063 * 1.5;
        }else if(tim1 == 4){
            bohe1 += zz15[2] * 0.063 * 0.25;
        }else{
            bohe1 += zz15[2] * 0.063;
        }
        bohe1 -= cat1 * 0.4; 
        mutou1 += zz21[1] * 0.009 * xinqing / 100;
        bohe1 += zz21[2] * 0.5 * xinqing / 100;
        keji1 += zz21[3] * 0.0175 * (1 + 0.1 * zz15[5]) * xinqing / 100;
        catli1 += zz21[4] * 0.03 * xinqing / 100;
        kuangwu1 += zz21[5] * 0.025 * (1 + 0.2 * zz15[7]) * xinqing / 100;
        if(maopi > 0){
            maopi -= cat1 * 0.005;
            if(maopi < 0){
                maopi = 0;
            }
        }
        if(xiangya > 0){
            xiangya -= cat1 * 0.0035;
            if(xiangya < 0){
                xiangya = 0;
            }
        }
        if(!xinqing1 && cat1 > 4){
            xinqing1 = true;
        }
        xinqing = 100 - max(cat1 * 2 - 10, 0);
        if(maopi > 0){
            xinqing += 10;
        }
        if(xiangya > 0){
            xinqing += 10;
        }
        if(bohe1 <= 0 && cat1 > 0){
            timm2 = 0;
            bohe1 = 0;
            timm1++;
            if(timm1 == 54){
                cat1--;
                if(zz22 <= 0){
                    for(int i = 1; i <= shul[2]; i++){
                        if(zz21[shu[2][i]] > 0){
                            zz21[shu[2][i]]--;
                            break; 
                        }
                    }
                }else{
                    zz22--;
                }
                timm1 = 0;
            }
        }else{
            timm1 = 0;
            if(cat2 > cat1){
                timm2++;
                if(timm2 == 108){
                    cat1++;
                    zz22++;
                    timm2 = 0;
                }
            }
        }
        if(z1[30] == 0 && cat2 >= 8){
            hengs[2] = "村庄";
            z1[30]++;
        }
        Sleep(100);
        tim3++;
    }
    return 0;
}