图片配对游戏 [C语言 课程设计]

来源:互联网 发布:银行管理系统java 编辑:程序博客网 时间:2024/06/05 14:50
/**\ 本人简介
 *
 * \ 昵称     :回车键
 * \ QQ号     :1737397473
 * \ QQ交流群 :555404957
 * \ 新浪微博 :http://weibo.com/u/6069955504
 * \ 新浪博客 :http://blog.sina.com.cn/u/6069955504
 *
 */
 
 
/** \ 题目信息 */
/** \
图片配对游戏
(1)任务描述
在一个N*N的矩阵中,随机分布着若干图片,图片一共10种,每种必成对出现,每
个图片占据矩阵中一个元素的位置。游戏开始时,先将分布好图片的矩阵给玩家看一定
时间,然后将图片扣上,游戏开始并计时。玩家选择相同图片位置,一次只能选择两个,若
正确,则这两个图片翻过来;若不正确,则将这两个图片翻过来给玩家看2秒后,再扣过去。
如此进行,直至矩阵中的图片全部翻过来为止。
(2)功能要求
1 矩阵大小允许玩家设定,最小为6*6,最大为16*16.
2 游戏开始前的图片预览时间长短根据矩阵大小设定,为1*N秒。
3 图片随机分布,每次不一定10种图片全出现。
4 游戏结束时,显示玩家所花时间,并允许玩家选择重新游戏或退出。
5 建立排行榜,同一难度级别保留3位的优越成绩。
*/




/** \ 开发平台
 *
 * \  系统 Windows10
 * \  开发环境 Code::Blocks 13.12
 * \  其他C语言开发平台也可以
 *
 */     




/**< 头文件 */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>




/**< 宏定义 */
#define MAX 16/**< 矩阵最大大小 */




/**< 全局变量 */
int size = 0;/**< 矩阵尺寸 */
int matrix[MAX][MAX];/**< 矩阵 保存图片信息 */
int picture[MAX*MAX];/**< 图片信息 */
int status[MAX][MAX];/**< 状态 显示/倒扣 */
int rankinglist[6][3];/**< 排行榜 */
int times[18];/**< 时间 */
int duration;/**< 游戏用时 */




/**< 函数申明 */
int initialize();/**< 初始化 */
int print_data();/**< 打印数据 */
int delayed(int n);/**< 延时 */
int menu();/**< 菜单 */
int new_game();/**< 新游戏 */
int ranking_list();/**< 排行榜 */
int photograph(int x,int y);/**< 图片对应表 */
int save();/**< 保存排行榜 */




/**< 初始化 */
int initialize()
{
    int i = 0,j = 0,k = 0;/**< 循环变量 */
    int t = 0;/**< 图片类型 */
    int x = 0;/**< 图片信息表下标 */


    /**< 随机数种子 */
    srand((unsigned)time(NULL));


    /**< 把矩阵数据全部置为-1 */
    for(i = 0;i < size;i++)
    {
        for(j = 0;j < size;j++)
        {
            matrix[i][j] = -1;
        }
    }


    /**< 把图片信息数据全部置为-1 */
    for(i = 0;i < size * size;i++)
    {
        picture[i] = -1;
    }


    /**< 随机生成图片信息表的图片序号 */
    for(i = 0;i < size * size;)
    {
        /**< 生成图片种类 */
        t = rand() % 10;


        /**< 放入第一个图片 */
        while(1)
        {
            /**< 生成图片信息表下标 */
            x = rand() % (size * size);


            if(picture[x] == -1)/**< 当前图片信息表没有放入图片 */
            {
                picture[x] = t;
                break;
            }
        }


        i++;


        /**< 放入和第一个一样的图片 */
        while(1)
        {
            /**< 生成图片信息表下标 */
            x = rand() % (size * size);


            if(picture[x] == -1)/**< 当前图片信息表没有放入图片 */
            {
                picture[x] = t;
                break;
            }
        }


        i++;
    }


    /**< 把图片信息表中的信息填入到矩阵中 */
    for(i = 0;i < size;i++)
    {
        for(j = 0;j < size;j++)
        {
            matrix[i][j] = picture[k];
            k++;
        }
    }




    /**< 初始化状态表 */
    for(i = 0;i < size;i++)
    {
        for(j = 0;j < size;j++)
        {
            status[i][j] = -1;/**< -1状态未定义 */
        }
    }


    return 0;
}




/**< 打印数据 */
int print_data()
{
    int i = 0,j = 0;
    for(i = 0;i < size;i++)
    {
        for(j = 0;j < size;j++)
        {
            /**< 倒扣状态 */
            if(status[i][j] == 0)
            {
                printf("█");
            }
            /**< 显示状态 */
            else if(status[i][j] == 1)
            {
                photograph(i,j);/**< 图片对应表 */
            }
        }


        printf("\n");
    }


    return 0;
}




/**< 延时 */
int delayed(int n)
{
    while(n--)
    {
        Sleep(1000);/**< 延时1000ms即1s */
    }


    return 0;
}




/**< 菜单 */
int menu()
{
    int choice = 0;/**< 临时变量 记录用户选择 */


    printf("===欢迎进入图片配对游戏===\n");
    printf("        1 新游戏\n");
    printf("        2 排行榜\n");
    printf("        0 退出\n");


    while(1)
    {
        printf("请选择[0-2]:");
        scanf("%d",&choice);
        if(choice >= 0 && choice <= 2)
        {
            break;
        }
    }


    if(choice == 1)
    {
        new_game();/**< 新游戏 */
    }
    else if(choice == 2)
    {
        ranking_list();/**< 排行榜 */
    }
    else
    {
        exit(0);/**< 退出游戏 */
    }


    return 0;
}




/**< 新游戏 */
int new_game()
{
    int i = 0,j = 0;/**< 循环变量 */


    int x0 = 0,y0 = 0,x1 = 0,y1 = 0;/**< 两次输入图片的位置信息 */


    while(1)
    {
        printf("请输入矩阵尺寸([6-16]之间的偶数):");
        scanf("%d",&size);
        getchar();


        if(size % 2 == 0 && (size >= 2 && size <= 16))
        {
            break;
        }
    }


    initialize();/**< 初始化 */


    /**< 更新状态表 */
    for(i = 0;i < size;i++)
    {
        for(j = 0;j < size;j++)
        {
            status[i][j] = 1;/**< 1状态 显示 */
        }
    }


    print_data();/**< 打印数据 */


    delayed(size);/**< 延时1*N秒 */


    system("cls");/**< 清屏 */


    /**< 更新状态表 */
    for(i = 0;i < size;i++)
    {
        for(j = 0;j < size;j++)
        {
            status[i][j] = 0;/**< 0状态 倒扣 */
        }
    }


    print_data();/**< 打印数据 */


    printf("记忆时间到...\n");


    printf("开始游戏...\n");


    clock_t start = clock();/**< 记录开始时间 */
    for(i = 0;i < size * size;)
    {
        printf("请输入第一个图片的坐标(x,y):");
        scanf("%d %d",&x0,&y0);
        getchar();
        printf("请输入第二个图片的坐标(x,y):");
        scanf("%d %d",&x1,&y1);


        /**< 匹配成功 */
        if(matrix[x0][y0] == matrix[x1][y1])
        {
            status[x0][y0] = 1;
            status[x1][y1] = 1;


            i += 2;/**< 匹配成功 图片数量+2 */


            system("cls");/**< 清屏 */
            print_data();/**< 打印数据 */
        }
        /**< 匹配失败 */
        else
        {
            status[x0][y0] = 1;
            status[x1][y1] = 1;


            system("cls");/**< 清屏 */
            print_data();/**< 打印数据 */


            delayed(2);/**< 延时2秒 */


            status[x0][y0] = 0;
            status[x1][y1] = 0;


            system("cls");/**< 清屏 */
            print_data();/**< 打印数据 */
        }
    }


    clock_t finish = clock();/**< 结束时间 */


    duration = (int)(finish - start) / CLOCKS_PER_SEC;


    printf("本次游戏用时: %d s\n",duration);
    getchar();


    save();/**< 保存排行榜 */


    system("cls");/**< 清屏 */
    menu();/**< 返回菜单 */


    return 0;
}




/**< 排行榜 */
int ranking_list()
{
    FILE *fp;/**< 文件指针 */
    int i = 0,j = 0,k = 0;/**< 循环变量 */
    int difficulty = 6;/**< 难度编号 */
    int x;


    if((fp = fopen("rankinglist.txt","r")) == NULL)/**< 打开文件 */
    {
        printf("无法打开文件!\n");
        exit(1);
    }


    while(!feof(fp))/**< 文件没有结束 */
    {
        fscanf(fp,"%d ",&x);/**< 把时间放到数组 */
        times[k++] = x;
    }


    /**< 把文件中的数据放入数组 */
    for(i = 0,k = 0;i < 6;i++)
    {
        for(j = 0;j < 3;j++)
        {
            rankinglist[i][j] = times[k++];
        }
    }


    fclose(fp);/**< 关闭文件 */


    /**< 打印排行榜 */
    printf("==图片配对游戏排行榜==\n");
    printf("难度 冠军 亚军 季军\n");
    for(i = 0,difficulty = 6;i < 6;i++,difficulty += 2)
    {
        printf("%3d",difficulty);
        for(j = 0;j < 3;j++)
        {
            printf("%5d",rankinglist[i][j] );
        }
        printf("\n");
    }


    printf("\n");
    return 0;
}




/**< 图片对应表 */
int photograph(int x,int y)
{
    if(matrix[x][y] == 0)
    {
        printf(" ~");
    }
    else if(matrix[x][y] == 1)
    {
        printf(" !");
    }
    else if(matrix[x][y] == 2)
    {
        printf(" @");
    }
    else if(matrix[x][y] == 3)
    {
        printf(" #");
    }
    else if(matrix[x][y] == 4)
    {
        printf(" $");
    }
    else if(matrix[x][y] == 5)
    {
        printf(" =");
    }
    else if(matrix[x][y] == 6)
    {
        printf(" ^");
    }
    else if(matrix[x][y] == 7)
    {
        printf(" &");
    }
    else if(matrix[x][y] == 8)
    {
        printf(" *");
    }
    else if(matrix[x][y] == 9)
    {
        printf(" +");
    }
    else
    {
        printf("未定义图片!\n");
    }


    return 0;
}




/**< 保存排行榜 */
int save()
{
    int i = 0,j = 0,k = 0;
    int x = 0;


    /**< 更新数据 把这次的时间存到相应的位置 */
    /**< 遍历难度为size的数据 */
    for(i = 0;i < 3;i++)
    {
        /**< 如果新的数据小于原来的数据 刷新数据 */
        if(rankinglist[size / 2 - 3][i] > duration)
        {
            /**< 把后面的数据向后移动一位 */
            for(j = 2;j > i;j++)
            {
                rankinglist[size / 2 - 3][j] = rankinglist[size / 2 - 3][j - 1];
            }
            rankinglist[size / 2 - 3][i] = duration;/**< 把新的数据插入 */
        }
    }


    /**< 把排行榜数据放入时间表 */
    for(i = 0,k = 0;i < 6;i++)
    {
        for(j = 0;j < 3;j++)
        {
            times[k++] = rankinglist[i][j];
        }
    }


    /**< 把更新的数据写入文件 */
    FILE *fp1;/**< 文件指针 */


    /**< 打开文件 */
    fp1 = fopen("rankinglist.txt","w");


    /**< 写入文件 */
    for(i = 0,k = 0;i < 18;i++)
    {
        x = times[k++];
        fprintf(fp1,"%d ",x);/**< 把时间放到数组 */
    }


    fclose(fp1);/**< 关闭文件 */


    return 0;
}




/**< 主函数 */
int main()
{
    /**< 进入菜单 */
    menu();


    return 0;
}




/** \ 感恩
 *
 * \ 1 感谢你的阅读 希望对你有所帮助
 * \ 2 如果喜欢 欢迎转载 评论 如果不喜欢 欢迎指出bug 不足之处 一定改进 
 * \ 3 在这里只是抛砖引玉 希望得到各位大神的指点 写出更好的东西 分享给大家
 * \ 4 希望大家可以一起愉快的交流 也希望大家都愿意分享美好的东西 
 *

 */     



运行结果: