C++之2048(2.0版)
Hello大家好,你们的阳了个阳C++又回来啦!
不知道是不是还有人记得我两年前的这篇C++之2048的博客呢?当时的代码是我们的C++小盆友ta的主页提供的,最近刚好翻到,觉得还可以优化一下,于是呢就有了这篇博客。
那么话不多说,我们进入代码介绍:
代码介绍
这篇代码大体来说可以分为四个板块:
板块一
#include<bits/stdc++.h>
#include<windows.h>
#include<conio.h>
using namespace std;
char input;
int gamemap[10][10],gamemapb[10][10];
void green(){
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);
}
void red(){
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);
}
void cls(){
system("cls");
}
void output(string s){
for(int i=0;i<s.size();i++){
cout<<s[i];
if(s[i]=='\n') Sleep(150);
else Sleep(25);
}
return;
}
这一部分主要就是一些准备工作,包括自定义颜色函数,自定义输出函数以及一些杂七杂八的没用的东西
板块二
void gamerule(){
output("屏幕上会随机生成2的正整次方数\n\n可以向上下左右四个方向滑动屏幕\n\n相同的两个数碰到一起后会乘以2\n\n当出现1024时,通关成功\n\n当无法滑屏时,通关失败\n\n按任意键继续……\n\n");
input=_getch();
return;
}
void information(int maxnumber){
cls();
cout<<"目标:1024 当前最大值:"<<maxnumber<<"\n\n向上滑屏请按W\n\n向下滑屏请按S\n\n向左滑屏请按A\n\n向右滑屏请按D\n\n重新开始请按F\n\n";
return;
}
void printmap(){
for(int i=1;i<=4;i++){
for(int j=1;j<=4;j++){
if(gamemap[i][j]==0)
green();
else
red();
cout<<std::left<<setw(4)<<gamemap[i][j];
}
cout<<"\n\n";
}
green();
return;
}
void cleanmap(){
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++)
gamemap[i][j]=0;
return;
}
int judge(int maxnumber){
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++)
maxnumber=max(maxnumber,gamemap[i][j]);
return maxnumber;
}
void win(){
cls();
cout<<"\n\n恭喜你,通关成功!!!\n\n";
exit(0);
}
void lose(){
cls();
red();
cout<<"\n\n很遗憾,通关失败……\n\n";
exit(0);
}
这一段也是准备工作,但是和前一板块相比关系稍微近了一点,包括游戏规则,基本信息,还有打印和重置地图等等功能
板块三
void randmap(){
int j=rand()%3+1;
j=pow(2,j);
while(1){
int x=rand()%4+1,y=rand()%4+1;
if(gamemap[x][y]==0){
gamemap[x][y]=j;
return;
}
}
}
bool same(int a[10][10],int b[10][10]){
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++)
if(a[i][j]!=b[i][j])
return 0;
return 1;
}
void copymap(){
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++)
gamemapb[i][j]=gamemap[i][j];
return;
}
void up(){
for(int i=2;i<=4;i++){
for(int j=1;j<=4;j++){
int k=i;
if(gamemapb[i][j]==0)
continue;
while(k>1){
if(gamemapb[k-1][j]==0){
swap(gamemapb[k-1][j],gamemapb[k][j]);
k--;
continue;
}
if(gamemapb[k-1][j]==gamemapb[k][j]){
gamemapb[k-1][j]*=2;
gamemapb[k][j]=0;
break;
}
break;
}
}
}
return;
}
void down(){
for(int i=3;i>=1;i--){
for(int j=1;j<=4;j++){
int k=i;
if(gamemapb[i][j]==0)
continue;
while(k<4){
if(gamemapb[k+1][j]==0){
swap(gamemapb[k+1][j],gamemapb[k][j]);
k++;
continue;
}
if(gamemapb[k+1][j]==gamemapb[k][j]){
gamemapb[k+1][j]*=2;
gamemapb[k][j]=0;
break;
}
break;
}
}
}
return;
}
void left(){
for(int i=1;i<=4;i++){
for(int j=2;j<=4;j++){
int k=j;
if(gamemapb[i][j]==0)
continue;
while(k>1){
if(gamemapb[i][k-1]==0){
swap(gamemapb[i][k-1],gamemapb[i][k]);
k--;
continue;
}
if(gamemapb[i][k-1]==gamemapb[i][k]){
gamemapb[i][k-1]*=2;
gamemapb[i][k]=0;
break;
}
break;
}
}
}
return;
}
void right(){
for(int i=1;i<=4;i++){
for(int j=3;j>=1;j--){
int k=j;
if(gamemapb[i][j]==0)
continue;
while(k<4){
if(gamemapb[i][k+1]==0){
swap(gamemapb[i][k+1],gamemapb[i][k]);
k++;
continue;
}
if(gamemapb[i][k+1]==gamemapb[i][k]){
gamemapb[i][k+1]*=2;
gamemapb[i][k]=0;
break;
}
break;
}
}
}
return;
}
void savemap(){
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++)
gamemap[i][j]=gamemapb[i][j];
return;
}
bool moveable(){
copymap();
up();
if(!same(gamemap,gamemapb))
return 1;
down();
if(!same(gamemap,gamemapb))
return 1;
left();
if(!same(gamemap,gamemapb))
return 1;
right();
if(!same(gamemap,gamemapb))
return 1;
return 0;
}
void gamestart(){
int maxnumber=0;
randmap();
while(moveable()){
cls();
maxnumber=judge(maxnumber);
if(maxnumber>=1024)
win();
information(maxnumber);
printmap();
cout<<"请输入指令:\n\n";
input=_getch();
if(input=='F'||input=='f'){
cleanmap();
gamestart();
}
copymap();
if(input=='w'||input=='W')
up();
if(input=='s'||input=='S')
down();
if(input=='a'||input=='A')
left();
if(input=='d'||input=='D')
right();
if(same(gamemapb,gamemap))
continue;
savemap();
randmap();
}
lose();
return;
}
这一部分是游戏正正的核心,如随机生成数字,滑屏等等重要的函数基本上都包含在里面
板块四
void start(){
output("欢迎来到2048小游戏\n\n");
output("进入游戏请按1\n\n");
output("阅读规则请按2\n\n");
input=_getch();
cls();
if(input=='1')
gamestart();
else{
gamerule();
cls();
start();
}
}
int main(){
srand(time(NULL));
green();
start();
return 0;
}
最后是游戏启动函数和主函数,把它们单独分出一个版块纯粹是语法原因(绝对不是作者想水字数)
完整代码
#include<bits/stdc++.h>
#include<windows.h>
#include<conio.h>
using namespace std;
char input;
int gamemap[10][10],gamemapb[10][10];
void green(){
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);
}
void red(){
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);
}
void cls(){
system("cls");
}
void output(string s){
for(int i=0;i<s.size();i++){
cout<<s[i];
if(s[i]=='\n') Sleep(150);
else Sleep(25);
}
return;
}
void gamerule(){
output("屏幕上会随机生成2的正整次方数\n\n可以向上下左右四个方向滑动屏幕\n\n相同的两个数碰到一起后会乘以2\n\n当出现1024时,通关成功\n\n当无法滑屏时,通关失败\n\n按任意键继续……\n\n");
input=_getch();
return;
}
void information(int maxnumber){
cls();
cout<<"目标:1024 当前最大值:"<<maxnumber<<"\n\n向上滑屏请按W\n\n向下滑屏请按S\n\n向左滑屏请按A\n\n向右滑屏请按D\n\n重新开始请按F\n\n";
return;
}
void printmap(){
for(int i=1;i<=4;i++){
for(int j=1;j<=4;j++){
if(gamemap[i][j]==0)
green();
else
red();
cout<<std::left<<setw(4)<<gamemap[i][j];
}
cout<<"\n\n";
}
green();
return;
}
void cleanmap(){
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++)
gamemap[i][j]=0;
return;
}
int judge(int maxnumber){
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++)
maxnumber=max(maxnumber,gamemap[i][j]);
return maxnumber;
}
void win(){
cls();
cout<<"\n\n恭喜你,通关成功!!!\n\n";
exit(0);
}
void lose(){
cls();
red();
cout<<"\n\n很遗憾,通关失败……\n\n";
exit(0);
}
void randmap(){
int j=rand()%3+1;
j=pow(2,j);
while(1){
int x=rand()%4+1,y=rand()%4+1;
if(gamemap[x][y]==0){
gamemap[x][y]=j;
return;
}
}
}
bool same(int a[10][10],int b[10][10]){
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++)
if(a[i][j]!=b[i][j])
return 0;
return 1;
}
void copymap(){
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++)
gamemapb[i][j]=gamemap[i][j];
return;
}
void up(){
for(int i=2;i<=4;i++){
for(int j=1;j<=4;j++){
int k=i;
if(gamemapb[i][j]==0)
continue;
while(k>1){
if(gamemapb[k-1][j]==0){
swap(gamemapb[k-1][j],gamemapb[k][j]);
k--;
continue;
}
if(gamemapb[k-1][j]==gamemapb[k][j]){
gamemapb[k-1][j]*=2;
gamemapb[k][j]=0;
break;
}
break;
}
}
}
return;
}
void down(){
for(int i=3;i>=1;i--){
for(int j=1;j<=4;j++){
int k=i;
if(gamemapb[i][j]==0)
continue;
while(k<4){
if(gamemapb[k+1][j]==0){
swap(gamemapb[k+1][j],gamemapb[k][j]);
k++;
continue;
}
if(gamemapb[k+1][j]==gamemapb[k][j]){
gamemapb[k+1][j]*=2;
gamemapb[k][j]=0;
break;
}
break;
}
}
}
return;
}
void left(){
for(int i=1;i<=4;i++){
for(int j=2;j<=4;j++){
int k=j;
if(gamemapb[i][j]==0)
continue;
while(k>1){
if(gamemapb[i][k-1]==0){
swap(gamemapb[i][k-1],gamemapb[i][k]);
k--;
continue;
}
if(gamemapb[i][k-1]==gamemapb[i][k]){
gamemapb[i][k-1]*=2;
gamemapb[i][k]=0;
break;
}
break;
}
}
}
return;
}
void right(){
for(int i=1;i<=4;i++){
for(int j=3;j>=1;j--){
int k=j;
if(gamemapb[i][j]==0)
continue;
while(k<4){
if(gamemapb[i][k+1]==0){
swap(gamemapb[i][k+1],gamemapb[i][k]);
k++;
continue;
}
if(gamemapb[i][k+1]==gamemapb[i][k]){
gamemapb[i][k+1]*=2;
gamemapb[i][k]=0;
break;
}
break;
}
}
}
return;
}
void savemap(){
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++)
gamemap[i][j]=gamemapb[i][j];
return;
}
bool moveable(){
copymap();
up();
if(!same(gamemap,gamemapb))
return 1;
down();
if(!same(gamemap,gamemapb))
return 1;
left();
if(!same(gamemap,gamemapb))
return 1;
right();
if(!same(gamemap,gamemapb))
return 1;
return 0;
}
void gamestart(){
int maxnumber=0;
randmap();
while(moveable()){
cls();
maxnumber=judge(maxnumber);
if(maxnumber>=1024)
win();
information(maxnumber);
printmap();
cout<<"请输入指令:\n\n";
input=_getch();
if(input=='F'||input=='f'){
cleanmap();
gamestart();
}
copymap();
if(input=='w'||input=='W')
up();
if(input=='s'||input=='S')
down();
if(input=='a'||input=='A')
left();
if(input=='d'||input=='D')
right();
if(same(gamemapb,gamemap))
continue;
savemap();
randmap();
}
lose();
return;
}
void start(){
output("欢迎来到2048小游戏\n\n");
output("进入游戏请按1\n\n");
output("阅读规则请按2\n\n");
input=_getch();
cls();
if(input=='1')
gamestart();
else{
gamerule();
cls();
start();
}
}
int main(){
srand(time(NULL));
green();
start();
return 0;
}
老规矩,如果喜欢这篇博客的话,请一键三连,关注我,看更多有趣的C++游戏代码,我们下期博客再见,BYEBYE!!!