C++最经典猫国建设者代码,(高仿),完美复原原游戏,好玩到停不下来

宗意蕴
2023-12-01

直接上代码

#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", "日期", "农业", "箭业", "采矿", "畜牧业", "金属加工", "行政部门", "数学", "建筑业"},
{"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;
int zz41[1010] = {};
int zz42[1010][5] = {};
int zz43[1010] = {};
int zz44;
double bohe1 = 0;
double mutou1 = 0;
double keji1 = 0;
double catli1 = 0;
double kuangwu1 = 0;
double tie1 = 0;
int cat1 = 0;
int cat2 = 0;
int bohe2 = 5000;
int mutou2 = 200;
int keji2 = 500;
int catli2 = 150;
int kuangwu2 = 250;
int tie2 = 100;
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 == 20){
		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 output43(){
	block(43, zz44);
	color(15);
	cout << "                     ";
	block(43, zz44 + 1);
	cout << "                     ";
	block(43, zz44 + 2);
	cout << "                     ";
}

void output42(int x1){
	color(15);
	block(43, x1);
	cout << "1.研发";
	zz44 = x1;
}

void output41(int y1){
	for(int i = 1; i <= 5; i++){
		if(i > shul[4]){
			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[4][shu[4][y1 + i]];
		block(25, i * 3 + 3);
		cout << "╰——————╯";
	}
}

void output4(){
	output43();
	if(shul[4] <= 5){
		output41(0);
	}else if(y < 3) {
		output41(0);
	}else if(y > shul[4] - 2){
		output41(shul[4] - 5);
	}else{
		output41(y - 3);
	}
}

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

 类似资料: