用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;
}