于2014年9月1日后学习C++,由于学习繁重,至今(2015年11月14日)只读了C++ Primer Plus的260页,现以此水平试制1024,望指正。
已知BUG:随机数不够随机,尤其第一格出现的概率较偏大
1024 Build4
#include <iostream>
#include <time.h>
#include <windows.h>
#include <conio.h>
using namespace std;
struct extraction
{int x = 0,y = 0;
int gameover = 0;
};
void welcome();//Start
void initialization(int ar1[][4],int & num,int & num_t);//initialization
void reset(int & num,int & num_t);//Next_NUM_Appear
extraction renew(int ar[][4]);//The_One_which_need_Fill_Up XY.sth
void show(int ar[][4]);//show
int judgement(const int ar[][4]);//Judgement Really_Lose
void up(int ar1[][4],int ar2[][4],int* n,int _n);
void down(int ar1[][4],int ar2[][4],int* n,int _n);
void left(int ar1[][4],int ar2[][4],int* n,int _n);
void right(int ar1[][4],int ar2[][4],int* n,int _n);
int main()
{
system("color f1");
int ar1[4][4]{};
int ar2[4][4]{};
int num = 0,num_t = 0;//Use for NUM
char choice = '\0';
int n = 1;//Decide ar1(1)||ar2(0)
int i = 1;//Next Choice 判断退出与继续
extraction XY;
welcome();
initialization(ar1,num,num_t);
n ? show(ar1) : show(ar2);
while(i)
{
choice = getch();//按字母数字什么的好像没用,不会读取似的//
if(choice==0)
choice = getch();
switch(choice)
{ case 72 : n ? up(ar1,ar2,&n,1) : up(ar2,ar1,&n,0);
XY = n ? renew(ar1) : renew(ar2);
if(XY.gameover==1)
break;
reset(num,num_t);
n ? ar1[XY.y][XY.x]=num : ar2[XY.y][XY.x]=num;
n ? show(ar1) : show(ar2);
break;
case 80 : n ? down(ar1,ar2,&n,1) : down(ar2,ar1,&n,0);
XY = n ? renew(ar1) : renew(ar2);
if(XY.gameover==1)
break;
reset(num,num_t);
n ? ar1[XY.y][XY.x]=num : ar2[XY.y][XY.x]=num;
n ? show(ar1) : show(ar2);
break;
case 75 : n ? left(ar1,ar2,&n,1) : left(ar2,ar1,&n,0);
XY = n ? renew(ar1) : renew(ar2);
if(XY.gameover==1)
break;
reset(num,num_t);
n ? ar1[XY.y][XY.x]=num : ar2[XY.y][XY.x]=num;
n ? show(ar1) : show(ar2);
break;
case 77 : n ? right(ar1,ar2,&n,1) : right(ar2,ar1,&n,0);
XY = n ? renew(ar1) : renew(ar2);
if(XY.gameover==1)
break;
reset(num,num_t);
n ? ar1[XY.y][XY.x]=num : ar2[XY.y][XY.x]=num;
n ? show(ar1) : show(ar2);
break;
case 27 : i=0;
}if(XY.gameover==1)
{ if((XY.gameover = n ? judgement(ar1) : judgement(ar2))==0)//可行,继续
continue;
break;//不可行,跳出循环
}
}
system("cls");
if(XY.gameover) cout << "\n\n\n\n\n\n\n\t\t\t\tLose?!\n\n\t\t\tExit from the program!\n\n\n\n\n\n\n";
else cout << "\n\n\n\n\n\n\n\n\t\t\t\tBye!\t\t\t\n\n\n\n\n\n\n\n";
Sleep(1500);
cout << "Here is the time you play: " << clock()/CLOCKS_PER_SEC << 's';
return 0;
}
void initialization(int ar1[][4],int & num,int & num_t)
{
int x = 0,y = 0; //随机数 坐标
for(;y<4;++y)
{for(;x<4;++x)
{Sleep(1);
num_t = clock()%10;
if(0<=num_t&&num_t<6)
ar1[y][x] = 0;
else if(6<=num_t&&num_t<9)
ar1[y][x] = 2;
else if(num_t == 9)
ar1[y][x] = 4;
}x=0;
}
}
void reset(int & num,int & num_t) //决定num值
{ Sleep(1);
num_t = clock()%10;
if(0<=num_t&&num_t<8)
num = 2;
else if(8<=num_t&&num_t<=9)
num = 4;
}
extraction renew(int ar[][4])
{ extraction XY;
int x=0,y=0,exit=1,count=0;
for(;y<4;++y)
{ for(;x<4;++x)
{if(ar[y][x]==0)
++count;
}
x=0;
}if(count==0)
{XY.gameover=1;
exit=0;
}
while(exit)
{x=0,y=0;
for(;y<4;++y)
{for(;x<4;++x)
{if((!(clock()%10))&&!ar[y][x])
{ XY.x = x;
XY.y = y;
exit=0;
break;
}
}x=0;
if(exit==0) break;
}
}
return XY;
}
void show(int ar[][4])//显示
{ system("cls");
cout << "\n\n\n\n\n\n\n";
int y=0,x=0;
for(;y<4;++y)
{cout << "\t\t\t";
for(;x<4;++x)
{cout << ar[y][x] << '\t';
}x=0;
cout << endl << endl;
}cout << endl;
}
void up(int ar1[][4],int ar2[][4],int* n,int _n)
{ int cut=0,i1=0,i2=0,it=0;
for(;i1<=3;++i1)//X
{ i2=0,it=0;
for(;i2<=3;++i2)//Y
{ if(ar1[i2][i1])//排除0
{ for(int o=1;i2+o<=3;++o)//加倍合并
{ if(ar1[i2+o][i1]!=0 && ar1[i2][i1]!=ar1[i2+o][i1])//遇到异数中断 as '2''4''2'
break;
if(ar1[i2][i1]==ar1[i2+o][i1])
{ ar2[it][i1]=2*ar1[i2][i1];
++it;
while(--o!=0)
++i2;
++i2;
cut=1;
break;
}
}
if(cut==1)//双倍生效
{ cut = 0;
continue;
}ar2[it][i1]=ar1[i2][i1];
++it;
}
}
}_n ? --*n : ++*n;//决定ar1(1)||ar2(0)
for(int i1=0;i1<4;++i1)//数组清零
{ for(int i2=0;i2<4;++i2)
ar1[i1][i2]=0;
}
}
void down(int ar1[][4],int ar2[][4],int* n,int _n)
{ int cut=0,i1=0,i2=3,it=3;
for(;i1<=3;++i1)
{ i2=3,it=3;
for(;i2>=0;--i2)
{ if(ar1[i2][i1])
{ for(int o=1;i2-o>=0;++o)
{ if(ar1[i2-o][i1]!=0 && ar1[i2][i1]!=ar1[i2-o][i1])
break;
if(ar1[i2][i1]==ar1[i2-o][i1])
{ ar2[it][i1]=2*ar1[i2][i1];
--it;
while(--o!=0)
--i2;
--i2;
cut=1;
break;
}
}
if(cut==1)
{ cut = 0;
continue;
}ar2[it][i1]=ar1[i2][i1];
--it;
}
}
}_n ? --*n : ++*n;
for(int i1=0;i1<4;++i1)
{ for(int i2=0;i2<4;++i2)
ar1[i1][i2]=0;
}
}
void left(int ar1[][4],int ar2[][4],int* n,int _n)
{ int cut=0,i1=0,i2=0,it=0;
for(;i1<=3;++i1)
{ i2=0,it=0;
for(;i2<=3;++i2)
{ if(ar1[i1][i2])
{ for(int o=1;i2+o<=3;++o)
{ if(ar1[i1][i2+o]!=0 && ar1[i1][i2]!=ar1[i1][i2+o])
break;
if(ar1[i1][i2]==ar1[i1][i2+o])
{ ar2[i1][it]=2*ar1[i1][i2];
++it;
while(--o!=0)
++i2;
++i2;
cut=1;
break;
}
}
if(cut==1)
{ cut = 0;
continue;
}ar2[i1][it]=ar1[i1][i2];
++it;
}
}
}
_n ? --*n : ++*n;
for(int i1=0;i1<4;++i1)
{ for(int i2=0;i2<4;++i2)
ar1[i1][i2]=0;
}
}
void right(int ar1[][4],int ar2[][4],int* n,int _n)
{ int cut=0,i1=0,i2=3,it=3;
for(;i1<=3;++i1)
{ i2=3,it=3;
for(;i2>=0;--i2)
{ if(ar1[i1][i2])
{ for(int o=1;i2-o>=0;++o)
{ if(ar1[i1][i2-o]!=0 && ar1[i1][i2]!=ar1[i1][i2-o])
break;
if(ar1[i1][i2]==ar1[i1][i2-o])
{ ar2[i1][it]=2*ar1[i1][i2];
--it;
while(--o!=0)
--i2;
--i2;
cut=1;
break;
}
}
if(cut==1)
{ cut = 0;
continue;
}ar2[i1][it]=ar1[i1][i2];
--it;
}
}
}_n ? --*n : ++*n;
for(int i1=0;i1<4;++i1)
{ for(int i2=0;i2<4;++i2)
ar1[i1][i2]=0;
}
}
void welcome()
{
int go=0;
char esc = '0';
cout << "\n\n\n\n\n"
<< " ┌────────────────┐\n"
<< " │ │\n"
<< " │ Welecome │\n"
<< " │ │\n"
<< " │ 1024 │\n"
<< " │ │\n"
<< " └────────────────┘\n\n\n"
<< " [Enter]開始 [S]設定 [ESC]退出程式 \n\n";
do
{ go=0;
esc = getch();
if(esc==0)
esc = getch();
switch(esc)
{
case '\r' : break;
case 'S' :
case 's' : cout << "Sorry,haven't finished!";
cout << "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b";
go=1;
break;//UnFinish
case 27 : exit(0);
default : go = 1;
cin.sync();
}
}while(go);
}
int judgement(const int ar[][4])
{ int x=0,y=0;
for(;y<4;++y)//横线
{ for(;x<3;++x)
{ if(ar[y][x]==ar[y][x+1])
return 0;
}x=0;
}y=0;
for(;x<4;++x)//纵向
{ for(;y<3;++y)
{ if(ar[x][y]==ar[x][y+1])
return 0;
}y=0;
}x=0;
return 1;
}
std::cout << “谢谢!”;