讲师中心 微信公众号

工具推荐

视频效率加速
立刻MV
立刻MV

低成本歌曲 MV、视频生成

Seko
Seko

AI短剧一键生成成片

AniShort
AniShort

AI短剧协同制作平台

Laper
Laper

剧本策划到成片协作

C语言实现2048游戏(Windows版)

冬雪君_6218

冬雪君_6218

发布时间:2025-05-18 09:46:26

|

596人浏览过

|

来源于php中文网

原创

一、游戏介绍

二、游戏规则

三、核心算法

1、方块的移动和合并

代码语言:javascript代码运行次数:0运行复制
 主要思想:把游戏数字面板抽象成4行4列的二维数组a[4][4],值为0的位置表示空方块,其他表示对应数字方块。把每一行同等对待,只研究一行的移动和合并算法,然后可以通过遍历行来实现所有行的移动合并算法。在一行中,用b[4]表示一行的一维数组,使用两个下标变量来遍历列项,这里使用j和k,其中j总在k的后面,用来寻找k项后面第一个不为0的数字,而k项用于表示当前待比较的项,总是和j项之间隔着若干个数字0,或者干脆紧挨着。不失一般性,考虑往左滑动时,初始情况下j等于1,而k等于0,接着判断j项数字是否大于0,若是,则判断j项和k项数字的关系,分成3种情况处理,分别是(合并)P1: b[k]==b[j],(移动)P2: b[k]==0和(碰撞)P3: b[k]!=0且b[k]!=b[j];若否,则j自加1,然后继续寻找k项后面第一个不为0的数字。 其中P1,P2和P3分别对应如下: (合并)P1:b[k]==b[j],则b[k] = 2 * b[k](说明两数合并了),且b[j] = 0(合并之后要将残留的j项值清零),接着k自加1,然后进行下一次循环。 (移动)P2:b[k]==0,则表示b[j]之前全是空格子,此时直接移动b[j]到k的位置,也就是b[k] = b[j],然后b[j] = 0(移动后将残留的j项值清零),接着k值不变,然后进行下一次循环。 (碰撞)P3:b[k]!=0且b[k]!=b[j],则表示两数不相等且都不为0,此时将两数靠在一起,也就是b[k+1] = b[j]。接着分两种小情况,若j!=k+1,则b[j] = 0(移动后将残留的j项值清零);若否,则表示两数原先就靠在一起,则不进行特殊处理(相当于未移动)。接着k自加1,然后进行下一次循环。 举一个P1的例子,流程表示如下: 一行内移动合并算法描述如下(此例为左移情况,其他方向与之类似,区别仅仅是遍历二维数组的行项和列项的方式):
代码语言:javascript代码运行次数:0运行复制
int j, k;for (j = 1, k = 0; j < 4; j++) {    if (b[j] > 0) { /* 找出k后面第一个不为空的项,下标为j,之后分三种情况 */        if (b[k] == b[j]) { /* P1情况,合并 */            b[k] = 2 * b[k];            b[j] = 0;            k = k + 1;        } else if (b[k] == 0) { /* P2情况,移动 */            b[k] = b[j];            b[j] = 0;        } else { /* P3情况,碰撞 */            b[k + 1] = b[j];            if (j != k + 1) { /* 原先两数不挨着 */                b[j] = 0;            }            k = k + 1;        }    }}

2、判断游戏是否结束

立即学习“C语言免费学习笔记(深入)”;

Linux Omniscient
Linux Omniscient

>全知全能技能Linux版。

下载
代码语言:javascript代码运行次数:0运行复制
 核心思想:遍历二维数组,看是否存在横向和纵向两个相邻的元素相等,若存在,则游戏不结束,若不存在,则游戏结束。 算法代码描述如下(board表示真正的游戏源码中使用的二维数组):
代码语言:javascript代码运行次数:0运行复制
/* 检查游戏是否结束 函数定义 */void check_game_over() {    int i;    for (i = 0; i < 4; ++i) {        int j;        for (j = 0; j < 3; ++j) {            /* 横向和纵向比较挨着的两个元素是否相等,若有相等则游戏不结束 */            if (board[i][j] == board[i][j + 1] || board[j][i] == board[j + 1][i]) {                if_game_over = 0;                return;            }        }    }    if_game_over = 1;}

3、生成随机数

代码语言:javascript代码运行次数:0运行复制
 核心思想:根据生成的随机数,对一定的值进行取模,达到生成一定概率的数。在本游戏中,设定4出现的概率为1/10,于是可以利用系统提供的随机数函数生成一个数,然后对10取余,得到的数若大于0则在游戏面板空格处生成一个2,若余数等于0,则生成4。在选择将在哪一个空格出生成数的时候,也是根据系统提供的随机函数生成一个数,然后对空格数取余,然后在第余数个空格出生成数字。 算法代码描述如下(board表示真正的游戏源码中使用的二维数组):
代码语言:javascript代码运行次数:0运行复制
/* 生成随机数 函数定义 */void add_rand_num() {    srand((unsigned int) time(0));    int n = rand() % get_null_count(); /* 确定在何处空位置生成随机数 */    int i;    for (i = 0; i < 4; ++i) {        int j;        for (j = 0; j < 4; ++j) {            /* 定位待生成的位置 */            if (board[i][j] == 0 && n-- == 0) {                board[i][j] = (rand() % 10 ? 2 : 4); /* 生成数字2或4,生成概率为9:1 */                return;            }        }    }}

4、绘制界面

代码语言:javascript代码运行次数:0运行复制
 核心思想:利用系统提供的控制台界面清屏功能,达到刷新界面的效果,利用控制制表符位置,达到绘制游戏数字面板的效果。 由于绘制界面不算是本游戏的本质,且代码段相对较长,所以算法描述在这里省略,读者可以参考完整源代码。

5、计算得分

代码语言:javascript代码运行次数:0运行复制
 核心思想:两块带数字的方格合并后的数字为合并的得分,一次上下左右移动后游戏面板上所有合并的得分总和为一次移动的得分,多次移动的得分进行累加作为当前总得分。 如果当前总得分(SCORE)超过最高分(BEST),则最高分被改写为当前总得分,并存储下来,下次启动游戏时会自动载入本机存储的最高分。

四、完整源代码如下,敬请读者批评指正:

代码语言:javascript代码运行次数:0运行复制
#include <time.h>   /* 包含设定随机数种子所需要的time()函数 */#include <stdio.h>  /* 包含C的IO读写功能 */#include <stdlib.h> /* 包含C标准库的功能 */#ifdef _WIN32/* 包含Windows平台相关函数,包括控制台界面清屏及光标设定等功能 */#include <conio.h>#include <windows.h>#include <io.h>#include <direct.h>#include <Shlobj.h>#else/* 包含Linux平台相关函数,包括控制台界面清屏及光标设定等功能 */#include <termio.h>#include <unistd.h>#include <bits/signum.h>#include <signal.h>#define KEY_CODE_UP    0x41#define KEY_CODE_DOWN  0x42#define KEY_CODE_LEFT  0x44#define KEY_CODE_RIGHT 0x43#define KEY_CODE_QUIT  0x71struct termios old_config; /* linux下终端属性配置备份 */#endifstatic char config_path[4096] = {0}; /* 配置文件路径 */static void init_game();    /* 初始化游戏 */static void loop_game();    /* 游戏循环 */static void reset_game();   /* 重置游戏 */static void release_game(int signal); /* 释放游戏 */static int read_keyboard();static void move_left();  /* 左移 */static void move_right(); /* 右移 */static void move_up();    /* 上移 */static void move_down();  /* 下移 */static void add_rand_num();    /* 生成随机数,本程序中仅生成2或4,概率之比设为9:1 */static void check_game_over(); /* 检测是否输掉游戏,设定游戏结束标志 */static int get_null_count();   /* 获取游戏面板上空位置数量 */static void clear_screen();    /* 清屏 */static void refresh_show();    /* 刷新界面显示 */static int board[4][4];     /* 游戏数字面板,抽象为二维数组 */static int score;           /* 游戏得分 */static int best;            /* 游戏最高分 */static int if_need_add_num; /* 是否需要生成随机数标志,1表示需要,0表示不需要 */static int if_game_over;    /* 是否游戏结束标志,1表示游戏结束,0表示正常 */static int if_prepare_exit; /* 是否准备退出游戏,1表示是,0表示否 *//* main函数 函数定义 */int main(int argc, char *argv[]) {    init_game();    loop_game();    release_game(0);    return 0;}/* 读取键盘 函数定义 */int read_keyboard() {#ifdef _WIN32    return _getch();#else    int key_code;    if (read(0, &key_code, 1) < 0) {        return -1;    }    return key_code;#endif}/* 开始游戏 函数定义 */void loop_game() {    while (1) {        int cmd = read_keyboard(); /* 接收标准输入流字符命令 */        /* 判断是否准备退出游戏 */        if (if_prepare_exit) {            if (cmd == 'y' || cmd == 'Y') {                /* 退出游戏,清屏后退出 */                clear_screen();                return;            } else if (cmd == 'n' || cmd == 'N') {                /* 取消退出 */                if_prepare_exit = 0;                refresh_show();                continue;            } else {                continue;            }        }        /* 判断是否已经输掉游戏 */        if (if_game_over) {            if (cmd == 'y' || cmd == 'Y') {                /* 重玩游戏 */                reset_game();                continue;            } else if (cmd == 'n' || cmd == 'N') {                /* 退出游戏,清屏后退出  */                clear_screen();                return;            } else {                continue;            }        }        if_need_add_num = 0; /* 先设定不默认需要生成随机数,需要时再设定为1 */#ifdef _WIN32        /* 命令解析,w,s,a,d字符代表上下左右命令,q代表退出 */        switch (cmd) {          case 'a':          case 75:move_left();            break;          case 's':          case 80:move_down();            break;          case 'w':          case 72:move_up();            break;          case 'd':          case 77:move_right();            break;          case 'q':          case 27:if_prepare_exit = 1;            break;          default:continue;        }#else        /* 命令解析,上下左右箭头代表上下左右命令,q代表退出 */        switch (cmd) {            case 'a':            case KEY_CODE_LEFT:move_left();                break;            case 's':            case KEY_CODE_DOWN:move_down();                break;            case 'w':            case KEY_CODE_UP:move_up();                break;            case 'd':            case KEY_CODE_RIGHT:move_right();                break;            case KEY_CODE_QUIT:if_prepare_exit = 1;                break;            default:continue;        }#endif        /* 打破得分纪录 */        if (score > best) {            best = score;            FILE *fp = fopen(config_path, "w");            if (fp) {                fwrite(&best, sizeof(best), 1, fp);                fclose(fp);            }        }        /* 默认为需要生成随机数时也同时需要刷新显示,反之亦然 */        if (if_need_add_num) {            add_rand_num();            refresh_show();        } else if (if_prepare_exit) {            refresh_show();        }    }}/* 重置游戏 函数定义 */void reset_game() {    score = 0;    if_need_add_num = 1;    if_game_over = 0;    if_prepare_exit = 0;    /* 了解到游戏初始化时出现的两个数一定会有个2,所以先随机生成一个2,其他均为0 */    int n = rand() % 16;    int i;    for (i = 0; i < 4; ++i) {        int j;        for (j = 0; j < 4; ++j) {            board[i][j] = (n-- == 0 ? 2 : 0);        }    }    /* 前面已经生成了一个2,这里再生成一个随机的2或者4,概率之比9:1 */    add_rand_num();    /* 在这里刷新界面并显示的时候,界面上已经默认出现了两个数字,其他的都为空(值为0) */    refresh_show();}/* 生成随机数 函数定义 */void add_rand_num() {    srand((unsigned int) time(0));    int n = rand() % get_null_count(); /* 确定在何处空位置生成随机数 */    int i;    for (i = 0; i < 4; ++i) {        int j;        for (j = 0; j < 4; ++j) {            /* 定位待生成的位置 */            if (board[i][j] == 0 && n-- == 0) {                board[i][j] = (rand() % 10 ? 2 : 4); /* 生成数字2或4,生成概率为9:1 */                return;            }        }    }}/* 获取空位置数量 函数定义 */int get_null_count() {    int n = 0;    int i;    for (i = 0; i < 4; ++i) {        int j;        for (j = 0; j < 4; ++j) {            board[i][j] == 0 ? ++n : 1;        }    }    return n;}/* 检查游戏是否结束 函数定义 */void check_game_over() {    int i;    for (i = 0; i < 4; ++i) {        int j;        for (j = 0; j < 3; ++j) {            /* 横向和纵向比较挨着的两个元素是否相等,若有相等则游戏不结束 */            if (board[i][j] == board[i][j + 1] || board[j][i] == board[j + 1][i]) {                if_game_over = 0;                return;            }        }    }    if_game_over = 1;}/* * 如下四个函数,实现上下左右移动时数字面板的变化算法 * 左和右移动的本质一样,区别仅仅是列项的遍历方向相反 * 上和下移动的本质一样,区别仅仅是行项的遍历方向相反 * 左和上移动的本质也一样,区别仅仅是遍历时行和列互换*//*  左移 函数定义 */void move_left() {    /* 变量i用来遍历行项的下标,并且在移动时所有行相互独立,互不影响 */    int i;    for (i = 0; i < 4; ++i) {        /* 变量j为列下标,变量k为待比较(合并)项的下标,循环进入时k<j */        int j, k;        for (j = 1, k = 0; j < 4; ++j) {            if (board[i][j] > 0) /* 找出k后面第一个不为空的项,下标为j,之后分三种情况 */            {                if (board[i][k] == board[i][j]) {                    /* 情况1:k项和j项相等,此时合并方块并计分 */                    score += board[i][k++] *= 2;                    board[i][j] = 0;                    if_need_add_num = 1; /* 需要生成随机数和刷新界面 */                } else if (board[i][k] == 0) {                    /* 情况2:k项为空,则把j项赋值给k项,相当于j方块移动到k方块 */                    board[i][k] = board[i][j];                    board[i][j] = 0;                    if_need_add_num = 1;                } else {                    /* 情况3:k项不为空,且和j项不相等,此时把j项赋值给k+1项,相当于移动到k+1的位置 */                    board[i][++k] = board[i][j];                    if (j != k) {                        /* 判断j项和k项是否原先就挨在一起,若不是则把j项赋值为空(值为0) */                        board[i][j] = 0;                        if_need_add_num = 1;                    }                }            }        }    }}/* 右移 函数定义 */void move_right() {    /* 仿照左移操作,区别仅仅是j和k都反向遍历 */    int i;    for (i = 0; i < 4; ++i) {        int j, k;        for (j = 2, k = 3; j >= 0; --j) {            if (board[i][j] > 0) {                if (board[i][k] == board[i][j]) {                    score += board[i][k--] *= 2;                    board[i][j] = 0;                    if_need_add_num = 1;                } else if (board[i][k] == 0) {                    board[i][k] = board[i][j];                    board[i][j] = 0;                    if_need_add_num = 1;                } else {                    board[i][--k] = board[i][j];                    if (j != k) {                        board[i][j] = 0;                        if_need_add_num = 1;                    }                }            }        }    }}/* 上移 函数定义 */void move_up() {    /* 仿照左移操作,区别仅仅是行列互换后遍历 */    int i;    for (i = 0; i < 4; ++i) {        int j, k;        for (j = 1, k = 0; j < 4; ++j) {            if (board[j][i] > 0) {                if (board[k][i] == board[j][i]) {                    score += board[k++][i] *= 2;                    board[j][i] = 0;                    if_need_add_num = 1;                } else if (board[k][i] == 0) {                    board[k][i] = board[j][i];                    board[j][i] = 0;                    if_need_add_num = 1;                } else {                    board[++k][i] = board[j][i];                    if (j != k) {                        board[j][i] = 0;                        if_need_add_num = 1;                    }                }            }        }    }}/* 下移 函数定义 */void move_down() {    /* 仿照左移操作,区别仅仅是行列互换后遍历,且j和k都反向遍历 */    int i;    for (i = 0; i < 4; ++i) {        int j, k;        for (j = 2, k = 3; j >= 0; --j) {            if (board[j][i] > 0) {                if (board[k][i] == board[j][i]) {                    score += board[k--][i] *= 2;                    board[j][i] = 0;                    if_need_add_num = 1;                } else if (board[k][i] == 0) {                    board[k][i] = board[j][i];                    board[j][i] = 0;                    if_need_add_num = 1;                } else {                    board[--k][i] = board[j][i];                    if (j != k) {                        board[j][i] = 0;                        if_need_add_num = 1;                    }                }            }        }    }}/* 清屏 */void clear_screen() {#ifdef _WIN32    /* 重设光标输出位置清屏可以减少闪烁,system("cls")为备用清屏命令,均为Windows平台相关*/    COORD pos = {0, 0};    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);    CONSOLE_CURSOR_INFO info = {1, 0};    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &info);#else    printf("c");     /* linux下的清屏命令 */    printf("[?25l"); /* linux下的隐藏输入光标 */#endif}/* 刷新界面 函数定义 */void refresh_show() {    clear_screen();    printf("



");    printf("                  GAME: 2048     SCORE: %05d     BEST: %06d
", score, best);    printf("               --------------------------------------------------");    /* 绘制方格和数字 */    printf("

                             ┌────┬────┬────┬────┐
");    int i;    for (i = 0; i < 4; ++i) {        printf("                             │");        int j;        for (j = 0; j < 4; ++j) {            if (board[i][j] != 0) {                if (board[i][j] < 10) {                    printf("  %d │", board[i][j]);                } else if (board[i][j] < 100) {                    printf(" %d │", board[i][j]);                } else if (board[i][j] < 1000) {                    printf(" %d│", board[i][j]);                } else if (board[i][j] < 10000) {                    printf("%4d│", board[i][j]);                } else {                    int n = board[i][j];                    int k;                    for (k = 1; k < 20; ++k) {                        n = n >> 1;                        if (n == 1) {                            printf("2^%02d│", k); /* 超过四位的数字用2的幂形式表示,如2^13形式 */                            break;                        }                    }                }            } else printf("    │");        }        if (i < 3) {            printf("
                             ├────┼────┼────┼────┤
");        } else {            printf("
                             └────┴────┴────┴────┘
");        }    }    printf("
");    printf("               --------------------------------------------------
");    printf("                  [W]:UP [S]:DOWN [A]:LEFT [D]:RIGHT [Q]:EXIT");    if (get_null_count() == 0) {        check_game_over();        /* 判断是否输掉游戏 */        if (if_game_over) {            printf("
                      GAME OVER! TRY THE GAME AGAIN? [Y/N]:     ");#ifdef _WIN32            CONSOLE_CURSOR_INFO info = {1, 1};            SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &info);#else            printf("[?25h"); /* linux下的显示输入光标 */#endif        }    }    /* 判断是否准备退出游戏 */    if (if_prepare_exit) {        printf("
                   DO YOU REALLY WANT TO QUIT THE GAME? [Y/N]:   ");#ifdef _WIN32        CONSOLE_CURSOR_INFO info = {1, 1};            SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &info);#else        printf("[?25h"); /* linux下的显示输入光标 */#endif    }    fflush(0); /* 刷新输出缓冲区 */}/* 初始化游戏 */void init_game() {#ifdef _WIN32    system("cls");    /* 获取游戏存档路径,Windows下放在C:UsersUserNameAppDataLocal„8目录下 */    char m_lpszDefaultDir[MAX_PATH];    char szDocument[MAX_PATH] = {0};    memset(m_lpszDefaultDir, 0, _MAX_PATH);    LPITEMIDLIST pidl = NULL;    SHGetSpecialFolderLocation(NULL, CSIDL_LOCAL_APPDATA, &pidl);    if (pidl && SHGetPathFromIDList(pidl, szDocument)) {    GetShortPathName(szDocument, m_lpszDefaultDir, _MAX_PATH);    }    sprintf(config_path, "%s\2048", m_lpszDefaultDir);    if (_access(config_path, 0) == -1) {    _mkdir(config_path);    }    sprintf(config_path, "%s\2048\2048.dat", m_lpszDefaultDir);#else    /* 获取游戏存档路径,Linux下放在当前用户主目录下 */    sprintf(config_path, "%s/.2048", getenv("HOME"));    tcgetattr(0, &old_config);              /* 获取终端属性 */    struct termios new_config = old_config; /* 创建新的终端属性 */    new_config.c_lflag &= ~ICANON;          /* 设置非正规模式 */    new_config.c_lflag &= ~ECHO;            /* 关闭输入回显 */    new_config.c_cc[VMIN] = 1;              /* 设置非正规模式下的最小字符数 */    new_config.c_cc[VTIME] = 0;             /* 设置非正规模式下的读延时 */    tcsetattr(0, TCSANOW, &new_config);     /* 设置新的终端属性 */    printf("[?25l");    signal(SIGINT, release_game);#endif    /* 读取游戏最高分数 */    FILE *fp = fopen(config_path, "r");    if (fp) {        fread(&best, sizeof(best), 1, fp);        fclose(fp);    } else {        best = 0;        fp = fopen(config_path, "w");        if (fp) {            fwrite(&best, sizeof(best), 1, fp);            fclose(fp);        }    }    reset_game();}/* 释放游戏 */void release_game(int signal) {#ifdef _WIN32    system("cls");    CONSOLE_CURSOR_INFO info = {1, 1};    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &info);#else    if (signal == SIGINT) {        printf("
");    }    tcsetattr(0, TCSANOW, &old_config); /* 还原回旧的终端属性 */    printf("[?25h");#endif    exit(0);}

五、运行界面如下,仅供读者参考玩乐:

代码语言:javascript代码运行次数:0运行复制
 其中,按方向键,或者w、s、a、d键为上、下、左、右移动,按q键为退出游戏。
C语言实现2048游戏(Windows版)

相关文章

在线游戏
在线游戏

海量精品小游戏合集,无需安装即点即玩,休闲益智、动作闯关应有尽有,秒开即玩,轻松解压,快乐停不下来

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

码上飞
码上飞 Hot

一款基于自然语言的AI应用开发平台,可根据用户描述自动生成应用程序,帮助个人和团队快速完成应用原型与开发。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

相关专题

更多
windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

3479

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

3018

2023.07.27

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

1548

2023.08.01

windows查看端口被占用的情况
windows查看端口被占用的情况

windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。

2739

2023.08.02

windows无法访问共享电脑
windows无法访问共享电脑

在现代社会中,共享电脑是办公室和家庭的重要组成部分。然而,有时我们可能会遇到Windows无法访问共享电脑的问题。这个问题可能会导致数据无法共享,影响工作和生活的正常进行。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

3370

2023.08.08

windows自动更新
windows自动更新

Windows操作系统的自动更新功能可以确保系统及时获取最新的补丁和安全更新,以提高系统的稳定性和安全性。然而,有时候我们可能希望暂时或永久地关闭Windows的自动更新功能。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1737

2023.08.10

windows boot manager
windows boot manager

windows boot manager无法开机的解决方法:1、系统文件损坏,使用Windows安装光盘或USB启动盘进入恢复环境,选择修复计算机,然后选择自动修复;2、引导顺序错误,进入恢复环境,选择命令提示符,输入命令"bootrec /fixboot"和"bootrec /fixmbr",然后重新启动计算机;3、硬件问题,使用硬盘检测工具进行扫描和修复;4、重装操作系统。本专题还提供其他解决

2537

2023.08.28

windows锁屏快捷键
windows锁屏快捷键

windows锁屏快捷键是Windows键+L、Ctrl+Alt+Del、Windows键+D、Windows键+P和Windows键+R。本专题为大家提供windows相关的文章、下载、课程内容,供大家免费下载体验。

5487

2023.08.30

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

0

2026.11.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn