引子
我们的沙盒游戏也是更新正式版了,来看看我们的游戏的性能吧!
本游戏2.0.0版本删除了从最开始的0.01(1代1.0)到1.9.5版本都一直存在的闪屏BUG,在完善更新过程中,增加了各种方块元素。同时,在1.8版本更新了大地图和地形等元素,在1.7和1.9、2.0版本均有树木元素,在1.9及后续版本的csh函数模块中含有树木刷新大小模块等系统。
运行效果
代码展示
以下是游戏代码:
#include <bits/stdc++.h>//dev专属 VC不用
#include <windows.h>
using namespace std;
bool axj(long long key);//侦测按键
void yanse(long long n);//颜色
const long long ESC = 27,
Enter = 13,
Tab = 9,//tab
Shang = 38,Xia = 40,Zuo = 37,You = 39,
Kong = ' ',//空格
z_sb = VK_LBUTTON,//鼠标左键
y_sb = VK_RBUTTON,//鼠标右键
Shift = VK_SHIFT,z_Shift = VK_LSHIFT,y_Shift = VK_RSHIFT,//SHIFT
Ctrl = VK_CONTROL,z_Ctrl = VK_LCONTROL,y_Ctrl = VK_RCONTROL,//Ctrl
Alt = VK_MENU,z_Alt = VK_LMENU,y_Alt = VK_RMENU,//alt
A = 'A',B = 'B',C = 'C',D = 'D',E = 'E',F = 'F',G = 'G',H = 'H',I = 'I',J = 'J',K = 'K',L = 'L',M = 'M',N = 'N',O = 'O',P = 'P',Q = 'Q',R = 'R',S = 'S',T = 'T',U = 'U',V = 'V',W = 'W',X = 'X',Y = 'Y',Z = 'Z';
bool axj(long long key){return (GetKeyState(key) < 0);}
void yanse(long long n){SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), n);return;}
string name;/*名字*/
long long sj,die,hp,dt[8000][256],sdf1 = 8,sdf2 = 8,fx,bag[100],szt,gzt,slsh,bjx,bjy,R_hand = 0,scc,sck;
void color(long long a){SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a);}
struct MOB{string u1,u2,d1,d2;long long hp,u1c,u2c,d1c,d2c;};
struct BLOCK{string u1,u2,d1,d2;long long ph,u1c,u2c,d1c,d2c;string name;};
BLOCK block[] ={//方块数据{第一像素,第二像素,第三像素,第四像素,碰撞箱,颜色号}
{" "," "," "," ",0,0,0,0,0," 空 "},//空气0
{"■","■","■","■",1,120,120,120,120," 石头 "},//石头1
{"▓","▓","▓","▓",0,25,25,25,25," 水方块 "},//水2
{"■","■","■","■",1,15,15,15,15," 圆石 "},//圆石3
{"■","■","■","■",1,162,162,102,102," 草块 "},//草4
{"■","■","■","■",1,102,102,102,102," 土块 "},//土5
{"■","■","■","■",0,68,68,68,68,"岩浆方块"},//岩浆6
{"▓","▓","▓","▓",1,110,110,110,110,"松树原木"},//木头7
{"▓","▓","▓","▓",0,147,147,147,147,"松树树叶"},//树叶8
{"■","■","■","■",1,248,143,143,248," 深板岩 "},//深板岩9
{"▓","▓","▓","▓",0,15,15,15,15," 细雪块 "},//雪10
{"▓","▓","▓","▓",1,120,120,120,120,"基岩方块"},//基岩11
{" "," ","__","__",0,15,15,15,15," 薄雪 "},//雪12
{"▓","▓","▓","▓",1,110,110,110,110,"果树原木"},//木头13
{"▓","▓","▓","▓",0,162,162,162,162,"果树树叶"},//树叶14
};
void muzic_die(){ //死亡画面
cout << " 你死了\n" << " " << name << "死于:";
if(die == 1){cout << "岩浆\n";}else if(die == 4){cout << name<<"从高空一跃而下\n";}else{cout << "死了\n";}
Sleep(1000); hp = 10;dt[sdf1][sdf2] = 0;}
void gotoxy(int y,int x){ COORD pos; pos.X=x; pos.Y=y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos); } //?行?列
void sc(){ //输出
int flag1 = -1,flag2;
for(long long i = sdf1 - 7; i < sdf1 + 7; i++){
flag1 ++;
flag2 = -2;
for(long long j = sdf2 - 7; j < sdf2 + 7; j++){
flag2 += 2;
gotoxy(flag1 * 2 - 1,flag2);
if(i == sdf1&&j == sdf2){
color(15);
if(fx == 'w'){cout << "上";flag2 += 2;gotoxy(flag1 * 2 - 1,flag2);cout << "玩";
}else if(fx == 's'){cout << "下";flag2 += 2;gotoxy(flag1 * 2 - 1,flag2);cout << "玩";
}else if(fx == 'a'){cout << "左";flag2 += 2;gotoxy(flag1 * 2 - 1,flag2);cout << "玩";
}else if(fx == 'd'){cout << "右";flag2 += 2;gotoxy(flag1 * 2 - 1,flag2);cout << "玩";}
}else{
if(dt[i][j] == 4 && dt[i - 1][j] == 12){
color(127);
cout << block[dt[i][j]].u1;flag2 += 2;gotoxy(flag1 * 2 - 1,flag2);
color(127);
cout << block[dt[i][j]].u2;
}else{
color(block[dt[i][j]].u1c);
cout << block[dt[i][j]].u1;flag2 += 2;gotoxy(flag1 * 2 - 1,flag2);
color(block[dt[i][j]].u2c);
cout << block[dt[i][j]].u2;
}}}cout << endl;flag2 = -2;
for(long long j = sdf2 - 7; j < sdf2 + 7; j++){
flag2 += 2;
gotoxy(flag1 * 2,flag2);
if(i == sdf1 && j == sdf2){color(15);
if(fx == 'w'){cout << "↑";flag2 += 2;gotoxy(flag1 * 2,flag2);cout << "家";
}else if(fx == 's'){cout << "↓";flag2 += 2;gotoxy(flag1 * 2,flag2);cout << "家";
}else if(fx == 'a'){cout << "←";flag2 += 2;gotoxy(flag1 * 2,flag2);cout << "家";
}else if(fx == 'd'){cout << "→";flag2 += 2;gotoxy(flag1 * 2,flag2);cout << "家";}
}else{
color(block[dt[i][j]].d1c);
cout << block[dt[i][j]].d1;flag2 += 2;gotoxy(flag1 * 2,flag2);
color(block[dt[i][j]].d2c);
cout<< block[dt[i][j]].d2;
}}cout << endl;}
if(hp < 1){muzic_die();}
for(long long i = 0; i <= hp; i++){gotoxy(flag1 * 2 + 1,i * 2);color(4);cout << "▓";}
for(long long i = hp + 1; i < 10; i++){gotoxy(flag1 * 2 + 1,i * 2);color(8);cout << "▓";}
color(15);cout << endl;
for(long long bag_i = 0; bag_i < 100; bag_i++){
if(bag[bag_i] > 0){
cout << block[bag_i].name << 'x' << bag[bag_i];
}
}
}
void dz(){
if(axj(W)){
if(block[dt[sdf1 - 1][sdf2]].ph == 0 && sdf1 != 0){
if(block[dt[sdf1 + 1][sdf2]].ph == 0){
fx = 'w';
sdf1 ++;
sc();
}else{
sdf1 -= 2;
fx = 'w';slsh = 0;sc();
}
}else if(fx != 'w'){
fx = 'w';
sc();}
}else if(axj(S)){
if(block[dt[sdf1 + 1][sdf2]].ph == 0 && sdf1 != 256){
sdf1++; sc();}
if(fx != 's'){
fx = 's'; sc();}
}else if(axj(A)){
if(block[dt[sdf1][sdf2 - 1]].ph == 0 && sdf2 != 0){
sdf2--;
fx = 'a';
sc();
if(block[dt[sdf1 + 1][sdf2]].ph == 0){sdf1 ++;sc();}
}else if(fx != 'a'){
fx = 'a';
sc();}
}else if(axj(D)){
if(block[dt[sdf1][sdf2 + 1]].ph == 0 && sdf2 != 8000){
sdf2++;
fx = 'd';
sc();
if(block[dt[sdf1 + 1][sdf2]].ph == 0){sdf1 ++;sc();}
}else if(fx != 'd'){
fx = 'd'; sc();}
}else if(axj(z_sb)){
if(fx == 'w'){
bjx = sdf1 - 1;
bjy = sdf2;
}else if(fx == 's'){
bjx = sdf1 + 1;
bjy = sdf2;
}else if(fx == 'a'){
bjx = sdf1;
bjy = sdf2 - 1;
}else if(fx == 'd'){
bjx = sdf1;
bjy = sdf2 + 1;
}
if(dt[bjx][bjy] != 0&&dt[bjx][bjy] != 2&&dt[bjx][bjy]!=6&&bjx!=14&&bjx!=-1&&bjy!=-1&&bjy!=31&&dt[bjx][bjy]!=11){
if(fx=='s'){
bag[dt[bjx][bjy]]++;
dt[bjx][bjy]=0;
sc();
}else if(fx=='w'){
bag[dt[bjx][bjy]]++;
dt[bjx][bjy]=0;
sc();
}else if(fx=='a'){
bag[dt[bjx][bjy]]++;
dt[bjx][bjy]=0;
sc();
}else if(fx=='d'){
bag[dt[bjx][bjy]]++;
dt[bjx][bjy]=0;
sc();
}
}else{
for(long long i=1; i<=4; i++){
if(fx=='w'){
bjx--;
}else if(fx=='s'){
bjx++;
}else if(fx=='a'){
bjy--;
}else if(fx=='d'){
bjy++;
}
if(dt[bjx][bjy]!=0&&dt[bjx][bjy]!=2&&dt[bjx][bjy]!=6){
bag[dt[bjx][bjy]]++;
dt[bjx][bjy]=0;
sc();break;
}}}if(block[dt[sdf1 + 1][sdf2]].ph == 0){sdf1 ++;sc();}
}else if(axj(y_sb)){
if(fx=='w'){
dt[sdf1-1][sdf2]=3;
}else if(fx=='s'){
dt[sdf1+1][sdf2]=3;
}else if(fx=='a'){
dt[sdf1][sdf2-1]=3;
}else if(fx=='d'){
dt[sdf1][sdf2+1]=3;
}
sc();}}
long long suiji(long long start, long long end){
long long dis = end - start;
return start + dis * (rand() / (RAND_MAX + 1.0));
}
void csh(){
system("mode con cols=120 lines=46");system("title YUTU制作——沙盒游戏");
long long flag, flag2,lflag;
flag = suiji(40,100);
for(long long i = 0;i < 8000;i++){for(long long j = 0;j < 256;j++){dt[j][i] = 0;}}
for(long long i = 0;i < 8000;i++){
for(long long j = 0;j < 256;j++){if(dt[j][i] != 8 || j < lflag - 6)dt[j][i] = 0;}
dt[flag][i] = 4;
if(flag < 55){dt[flag - 1][i] = 12;}
if(suiji(1,30) == 1){
if(flag < 54){
dt[flag - 1][i] = 7;dt[flag - 1 - 1][i] = 7;dt[flag - 1 - 2][i] = 7;dt[flag - 1 - 3][i] = 7;dt[flag - 1 - 2][i - 1] = 8;dt[flag - 1 - 2][i + 1] = 8;dt[flag - 1 - 2][i + 2] = 8;dt[flag - 1 - 2][i - 2] = 8;dt[flag - 1 - 3][i - 1] = 8;dt[flag - 1 - 3][i + 1] = 8;dt[flag - 1 - 4][i] = 8;
}else{
dt[flag - 1][i] = 13;dt[flag - 1 - 1][i] = 13;dt[flag - 1 - 2][i] = 13;dt[flag - 1 - 3][i] = 13;dt[flag - 1 - 2][i - 1] = 14;dt[flag - 1 - 2][i + 1] = 14;dt[flag - 1 - 2][i + 2] = 14;dt[flag - 1 - 2][i - 2] = 14;dt[flag - 1 - 3][i - 1] = 14;dt[flag - 1 - 3][i + 1] = 14;dt[flag - 1 - 4][i] = 14;
}
}else if(suiji(1,20) == 1){
if(flag < 54){dt[flag - 1][i] = 7;dt[flag - 1 - 1][i] = 7;dt[flag - 1 - 1][i - 1] = 8;dt[flag - 1 - 1][i + 1] = 8;dt[flag - 1 - 2][i] = 8;
}else{
dt[flag - 1][i] = 13;dt[flag - 1 - 1][i] = 13;dt[flag - 1 - 1][i - 1] = 14;dt[flag - 1 - 1][i + 1] = 14;dt[flag - 1 - 2][i] = 14;}}
if(i == 4000){sdf1 = 62 ;sdf2 = 4000;}
flag2 = suiji(0,5) + suiji(1,3);
for(long long j = 1;j < flag2;j++){dt[flag + j][i] = 5;}
for(long long j = flag2;j < 256;j++){
if(suiji(0,50) == 0){dt[flag + j][i] = 6;
}else if(suiji(0,25) == 0){dt[flag + j][i] = 2;
}else{dt[flag + j][i] = 1;}}
lflag = flag;
flag += suiji(0,5) - 2;
if(flag > 100){
flag -= 4;}
if(flag < 40){
flag += 4;}
}
}
int main(){
CONSOLE_CURSOR_INFO cursor;
cursor.bVisible = FALSE;
cursor.dwSize = sizeof(cursor);
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorInfo(handle, &cursor);
HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);
DWORD mode;
GetConsoleMode(hStdin, &mode);
mode &= ~ENABLE_QUICK_EDIT_MODE;
SetConsoleMode(hStdin, mode);
yanse(15);cout<<"你的名字叫什么?\n";cin>>name;
sck = 7;
csh();
gotoxy(31,0);
cout<<"按下W向上移动,按下A向左移动,按下S向下移动,按下D向右移动,";
sc();
while(1){
if(hp==0)muzic_die();
dz();
if(gzt==15-1){
if(dt[sdf1][sdf2] == 6){
hp-=0.1;
if(hp == hp / 1 * 1){
sc();
}
}
if(block[dt[sdf1 + 1][sdf2]].ph == 0){
sdf1++;
slsh++;
if(dt[sdf1 + 1][sdf2] == 2||dt[sdf1 + 1][sdf2] == 6){
slsh = 0;
}
sc();
}else{
if(slsh > 2){
hp -= slsh - 2;
slsh = 0;
die = 4;
if(hp == hp / 1 * 1){
sc();}
}else{
slsh = 0;
}}}
gotoxy(32,0);cout << "x=" << sdf1 << ",y=" << sdf2;
sj++;sj %= 240;gzt++;gzt %= 125;
}
return 0;
}