2048小游戏c++源代码
  • 板块灌水区
  • 楼主zrt090604
  • 当前回复14
  • 已保存回复14
  • 发布时间2022/8/17 11:09
  • 上次更新2023/10/27 15:00:52
查看原帖
2048小游戏c++源代码
459188
zrt090604楼主2022/8/17 11:09
#include<bits/stdc++.h>
#include<conio.h>
#include<windows.h>
using namespace std;
int sco[7][7], lib[5] = {2, 2, 2, 2, 4};
void printscreen() { //print the game screen
	printf("                -------               -------               -     -             -------\n\
                      -               -     -               -     -             -     -\n\
                      -               -     -               -     -             -     -\n\
                -------               -     -               -------             -------\n\
                -                     -     -                     -             -     -\n\
                -                     -     -                     -             -     -\n\
                -------               -------                     -             -------\n");
    for(int i = 1;i <= 4;++i) {
    	puts("-----------------------------------------------------------------");
    	puts("|               |               |               |               |");
    	for(int j = 1;j <= 4;++j)
    		if(sco[i][j]/1000) printf("|     %d      ", sco[i][j]);
    		else if(sco[i][j]/100) printf("|      %d      ", sco[i][j]);
    		else if(sco[i][j]/10) printf("|      %d       ", sco[i][j]);
    		else if(sco[i][j]) printf("|       %d       ", sco[i][j]);
    		else printf("|               ");
    	puts("|");
	}
	puts("-----------------------------------------------------------------");
}
bool gameover() { //judge whether it's the end of this game
	for(int i = 1;i <= 4;++i)
		for(int j = 1;j <= 4;++j)
			if(!sco[i][j]) return false;
	for(int i = 1;i <= 4;++i)
		for(int j = 1;j <= 4;++j)
			for(int k = 1;k <= 4;++k)
				for(int l = 1;l <= 4;++l) {
					if(i==k && j==l) continue;
					if(sco[i][j] == sco[k][l]) return false;
				}
	return true;
}
void mergeup() {
	for(int i = 1;i <= 4;++i) {
		int pos = 1, f[15], j, cnt = 0, h = 0;
        memset(f, 0, sizeof f);
		while(pos<=3) {
            if(sco[pos][i]==sco[pos+1][i] && sco[pos][i]) break;
            ++pos;
        }
		if(pos==1 && sco[3][i]==sco[4][i] && sco[3][i]) {sco[1][i] += sco[2][i], sco[2][i] = sco[3][i]*2, sco[3][i] = sco[4][i] = 0; continue;}
		for(j = 1;j <= 4;++j) 
            if(sco[j][i]) f[++cnt] = sco[j][i];
        if(cnt >= 2) {
            for(j = 1;j < cnt;++j) 
                if(f[j]==f[j+1]) break;
            if(f[j]==f[j+1]) f[j] += f[j+1], f[j+1] = 0;
            for(int k = j+1;k <= cnt;++k) h = 1, f[k] = f[k+1];
        }
        for(j = 1;j <= cnt-h;++j) sco[j][i] = f[j];
        for(int k = cnt-h+1;k <= 4;++k) sco[k][i] = 0; 
	}
	return;
}
void mergeleft() {
	for(int i = 1;i <= 4;++i) {
		int pos = 1, f[15], j, cnt = 0, h = 0;
        memset(f, 0, sizeof f);
		while(pos<=3) {
            if(sco[i][pos]==sco[i][pos+1] && sco[i][pos]) break;
            ++pos;
        }
		if(pos==1 && sco[i][3]==sco[i][4] && sco[i][3]) {sco[i][1] += sco[i][2], sco[i][2] = sco[i][3]*2, sco[i][3] = sco[i][4] = 0; continue;}
		for(j = 1;j <= 4;++j) 
            if(sco[i][j]) f[++cnt] = sco[i][j];
        if(cnt >= 2) {
            for(j = 1;j < cnt;++j) 
                if(f[j]==f[j+1]) break;
            if(f[j]==f[j+1]) f[j] += f[j+1], f[j+1] = 0;
            for(int k = j+1;k <= cnt;++k) h = 1, f[k] = f[k+1];
        }
        for(j = 1;j <= cnt-h;++j) sco[i][j] = f[j];
        for(int k = cnt-h+1;k <= 4;++k) sco[i][k] = 0; 
	}
	return;
}
void mergeright() {
	for(int i = 1;i <= 4;++i) {
		int pos = 4, f[15], j, cnt = 0, h = 0;
        memset(f, 0, sizeof f);
		while(pos>=2) {
            if(sco[i][pos]==sco[i][pos-1] && sco[i][pos]) break;
            --pos;
        }
		if(pos==4 && sco[i][1]==sco[i][2] && sco[i][2]) {sco[i][4] += sco[i][3], sco[i][3] = sco[i][2]*2, sco[i][1] = sco[i][2] = 0; continue;}
		for(j = 4;j >= 1;--j)
            if(sco[i][j]) f[++cnt] = sco[i][j];
        if(cnt >= 2) {
            for(j = 1;j < cnt;++j) 
                if(f[j]==f[j+1]) break;
            if(f[j]==f[j+1]) f[j] += f[j+1], f[j+1] = 0;
            for(int k = j+1;k <= cnt;++k) h = 1, f[k] = f[k+1];
        }
        for(j = 1;j <= cnt-h;++j) sco[i][4-j+1] = f[j];
        for(int k = cnt-h+1;k <= 4;++k) sco[i][4-k+1] = 0; 
	}
	return;
}
void mergedown() {
	for(int i = 1;i <= 4;++i) {
		int pos = 4, f[15], j, cnt = 0, h = 0;
        memset(f, 0, sizeof f);
		while(pos>=2) {
            if(sco[pos][i]==sco[pos-1][i] && sco[pos][i]) break;
            --pos;
        }
		if(pos==4 && sco[1][i]==sco[2][i] && sco[2][i]) {sco[4][i] += sco[3][i], sco[3][i] = sco[2][i]*2, sco[1][i] = sco[2][i] = 0; continue;}
		for(j = 4;j >= 1;--j) 
            if(sco[j][i]) f[++cnt] = sco[j][i];
        if(cnt >= 2) {
            for(j = 1;j < cnt;++j) 
                if(f[j]==f[j+1]) break;
            f[j] += f[j+1], f[j+1] = 0;
            for(int k = j+1;k <= cnt;++k) h = 1, f[k] = f[k+1];
        }
        for(j = 1;j <= cnt-h;++j) sco[4-j+1][i] = f[j];
        for(int k = cnt-h+1;k <= 4;++k) sco[4-k+1][i] = 0; 
    }
	return;
}
bool win() {
	for(int i = 1;i <= 4;++i)
		for(int j = 1;j <= 4;++j)
			if(sco[i][j] == 2048) return true;
	return false;
}
int main () {
	while(!gameover()) {
		if(win()) Sleep(200), puts("You Win!"), exit(0);
		srand(time(0));
		int num = lib[rand()%5], x = rand()%4+1, y = rand()%4+1;
		while(sco[x][y]) x = rand()%4+1, y = rand()%4+1;
		sco[x][y] = num;
		system("cls");
		printscreen();
		char c = getch();
		while(c!='a' && c!='d' && c!='w' && c!='s') c = getch();
		if(c == 'w') mergeup();
		if(c == 'a') mergeleft();
		if(c == 'd') mergeright();
		if(c == 's') mergedown();
	}
	return 0;
}

点个关注再走吧

2022/8/17 11:09
加载中...