#include<stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#define FILE_NAME "1.txt"
void printarr(int arr[][4]);
int Getcount(int arr[][4]);
void rand_num(int arr[][4]);
void get_slide();
void move(int a[],int *ismove);
void add(int a[4],int *ismove);
void move_left(int arr[][4]);
void move_right(int arr[][4]);
void move_up(int arr[][4]);
void move_down(int arr[][4]);
int success(int arr[][4]);
int isflail(int arr[][4]);
void get_slide();
void welcome();
void play();
int prescore();
void read_file();
void top_player();
void sort();
struct player
{
char name[20];
int score;
}play1;
int flage = 1; //判断是否游戏结束的标志
int footnum = 0; //游戏的步数
//int arr[4][4] = {0};
int arr[][4] = {
{0,0,0,0},
{0,0,0,0},
{0,0,0,0},
{0,0,0,0}
}; //初始的数组
int score_top[5]={0}; //储存的历史数据
int main()
{
play1.score = 0;
// play1.name = "xiaowang";
srand(time(NULL));
rand_num(arr);
rand_num(arr);
//read_file(); //先读取数据
welcome();
//再进行文件的覆盖
//read_file();
//top_player();
// while (flage)
// {
// printf("\n按 w a s d 向上 向左 向右 向下 移动,按 q 键退出;\n");
// printarr(arr);
// printf("------------------\n");
// //printf("flage = %d\n",flage);
// get_slide();
// system("clear");
// if(flage==0){
// break;
// }
// printarr(arr);
// if(success(arr)==0){
// // flage = 0;
// break;
// }
// if (isflail(arr)==0)
// {
// break;
// }
// }
}
//打印二维数组
void printarr(int arr[][4])
{
printf("* * * * * * * * * * * * * * * * * * * * * *\n");
printf("* *\n");
printf("* *\n");
printf("* *\n");
printf("* *\n");
for (int i = 0; i < 4; i++)
{
printf("* * * * * * * * * * * * * * *\n");
printf("* ");
for (int j = 0; j < 4; j++)
{
printf(" *%4d",arr[i][j]);
}
printf(" * *\n");
}
printf("* * * * * * * * * * * * * * *\n");
printf("* *\n");
printf("* 当前得分:%4d 已走步数:%4d *\n",play1.score,footnum);
printf("* *\n");
printf("* *\n");
printf("* * * * * * * * * * * * * * * * * * * * * *\n");
}
/*
获取空位的个数
*/
int Getcount(int arr[][4])
{
int num = 0;
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
if (arr[i][j] == 0)
{
num++;
}
}
}
return num;
}
void rand_num(int a[][4])
{
int temp = 0;
int count = Getcount(a);
int k = rand()%count+1;
//printf("k = %d",k);
//printf("temp = %d",temp);
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
if (a[i][j] == 0)
{
temp++;
if (temp == k)
{
a[i][j] = rand()%10<7?2:4;
}
}
}
}
}
// void get_slide()
// {
// int flage = 1;
// do
// {
// int getchar(void);
// char ch = getchar();
// switch (ch)
// {
// case 'a':
// case 'A':
// printf("向左\n");
// break;
// case 'd':
// case 'D':
// printf("向右\n");
// break;
// case 'w':
// case 'W':
// printf("向上\n");
// break;
// case 's':
// case 'S':
// printf("向下\n");
// break;
// case 'q':
// case 'Q':
// flage = 0;
// printf("退出\n");
// break;
// default:
// break;
// }
// } while (flage);
// }
void add(int a[4],int *ismove)
{
for (int i = 0; i < 3; i++)
{
if (a[i+1] == a[i]&& a[i] != 0)
{
a[i] *= 2;
a[i+1] = 0;
*ismove = 0;
play1.score+=2;
}
}
}
void move(int a[],int *ismove)
{
int i = 0, j = 0; //设置初始值 i 代表非零数字 j 代表0
for (int i = 0; i < 4; i++)
{
if (a[i] != 0) //获取到非零数字的位置
{
a[j] = a[i];
if (i != j)
{
a[i] = 0;
*ismove = 0;
}
j++;
// printf("变化%d\t",a[i]);
}
}
}
//左移函数
void move_left(int a[][4])
{
int ismove = 1; //判断是否发生移动
int temp[4] = {0};
for (int i = 0; i < 4; i++)
{
for (int j = 0; j <4; j++)
{
temp[j] = a[i][j];
}
move(temp,&ismove);
add(temp,&ismove);
move(temp,&ismove);
for (int j = 0; j < 4; j++)
{
a[i][j] = temp[j];
}
}
//printf("ismove = %d\n",ismove);
if (ismove == 0)
{
//printf("进入判断!\n");
rand_num(arr);
footnum++;
}else{
printf("不能向左移动了\n");
}
}
void move_right(int a[][4])
{
int ismove = 1;
int temp[4] = {0};
int k = 0;
for (int i = 0; i < 4; i++)
{
for (int j = 3; j>=0; j--)
{
temp[k] = a[i][j];
k++;
}
move(temp,&ismove);
add(temp,&ismove);
move(temp,&ismove);
for (int j = 0; j < 4; j++)
{
k--;
a[i][j] = temp[k];
}
}
if (ismove == 0)
{
rand_num(arr);
footnum++;
}
}
void move_up(int arr[][4])
{
int ismove = 1;
int temp[4] = {0};
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
temp[j] = arr[j][i];
}
move(temp,&ismove);
add(temp,&ismove);
move(temp,&ismove);
for (int j = 0; j < 4; j++)
{
arr[j][i] = temp[j];
}
}
if (ismove == 0)
{
rand_num(arr);
footnum++;
}
}
void move_down(int arr[][4])
{
int ismove = 1;
int temp[4] = {0};
int k = 0;
for (int i = 0; i < 4; i++)
{
for (int j = 3; j >=0 ; j--)
{
temp[k++] = arr[j][i];
}
move(temp,&ismove);
add(temp,&ismove);
move(temp,&ismove);
// for (int i = 0; i < 4; i++)
// {
// printf("%d\t",temp[i]);
// }
for (int j = 0; j <4; j++)
{
arr[j][i] = temp[--k];
}
}
if (ismove == 0)
{
rand_num(arr);
footnum++;
}
}
//按键
void get_slide() //不能传参 传入参数之后flage恒为1
{
int getchar(void);
char ch = getchar();
//getchar();
switch (ch)
{
case 'a':
case 'A':
move_left(arr);
printf("向左\n");
break;
case 'd':
case 'D':
move_right(arr);
printf("向右\n");
break;
case 'w':
case 'W':
move_up(arr);
printf("向上\n");
break;
case 's':
case 'S':
move_down(arr);
printf("向下\n");
break;
case 'q':
case 'Q':
flage = 0;
printf("退出\n");
break;
}
}
int success(int arr[][4])
{
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
if (arr[i][j] == 2048)
{
flage = 0;
printf("游戏成功!\n");
}
}
}
return flage;
}
int isflail(int arr[][4]) //判断是否失败
{
int bianliang;
printf("空位个数:%d\t",Getcount(arr));
if (Getcount(arr) == 0) //如果棋盘中空的个数为0,则进行判断 判断是否相邻的两个棋子是否相同
{
bianliang = 1;
//printf("bianliang1_1 = %d\n",bianliang);
printf("进入isfalile\n");
// for (int i = 0; i < 4; i++)
// {
// for (int j = 0; j < 4; j++)
// {
// printf("%d",arr[i][j]);
// }
// printf("\n");
// }
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
if ( (arr[i][j] == arr[i][j+1])|| (arr[i][j] == arr[i+1][j]))
{
printf("i,j %d,%d\t",i,j);
flage =1;
bianliang = 0;
//return 1;
}
}
}
// printf("游戏失败!\n");
// return 0;
printf("bianliang = %d\n",bianliang);
if (bianliang == 1)
{
flage = 0;
printf("GAME OVER!\n");
//printarr(arr);
}
}
else{
//printf("进入else里\n");
flage = 1;
}
return flage;
}
void play()
{
while (flage)
{
printf("\n按 w a s d 向上 向左 向右 向下 移动,按 q 键退出;\n");
printf("\n每进行一次成功的相加后分数+2;\n");
printarr(arr);
printf("------------------\n");
//printf("flage = %d\n",flage);
get_slide();
system("clear");
if(flage==0){
break;
}
printarr(arr);
if(success(arr)==0){
// flage = 0;
break;
}
if (isflail(arr)==0)
{
break;
}
}
prescore();
printf("游戏结束!%d\n",play1.score);
}
void welcome() //欢迎界面
{
printf("请输入用户名:");
scanf("%s",play1.name);
printf("**************************2048******************************\n");
printf("\n\t\t全国只有百分之1的人能够通关哦!\n\n");
printf("\t\t亲爱的:%s 请输入游戏选项:\n",play1.name);
printf("\t\t\t1.开始游戏:\n");
printf("\t\t\t2.查看历史排行\n");
printf("\t\t\t3.会员充值\n");
printf("\t\t\t4.关于我们\n");
printf("\t\t-----------------------------\n");
int num = 0;
scanf("%d",&num);
system("clear");
switch (num)
{
case 1: play();//开始游戏
break;
case 2: top_player();//历史排行 .....
break;
case 3: printf("敬请期待!\n");//历史排行 .....
break;
case 4: printf("敬请期待!\n");//历史排行 .....
break;
default:
break;
}
}
// int prescore() //保存分数
// {
// FILE *fp=NULL;
// fp=fopen("/mnt/hgfs/share/第一周/1.txt","rb+");
// if (fp == NULL)
// {
// printf("打开文件失败!\n");
// return 0;
// }
// fprintf(fp,"%d;",score); //写入分数
// fclose(fp);
// }
// void getHight() //将文件内的数字进行排行
// {
// FILE *fp=NULL;
// fp=fopen("/mnt/hgfs/share/第一周/1.txt","r");
// char buf_read[100] = {0};
// while (!feof(fp)) //没有到文件末尾
// {
// memset(buf_read, 0, sizeof(buf_read));
// fread(buf_read,sizeof(int),sizeof(buf_read),fp);
// printf("分数为:%s\n",buf_read);
// }
// char *temp = strtok(buf_read,";"); //取出文件中的数字
// //printf("%d",temp);
// int storescore[100] = {0};
// while(temp)
// {
// temp = strtok(NULL,";");
// printf("%s\n",temp);
// }
// }
void sort()
{
int temp = 0;
for (int i = 0; i < 5-1; i++)
{
for (int j = 0;j<5-i-1;j++)
{
if (score_top[j]<score_top[j+1])
{
temp = score_top[j];
score_top[j] = score_top[j+1];
score_top[j+1] = temp;
}
}
}
}
int prescore() //保存分数
{
//先初始化score数组
read_file();
FILE *fp=fopen("1.txt","w+");
int temp = 0;
if(fp==NULL){
fprintf(fp," %s %d\n;",play1.name,play1.score); //写入分数
}else{
for (int i = 0; i < 5; i++)
{
printf("判断之前:%d\n",score_top[i]);
}
sort();
// for (int i = 0; i < 5; i++) //写入数据之前进行比较,如果写入的数据比排行榜的数据大,则进行替换,若小则不进行操作
// {
// if ((score_top[i] == 0)) //说明这个参数是空 将输入的数据写入文件中
// {
// score_top[i] = play1.score;
// break;
// }
// printf("写入后的:%d",score_top[i]);
// }
int min = score_top[4];
printf("min = %d,sc = %d\n",min,score_top[4]);
if (play1.score>min)
{
score_top[4] = play1.score;
}
sort();
}
for (int i = 0; i < 5; i++)
{
printf("排列后的c:%d\n",score_top[i]);
}
for (int i = 0; i < 5; i++)
{
fprintf(fp,"%s %d\n;",play1.name,score_top[i]); //写入分数
printf("打开成功!\n");
}
// scanf("%s %d")
// fprintf(fp,"%s %d\n",play1.name,play1.score);
fclose(fp);
}
void read_file()//读文件的数据
{
FILE *fp;
int temp = 0;
char name_1[10] = {0};
int score_1 = 0;
fp=fopen("1.txt","r");
fscanf(fp,"%s %d",name_1,&score_1);
int i = 0;
while(!feof(fp)) //当文件为空时结束
{
//printf("%s %d\n",name_1,score_1);//将文件的数据赋值给 a 和 sum 变量,然后在进行输出
score_top[i] = score_1;
fscanf(fp,"%s %d",name_1,&score_1);
i++;
}
// for (int i = 0; i < 5-1; i++)
// {
// for (int j = 0;j<5-i-1;j++)
// {
// if (score_top[j]<score_top[j+1])
// {
// temp = score_top[j];
// score_top[j] = score_top[j+1];
// score_top[j+1] = temp;
// }
// }
// }
fclose(fp);//关闭文件
}
void top_player()
{
read_file();
printf("*****************************龙虎排行榜:***************************\n");
for (int i = 0; i < 5; i++)
{
printf("\t\t\t\tTop%d:%d\n",i+1,score_top[i]);
}
printf("------------------------------------------------------------------\n");
}
完成了游戏的运行 还有数据的排行榜 其他功能待开发