C语言实现连连看

通过C代码实现的连连看小游戏,以下是源码和注释:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <windows.h>    //Windows平台相关函数

#define MAXROW 9
#define MAXCOL 16 //游戏图板的最大行数(Row)和最大列数(Column)
typedef unsigned char bool;
#define true 1
#define false 0
int brd[MAXROW + 2][MAXCOL + 2];    //描述图板(board)的二维整型数组
int row, col, pic;    //游戏中使用的图板的行数和列数,游戏中的图片种类数
int X0 = 0, Y0 = 1;    //绘制图板时的左上角起始坐标(X0, Y0)

typedef struct Dot {    //平面点坐标结构体类型struct Dot
    int x, y;
} Dot;     //用typedef命令定义类型别名Dot

void gotoxy(short x, short y) { //定位光标位置到(x,y)
    static COORD crd;    //定义结构体变量crd(使用频繁,所以定义为静态变量)
    crd.X = x;
    crd.Y = y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), crd);
}

void showcursor(bool visible) {  //显示或隐藏光标
    CONSOLE_CURSOR_INFO cursor = { 20, visible };
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor);
}

void clrscr() {    //清空屏幕
    HANDLE hdout = GetStdHandle(STD_OUTPUT_HANDLE);    //获取标准输出设备的句柄
    CONSOLE_SCREEN_BUFFER_INFO csbi;    //定义表示屏幕缓冲区属性的变量
    GetConsoleScreenBufferInfo(hdout, &csbi);  //获取标准输出设备的屏幕缓冲区属性
    DWORD size = csbi.dwSize.X * csbi.dwSize.Y, num = 0; //定义双字节变量
    COORD pos = { 0, 0 };    //表示坐标的变量(初始化为左上角(0, 0)点)
    //把窗口缓冲区全部填充为空格并填充为默认颜色(清屏)
    FillConsoleOutputCharacter(hdout, ' ', size, pos, &num);
    FillConsoleOutputAttribute(hdout, csbi.wAttributes, size, pos, &num);
    SetConsoleCursorPosition(hdout, pos);    //光标定位到窗口左上角
}

void initBoard(int level) {    //根据游戏难度(level)初始化图板
    int ix, iy, jx, jy, k;

    //整个图板(MAXROW行 * MAXCOL列)初始化为空
    for (iy = 0; iy < MAXROW; iy++)
        for (ix = 0; ix < MAXCOL; ix++)
            brd[iy][ix] = 0;

    //根据游戏难度(level:0-容易; 1-中等; 2-困难)设定图板的行列数和所使用的牌面种类
    row = (level == 0 ? 7 : (level == 1 ? 8 : 9));    //行数
    col = (level == 0 ? 12 : (level == 1 ? 14 : 16));    //列数(必须为偶数)
    pic = row * col / 4; //牌面种类数:每种牌面出现4次,三种难度下分别为21、28、36

    //在游戏图板(row行 * col列)范围内,左右对称地顺序填入牌面编号1--pic
    for (iy = 1, k = 0; iy <= row; iy++)
        for (ix = 1; ix <= col / 2; ix++)
            brd[iy][ix] = brd[iy][col / 2 + ix] = (k++) % pic + 1;
    //把已经顺序对称填入的牌面编号随机打乱
    for (iy = 1; iy <= row; iy++)
        for (ix = 1; ix <= col; ix++) {
            jx = rand() % col + 1;
            jy = rand() % row + 1;
            k = brd[iy][ix];
            brd[iy][ix] = brd[jy][jx];
            brd[jy][jx] = k;
        }
    return;
}

enum COLORS {
    BLACK, BLUE, GREEN, CYAN, RED, MAGENTA, BROWN, LIGHTGRAY, DARKGRAY,
    LIGHTBLUE, LIGHTGREEN, LIGHTCYAN, LIGHTRED, LIGHTMAGENTA, YELLOW, WHITE
};   //定义表示颜色的枚举类型,枚举元素值为0--15

void drawxy(int x, int y, int bright) {    //绘制图板中坐标为(x, y)的格点,bright为是否高亮
    static HANDLE hdout = 0;
    static char mark[37][3] = { " ", "●", "■", "□", "◆", "◇", "◎", "★",
        "☆", "☉", "▲", "△", "▼", "▽", "@", "#", "*", "=",
        "A", "B", "C", "D", "天", "地", "山", "水", "日", "月", "星",
        "T", "U", "W", "X", "鸟", "花", "虫", "鱼"
    };
    hdout = GetStdHandle(STD_OUTPUT_HANDLE);    //获取标准输出的句柄
    gotoxy(X0 + x * 2, Y0 + y);
    if (bright)
        SetConsoleTextAttribute(hdout, GREEN * 16 + YELLOW); //绿底黄字
    else
        SetConsoleTextAttribute(hdout, BLUE * 16 + WHITE); //蓝底白字
    printf("%s", mark[brd[y][x]]);    //输出牌面字符
    return;
}

void drawBoard() {    //绘制整个图板
    //    gotoxy(0, 0);
    //    cout << "连 连 看";
    int ix, iy;
    for (ix, iy = 0; iy <= row + 1; iy++)
        for (ix = 0; ix <= col + 1; ix++)
            drawxy(ix, iy, 0);
    return;
}

void drawBtns(int level, int cur) {    //在界面顶行绘制仿真按钮
    int k;
    static HANDLE hdout = 0;
    char btns[7][7] = { "[新建]", "[容易]", "[中等]", "[困难]", "[提示]", "[混洗]", "[退出]" };
    hdout = GetStdHandle(STD_OUTPUT_HANDLE);    //获取标准输出的句柄
    for (k = 0; k < 7; k++) {
        SetConsoleTextAttribute(hdout, BLACK * 16 + WHITE); //黑底白字
        if (level + 1 == k) //游戏难度level 值为 0, 1, 2,对应 k 值为 1, 2, 3
            SetConsoleTextAttribute(hdout, GREEN * 16 + WHITE); //绿底白字
        if (cur == k)    //鼠标当前悬浮所在的按钮
            SetConsoleTextAttribute(hdout, WHITE * 16 + BLUE); //白底蓝字
        gotoxy(8 * k, 0);
        printf("%s",btns[k]);
    }
    SetConsoleTextAttribute(hdout, BLACK * 16 + WHITE); //默认黑底白字
    return;
}

int turntype(Dot c1, Dot t, Dot c2) { //判断c1-t-c2的转折类型
    if ((c1.y == t.y && c1.x > t.x && t.y > c2.y)
      

7-7 简易连连看 (15分) 本题要求实现一个简易连连看游戏模拟程序。 给定一个2N×2N的方阵网格游戏盘面,每个格子中放置一些符号。这些符号一定是成对出现的,同一个符号可能不止一对。程序读入玩家给出的一对位置(x ​1 ​​ ,y ​1 ​​ )、(x ​2 ​​ ,y ​2 ​​ ),判断这两个位置上的符号是否匹配。如果匹配成功,则将两个符号消为“*”并输出消去后的盘面;否则输出“Uh-oh”。若匹配错误达到3次,则输出“Game Over”并结束游戏。或者当全部符号匹配成功,则输出“Congratulations!”,然后结束游戏。 输入格式: 输入在一行中给一个正整数N(<5)。随后2N行,每行2N个大写英文字母(其间以1个空格分隔),表示游戏盘面。盘面之后给出一个正整数K,随后K行,每行按照格式“x ​1 ​​ y ​1 ​​ x ​2 ​​ y ​2 ​​ ”给出一个玩家的输入。注意格子的行、列编号是从1到2N。 输出格式: 根据玩家的每一步输入,输出相应的结果。输出盘面时注意,每行字符间以1个空格分隔,行末不得有多余空格。 输入样例1: 2 I T I T Y T I A T A T Y I K K T 11 1 1 1 3 4 2 4 3 3 1 4 2 2 2 1 2 3 1 2 4 4 4 3 1 2 1 3 4 3 3 1 4 4 1 2 3 2 4 3 2 1 1 2 2 输出样例1: * T * T Y T I A T A T Y I K K T * T * T Y T I A T A T Y I * * T Uh-oh * * * T Y * I A T A T Y I * * T Uh-oh * * * T Y * I A * A T Y I * * * * * * T * * I A * A T * I * * * * * * * * * I A * A * * I * * * * * * * * * * A * A * * * * * * Congratulations! 输入样例2: 2 I T I T Y T I A T A T Y I K K T 5 1 1 4 4 1 1 2 3 1 1 2 3 2 2 4 1 2 2 3 3 输出样例2: Uh-oh * T I T Y T * A T A T Y I K K T Uh-oh Uh-oh Game Over
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

2193410903

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值