软件工程第二次作业,命令行窗口的2048

软件工程第二次作业

李军炜 学号:2011211882 班级:0411104 负责游戏设计

张鹤立 学号:2011211883 班级:0411104 负责游戏实现

刘冬 学号:2011211885 班级:0411104   负责游戏测试

2048是当下非常流行的一款游戏,周围的同学在玩2048的时候完全无法停下来。我们就想自己来实现2048这款游戏。由于openGL等有关图形界面的知识没有完全学明白,所以退而求其次,用控制台来实现这个游戏的功能。

流程图:

流程图:


 功能截图如下:


 

 

 


 

#include<iostream>  

#include<stdlib.h>  

#include<time.h>  

using namespace std;  

#define NO 0  

int s=1,i,j,n=4,t=0;  

int num[4][4];  

char fx;  

void randij(int *i1,int *j1)  

{  

srand((int)time(0));  

*i1=rand()%4;  

*j1=rand()%4;  

while(num[*i1][*j1]!=NO){  

*i1=rand()%4;  

*j1=rand()%4;  

}  

}  

void startGameinit()

{  

for(int k=1;k<=2;k++)  

{randij(&i,&j);  

num[i][j]=2;  

}  

}  

void up()  

{  

int k,p;  

for(k=0;k<n;k++)  

{  

for(p=0;p<n-1;p++)  

{  

if(num[p][k]==NO){  

for(int d=p;d<n-1;d++)  

{  

num[d][k]=num[d+1][k];  

}  

num[n-1][k]=NO;  

}  

else if(num[p+1][k]==NO){  

for(int d=p+1;d<n-1;d++)  

{  

num[d][k]=num[d+1][k];  

}  

num[n-1][k]=NO;  

}  

else p++;  

}  

}  

for(k=0;k<n;k++)  

{  

for(p=0;p<n-1;p++)  

{  

if(num[p][k]==num[p+1][k]){  

num[p][k]+=num[p+1][k];  

for(int z=p+1;z<n-1;z++)  

num[z][k]=num[z+1][k];  

num[n-1][k]=0;  

}  

}  

}  

 

}  

void down()  

{  

int k,p;  

for(k=n-1;k>=0;k--)  

{  

for(p=n-1;p>0;p--)  

{  

if(num[p][k]==NO){  

for(int d=p;d>=0;d--)  

{  

num[d][k]=num[d-1][k];  

}  

num[0][k]=NO;  

}  

else if(num[p-1][k]==NO){  

for(int d=p-1;d>=0;d--)  

{  

num[d][k]=num[d-1][k];  

}  

num[0][k]=NO;  

}  

else p--;  

}  

}  

for(k=n-1;k>=0;k--)  

{  

for(p=n-1;p>0;p--)  

{  

if(num[p][k]==num[p-1][k]){  

num[p][k]+=num[p-1][k];  

for(int z=p-1;z>0;z--)  

num[z][k]=num[z-1][k];  

num[0][k]=NO;  

 

}  

}  

}  

}  

void left()  

{int p,k;  

for(k=0;k<n;k++)  

{t=0;  

for(p=0;p<n-1;p++)  

{  

if(num[k][p]==NO){  

for(int d=p;d<n-1;d++)  

{  

num[k][d]=num[k][d+1];  

}  

num[k][n-1]=NO;  

p--;  

t++;  

if(t>4)break;  

}  

else if(num[k][p+1]==NO){  

for(int d=p+1;d<n-1;d++)  

{  

num[k][d]=num[k][d+1];  

}  

num[k][n-1]=NO;  

p--;  

t++;  

if(t>4)break;  

}  

else p++;  

}  

}  

for(k=0;k<n;k++)  

{  

for(p=0;p<n-1;p++)  

{  

if(num[k][p]==num[k][p+1]){  

num[k][p]+=num[k][p+1];  

for(int z=p+1;z<n-1;z++)  

num[k][z]=num[k][z+1];  

num[k][n-1]=NO;  

}  

}  

}  

}  

void right()  

{  

int p,k;  

for(k=n-1;k>=0;k--)  

{t=0;  

for(p=n-1;p>0;p--)  

{  

if(num[k][p]==NO){  

for(int d=p;d>=0;d--)  

{  

num[k][d]=num[k][d-1];  

}  

num[k][0]=NO;  

p++;  

t++;  

if(t>4)break;  

}  

else if(num[k][p-1]==NO){  

for(int d=p-1;d>0;d--)  

{  

num[k][d]=num[k][d-1];  

}  

num[k][0]=NO;  

p++;  

t++;  

if(t>4)break;  

}  

else p--;  

}  

}  

for(k=n-1;k>=0;k--)  

{  

for(p=n-1;p>0;p--)  

{  

if(num[k][p]==num[k][p-1]){  

num[k][p]+=num[k][p-1];  

for(int z=p-1;z>0;z--)  

num[k][z]=num[k][z-1];  

num[k][0]=NO;  

}  

}  

}  

}  

 

int checkGameOver()  

{  

int k,p,count=0;  

for(k=1;k<=n-2;k++)  

{  

for(p=1;p<=n-2;p++)  

{  

if(num[k][p]!=num[k-1][p]&&num[k][p]!=num[k][p-1]&&num[k][p]!=num[k+1][p]&&num[k][p]!=num[k][p+1])count++;  

}  

}  

 

 

for(p=0;p<n-1;p++)  

{  

if(num[0][p]!=num[0][p+1])count++;  

if(num[p][0]!=num[p+1][0])count++;  

if(num[n-1][p]!=num[n-1][p+1])count++;  

if(num[p][n-1]!=num[p+1][n-1])count++;  

}  

if(count==13)return 1;  

else  return 0;  

}  

void clear()  

{  

system("CLS");  

}  

int getNum()  

{  

int temp=0;  

for(int k=0;k<n;k++)  

{  

for(int p=0;p<n;p++)  

{  

if(num[k][p]!=NO)temp++;  

}  

}  

return temp;  

}  

void showGame()  

{  

int sum=0,k,d;  

 

for(k=0;k<n;k++)  

{  

for(d=0;d<n;d++)  

sum+=num[k][d];  

}  

cout<<"\t\t2048 C++ã?"<<endl<<endl<<"\t\t\t\t\tÁ¨¹¤?êo"<<sum<<"   "<<"ºyÁ??ºyêo"<<getNum()<<endl<<endl<<"\t\t\t\t\t?º?¨?W A S D??¤?¨°"<<endl;  

for(k=0;k<40;k++)  

cout<<"-";  

cout<<endl;  

for(k=0;k<n;k++)  

{  

for(d=0;d<n;d++)  

{  

if(num[k][d]==NO)cout<<"\t ";  

else cout<<"\t"<<num[k][d];  

}  

cout<<endl<<endl<<endl;  

}  

for(k=0;k<40;k++)  

cout<<"-";  

cout<<endl;  

}  

int getMax()  

{  

int max=0;  

for(int k=0;k<n;k++)  

{  

for(int p=0;p<n;p++)  

{  

if(max<num[k][p])max=num[k][p];  

}  

}  

return max;  

}  

int main()  

{  

for(i=0;i<n;i++)  

{  

for(j=0;j<n;j++)  

{  

num[i][j]=NO;  

}  

}  

startGameinit();  

showGame();  

while(s)  

{  

cin>>fx;  

switch(fx)  

{  

case 'W':case 'w':up();clear();showGame();break;  

case 'A':case 'a':left();clear();showGame();break;  

case 'D':case 'd':right();clear();showGame();break;  

case 'S':case 's':down();clear();showGame();break;  

}  

if(getMax()==2048){cout<<"\t\t\tYOU WIN!"<<endl;break;}  

if(getNum()==n*n){  

if(checkGameOver()){s=0;cout<<endl<<endl<<"\t\t\tGAME OVER!"<<endl;}  

}  

else {  

randij(&i,&j);  

num[i][j]=2;  

}  

}  

 

return 0;  

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值