2048小游戏

用C++写的一个小游戏,没用到类。
开始用的清屏函数来刷新屏幕,但是屏幕闪烁严重,最后采用了移动光标方法来刷新屏幕,使游戏过程中屏幕不会闪烁。

#include<iostream>

#include<ctime>
#include<stdlib.h>
#include<conio.h>
#include<windows.h>
#include<fstream>
using namespace std;


int a[4][4]={0};
int score=0;


void menu();
int if_end();
void gotoxy(int x,int y);
void save_score(int x);
void read_score();
void save_data();
void read_data();
void printf_num();
void rand_num();
void move();


int if_end()
{
int i,j,b=0;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
if(a[i][j]==0)b++;
}
}
for(i=0;i<4;i++)
{
for(j=0;j<3;j++)
{
if(a[i][j]==a[i][j+1])b++;
}
}
for(i=0;i<4;i++)
{
for(j=0;j<3;j++)
{
if(a[j][i]==a[j+1][i])b++;
}
}
if(b!=0)b=1;
return b;
}




void gotoxy(int x,int y)
{
COORD coord={x,y};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);
}




void save_score(int x)
{
int i,j,t;
int a[11]={0};
ifstream fin ("score.txt",ios::in);
if(!fin)
{
ifstream fin ("score.txt",ios::trunc);
}
for(i=0;i<10;i++)
{
fin>>a[i];
}
fin.close();
for(i=0;i<10;i++)
{
if(a[i]==x)x=0;
}
a[10]=x;
for(i=10;i>0;i--)
{
for(j=i-1;j>=0;j--)
{
if(a[j]<a[i])
{
a[j]^=a[i];
a[i]^=a[j];
a[j]^=a[i];
}
}
}
ofstream fout ("score.txt",ios::out);
if(!fout)
{
cout<<"Can't open output file!"<<endl;
exit(1);
}
for(i=0;i<10;i++)
{
fout<<a[i]<<endl;
}
fout.close();
}




void read_score()
{
int i,a[10];
system("cls");
ifstream fin ("score.txt",ios::in);
if(!fin)
{
cout<<"Can't open output file!"<<endl;
getch();
system("cls");
menu();
}
for(i=0;i<10;i++)
{
fin>>a[i];
}
fin.close();
cout<<"  排行榜\n\n" ; 
for(i=0;i<10;i++)
{
printf(" %2d.",i+1);
cout<<a[i]<<endl;
}
}




void printf_num()
{
int i,j;
char p;
cout<<"\n\n\n\n\n\n\n";
printf(" ┌──┬──┬──┬──┐\n");
for(i=0;i<4;i++)
{
printf(" ");
for(j=0;j<4;j++)
{
if(j==0)cout<<"|";
if(a[i][j]!=0)printf("%4d|",a[i][j]);
else cout<<"    |";

cout<<endl;
if (i < 3)
         {
           printf(" ├──┼──┼──┼──┤\n");         }
         else
         {
             printf(" └──┴──┴──┴──┘\n");
         }
}
printf(" score:%d\n",score);
save_data();
if(if_end()==0)
{
save_score(score);
cout<<"\n\n\n GAME OVER!"<<endl<<"\n\n restrat game?"<<endl;
p=getch();
if(p=='n')
{
system("cls");
cout<<" Thanks for using!"<<endl;
getchar();
exit(0);
}
else if(p=='y')
{
system("cls");
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
a[i][j]=0;
}
}
score=0;
menu();
}
else 
{
system("cls");
printf_num();
}
}
}




void save_data()
{
int i,j;
ofstream fout ("2048data.txt",ios::out);
if(!fout)
{
ofstream fout("2048data.txt",ios::trunc);
}
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
fout<<a[i][j]<<" ";
}
fout<<endl;
}
fout<<score; 
fout.close();
}




void read_data()
{
int i,j;
ifstream fin ("2048data.txt",ios::in);
if(!fin)
{
ifstream fin ("2048data.txt",ios::trunc);
}
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
fin>>a[i][j];
}
}
fin>>score;
fin.close();
}




void rand_num()
{
int n=0;
int loc,num,i,j;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
if(a[i][j]==0)n++;
}
}
loc= ((int)(rand()%n)+1);
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
if(a[i][j]==0)loc--;
if(!loc)break;
}
if(!loc)break;
}
num=(rand()%3);
if(num==2)a[i][j]=4;
else a[i][j]=2;
}




void move()
{
int i,j,k,t,b=0;
int N;
printf_num();
while(1)
{
N=getch();
if(N=='d')
{
for(k=0;k<3;k++)
{
for(i=0;i<4;i++)
{
for(j=0;j<3;j++)
{
if(a[i][j]!=0&&a[i][j+1]==0)
{
a[i][j]^=a[i][j+1];
a[i][j+1]^=a[i][j];
a[i][j]^=a[i][j+1];
b++;
}
}
}
}
for(i=0;i<4;i++)
{
for(j=3;j>0;j--)
{
if(a[i][j]==a[i][j-1]&&a[i][j]!=0)
{
a[i][j]+=a[i][j-1];
a[i][j-1]=0;
score+=a[i][j];
b++;
}
}
}for(k=0;k<3;k++)
{
for(i=0;i<4;i++)
{
for(j=0;j<3;j++)
{
if(a[i][j]!=0&&a[i][j+1]==0)
{
a[i][j]^=a[i][j+1];
a[i][j+1]^=a[i][j];
a[i][j]^=a[i][j+1];
}
}
}
}
if(b!=0)
{
rand_num();
b=0;
}
gotoxy(0,0);
printf_num();
}
if(N=='a')
{
for(k=0;k<3;k++)
{
for(i=3;i>=0;i--)
{
for(j=3;j>=1;j--)
{
if(a[i][j]!=0&&a[i][j-1]==0)
{
a[i][j]^=a[i][j-1];
a[i][j-1]^=a[i][j];
a[i][j]^=a[i][j-1];
b++;
}
}
}
}
for(i=0;i<4;i++)
{
for(j=0;j<3;j++)
{
if(a[i][j]==a[i][j+1]&&a[i][j]!=0)
{
a[i][j]+=a[i][j+1];
a[i][j+1]=0;
score+=a[i][j];
b++;
}
}
}
for(k=0;k<3;k++)
{
for(i=3;i>=0;i--)
{
for(j=3;j>=1;j--)
{
if(a[i][j]!=0&&a[i][j-1]==0)
{
a[i][j]^=a[i][j-1];
a[i][j-1]^=a[i][j];
a[i][j]^=a[i][j-1];
}
}
}
}
if(b!=0)
{
rand_num();
b=0;
}
gotoxy(0,0);
printf_num();
}
if(N=='s')
{
for(k=0;k<3;k++)
{
for(i=0;i<4;i++)
{
for(j=0;j<3;j++)
{
if(a[j][i]!=0&&a[j+1][i]==0)
{
a[j][i]^=a[j+1][i];
a[j+1][i]^=a[j][i];
a[j][i]^=a[j+1][i];
b++;
}
}
}
}
for(i=3;i>=0;i--)
{
for(j=3;j>0;j--)
{
if(a[j][i]==a[j-1][i]&&a[j][i]!=0)
{
a[j][i]+=a[j-1][i];
a[j-1][i]=0;
score+=a[j][i];
b++;
}
}
}
for(k=0;k<3;k++)
{
for(i=0;i<4;i++)
{
for(j=0;j<3;j++)
{
if(a[j][i]!=0&&a[j+1][i]==0)
{
a[j][i]^=a[j+1][i];
a[j+1][i]^=a[j][i];
a[j][i]^=a[j+1][i];
}
}
}
}
if(b!=0)
{
rand_num();
b=0;
}
gotoxy(0,0);
printf_num();
}
if(N=='w')
{
for(k=0;k<3;k++)
{
for(i=0;i<4;i++)
{
for(j=0;j<3;j++)
{
if(a[j][i]==0&&a[j+1][i]!=0)
{
a[j][i]^=a[j+1][i];
a[j+1][i]^=a[j][i];
a[j][i]^=a[j+1][i];
b++;
}
}
}
}
for(i=0;i<4;i++)
{
for(j=0;j<3;j++)
{
if(a[j][i]==a[j+1][i]&&a[j][i]!=0)
{
a[j][i]+=a[j+1][i];
a[j+1][i]=0;
score+=a[j][i];
b++;
}
}
}
for(k=0;k<3;k++)
{
for(i=3;i>=0;i--)
{
for(j=3;j>0;j--)
{
if(a[j][i]!=0&&a[j-1][i]==0)
{
a[j-1][i]=a[j][i];
a[j][i]=0;
b++;
}
}
}
}
if(b!=0)
{
rand_num();
b=0;
}
gotoxy(0,0);
printf_num();
}
//save_data();
}
}




void menu()
{
char n;
system("cls"); 
cout<<"\n\n\n\n\n\n\n";
cout<<"            2048"<<endl;
cout<<" 1.开始新游戏"<<endl;
cout<<" 2.继续游戏"<<endl;
cout<<" 3.游戏说明"<<endl;
cout<<" 4.排行榜"<<endl;
cout<<" 0.退出游戏"<<endl;
n=getch();
switch(n)
{
case '1':{
system("cls");
srand(time(0));
rand_num();
rand_num();
move();
}
case '2':{
read_data();
system("cls");
move();
break;
}
case '3':{
system("cls");
cout<<"\n\n\n\n\n\n\n W:向上\n";
cout<<" A:向左\n"; 
cout<<" S:向下\n"; 
cout<<" D:向右\n";
cout<<" 通过向上/下/左/右四个方向移动,将数字方块向上/下/左/右移动并将相等的数字合并相加\n 若没有空格子并且数字间无法移动/合并时游戏结束。" ;
cout<<"\n    按任意键返回菜单\n";
getch();
menu();
break;

case '4':{
read_score();
cout<<"\n    按任意键返回菜单\n";
getch();
menu();
break;
}
case '0':{
system("cls");
cout<<"\n\n\n\n\n\n\n Thanks for using"<<endl;
getchar();
exit(0);
}
default:menu();

}


int main()
{
system("color F0");
system("mode con cols=115 lines=28") ;
menu();
return 0;
 } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值