C語言三子棋的實現(xiàn)思路到過程詳解
一、三子棋小游戲的簡單介紹
要說大家都很熟悉的一個小游戲,三子棋算是其中一個了。相信大家都玩過三子棋小游戲,在這里我還是給大家介紹簡單的游戲規(guī)則:
- 一次只能下一個棋子;
- 玩家下完棋子后,電腦下棋子;
- 不能再重復(fù)的位置上下棋子;
- 不管是玩家還是電腦,誰先達到三個棋子連接在一起的時候獲勝;
- 三個棋子的連接包括:橫三個、豎三個、斜三個。
當(dāng)然,熟悉規(guī)則后我們會有一個大概的了解了,那么三子棋游戲的思路及代碼到底是怎么實現(xiàn)的呢?接下來我給大家一一詳細解析一下。
二、三子棋的思路及代碼實現(xiàn)
1、打印游戲菜單
我們實現(xiàn)游戲之前,應(yīng)該想到先給玩家提供一個菜單。這個菜單的功能就是幫助用戶選擇是否要開始游戲。菜單的實現(xiàn)我們可以單獨自定義一個函數(shù),我們用到菜單的時候調(diào)用此函數(shù)即可。
void meau() { printf("*********************\n"); printf("***** 1.play *****\n"); printf("***** 0.exit *****\n"); printf("*********************\n"); }
通過上面的代碼我們可以很容易看出,選擇‘1’是開始游戲,選擇‘0’是退出游戲。
2、選擇是否開始游戲
提到選擇,我們這里可以聯(lián)想到switch-case語句。由上面的菜單可知:選擇‘1’是開始游戲,選擇‘0’是退出游戲。當(dāng)然我們不能排除不小心輸入錯誤,所以這里我們還要考慮到選擇錯誤的情況下要給出相應(yīng)的提示。當(dāng)選擇錯誤時,給出提示且重新選擇,同時再把菜單打印出,提供玩家選擇。那怎么實現(xiàn)重新選擇呢?我們這里其實可以使用do-while()語句。我們先來看一下代碼的實現(xiàn)。
void test() { int input = 0; do { meau(); printf("請選擇是否要開始游戲:"); scanf("%d", &input); switch (input) { case 1: game(); //開始三子棋游戲 break; case 0: printf("退出游戲\n"); break; default: printf("選擇錯誤\n"); } } while (input); }
我們看上面的代碼是放在的一個自定義的test()函數(shù)中,我們只要再主函數(shù)中調(diào)用一下即可。上面的代碼很巧妙,當(dāng)我們輸入‘1’的時候,開始游戲。當(dāng)游戲結(jié)束時,循環(huán)繼續(xù)。其實是實現(xiàn)了一個玩完一局可以反復(fù)玩的效果。當(dāng)我們輸入‘0’的時候,循環(huán)結(jié)束,就是相當(dāng)于結(jié)束游戲了。當(dāng)我們輸入錯誤時,循環(huán)仍然繼續(xù),再次打印菜單提供我們選擇。這也是 do-while()語句的巧妙之處。
3、創(chuàng)建并且初始化棋盤
3.1、創(chuàng)建棋盤
創(chuàng)建棋盤很簡單,我們這里需要的是一個二維數(shù)組。那么棋盤的大小呢?我們首先想到的是3x3的棋盤——char board[3][3]。那要是想改成5x5的棋盤呢?我們是把整個工程中的board[3][3]改成board[5][5]嗎?這樣太麻煩了,當(dāng)然也不現(xiàn)實。這里我們可以引用#define 定義的標(biāo)識符常量。這時候我們可以寫成char board[ROW][COL]。改變大小的時候只需要改變#define 定義的標(biāo)識符常量的值就行。
#define ROW 3 #define COL 3 char board[ROW][COL];
3.2、初始化棋盤
我們這里將初始化棋盤放在一個init_board(board, ROW, COL)函數(shù)中。為什么要初始化棋盤呢?當(dāng)我們不初始化的時候,期盼中的每個位置放的是‘\0’。而我們想要得到的棋盤是一個空棋盤,這樣的話更加有利于玩家操作下棋??掌灞P看起開也比較整潔。我們看一下初始化代碼的實現(xiàn)。
void init_board(char board[ROW][COL], int row, int col) { int i = 0; for (i = 0; i < row; i++) { int j = 0; for (j = 0; j < col; j++) { board[i][j] = ' '; } } }
4、打印格式化棋盤
當(dāng)我們初始化完棋盤后,我們就應(yīng)該把棋盤打印出來讓玩家看到并且選擇要下棋的位置。這里我們先來看打印棋盤。打印出來的棋盤應(yīng)該格式鮮明,每個位置獨立分開,而不是一片空白。我們先看一下棋盤的格式:
3x3
5x5
通過上面的兩個圖,我們就可以建立一個大概的打印棋盤的思路了。其實我們可以把”_ _ _|_ _ _|_ _ _“看作我們要打印的第一行內(nèi)容,但是要注意最后一行是” | | “。打印的思路有了,把打印棋盤內(nèi)容放在print_board(board, ROW, COL)函數(shù)中。我們來看一下代碼的實現(xiàn)。
void print_board(char board[ROW][COL], int row, int col) { int i = 0; for (i = 0; i < row; i++) { int j = 0; for (j = 0; j < col; j++) { printf(" %c ", board[i][j]); if (j < col - 1) printf("|"); } printf("\n"); if (i < row - 1) { for (j = 0; j < row; j++) { printf("---"); if (j < col - 1) printf("|"); } } printf("\n"); } }
5、玩家下棋
當(dāng)我們把棋盤打印出來后,這時候就要提示玩家選擇下棋了。我們采用的是坐標(biāo)的形式讓玩家進行選擇下棋位置。這里要有幾點要注意的事項
- 玩家選擇的位置就是所看到的位置,跟代碼中的數(shù)組下標(biāo)訪問還是有所差距的;
- 玩家輸入的坐標(biāo)后,要判斷該坐標(biāo)是否已經(jīng)被占用,也就是不能重復(fù)在同一個位置上下棋;
- 玩家輸入坐標(biāo)后,要判斷坐標(biāo)是否合法,不合法的話要給出提示,并且重新輸入。
- 當(dāng)玩家輸入的坐標(biāo)合法后,電腦玩家進行下棋;
- 玩家下完棋后要再次調(diào)用打印棋盤函數(shù)print_board(board, ROW, COL),使玩家更方便的觀看已經(jīng)下棋的位置;
- 我們把玩家下的坐標(biāo)用 ‘ * ’ 來代表。
我們將玩家下棋內(nèi)容放在player_move(board, ROW, COL)函數(shù)中,我們來看一下玩家下棋的代碼實現(xiàn)。
void player_move(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; printf("請選擇你要下棋的坐標(biāo):"); while (1) { scanf("%d %d", &x, &y); if ((x >= 1 && x <= row) && (y >= 1 && y <= col)) { if (board[x - 1][y - 1] == ' ') { board[x - 1][y - 1] = '*'; break; } else { printf("該坐標(biāo)已經(jīng)被占有,請重新選擇:"); } } else { printf("該坐標(biāo)非法,請輸入合法坐標(biāo):"); } } }
6、電腦下棋
玩家下棋后,就該電腦下棋了。電腦下棋其實就是隨機下棋。當(dāng)然電腦下棋也是不能重復(fù)在同一個位置上下棋,且是合法的。提到隨機,我們就因該聯(lián)想到rand()函數(shù)和srand()函數(shù),在這里我就不詳細介紹這兩個函數(shù)的使用方法了,在之前的猜數(shù)字小游戲中有詳細的解釋,可以去了解一下。電腦下完棋后也要調(diào)用打印棋盤函數(shù)print_board(board, ROW, COL),使玩家更方便的觀看已經(jīng)下棋的位置。我們把玩家下的坐標(biāo)用 ‘ #’ 來代表。把電腦下棋代碼放在computer_move(board, ROW, COL)函數(shù)中。那我們來看一下電腦下棋的代碼實現(xiàn)。
void computer_move(char board[ROW][COL], int row, int col) { printf("電腦下棋:\n"); while (1) { int x = rand() % 3; int y = rand() % 3; if (board[x][y] == ' ') { board[x][y] = '#'; break; } } }
7、判斷是否玩家或者電腦贏
其實,每當(dāng)玩家或者電腦下完一次棋后,我們都需要判斷一下是否有贏的。如果沒有贏的,我們就進行反復(fù)下棋。如果有贏的,我們就停止下棋,并輸出”玩家贏“或者”電腦贏“。我們同時還要想到是否為平局,如果為平局的話,就輸出”平局“。判斷輸贏的函數(shù)我們定義成char is_win(board[ROW][COL], ROW, COL)。
判斷輸贏函數(shù)返回值注意:
- 我們這個判斷輸贏的函數(shù)是有返回值的,返回類型為char;
- 當(dāng)返回 ‘*’ 時,玩家勝利;
- 當(dāng)返回 ‘#’ 時,電腦勝利;
- 當(dāng)返回 ‘Q’ 時,平局;
- 當(dāng)返回 ‘C’ 時,游戲繼續(xù)。
當(dāng)我們在編寫輸贏函數(shù)時,我們要注意不能數(shù)組越界訪問。我們先來看一下判斷輸贏函數(shù)的實現(xiàn)。
char is_win(char board[ROW][COL], int row, int col) { int i = 0; //判斷行 for (i = 0; i < row; i++) { int j = 0; for (j = 0; j < col; j++) { if (j == 0) { if ((board[i][0] == board[i][1]) && (board[i][1] == board[i][2]) && (board[i][1] != ' ')) return board[i][0]; } else if (j == 1) { if ((board[i][0] == board[i][1]) && (board[i][1] == board[i][2]) && (board[i][1] != ' ') || (board[i][1] == board[i][2]) && (board[i][2] == board[i][23]) && (board[i][1] != ' ')) return board[i][1]; } else if (j == col - 1) { if ((board[i][j] == board[i][j - 1]) && (board[i][j - 1] == board[i][j - 2]) && (board[i][j] != ' ')) return board[i][j]; } else if (j == col - 2) { if ((board[i][j] == board[i][j - 1]) && (board[i][j - 1] == board[i][j - 2]) && (board[i][j] != ' ') || (board[i][j] == board[i][j - 1]) && (board[i][j] == board[i][j + 1]) && (board[i][j] != ' ')) return board[i][j]; } else { if ((board[i][j] == board[i][j - 1]) && (board[i][j - 1] == board[i][j - 2]) && (board[i][j] != ' ') || (board[i][j] == board[i][j - 1]) && (board[i][j] == board[i][j + 1]) && (board[i][j] != ' ') || (board[i][j] == board[i][j + 1]) && (board[i][j + 1] == board[i][j + 2]) && (board[i][j] != ' ')) return board[i][j]; } } } //判斷列 int j = 0; for (j = 0; j < col; j++) { for (i = 0; i < row; i++) { if (i == 0) { if ((board[0][j] == board[1][j]) && (board[1][j] == board[2][j]) && (board[1][j] != ' ')) return board[0][j]; } else if (i == 1) { if ((board[0][j] == board[1][j]) && (board[1][j] == board[2][j]) && (board[1][j] != ' ') || (board[1][j] == board[2][j]) && (board[2][j] == board[3][j]) && (board[1][j] != ' ')) return board[1][j]; } else if (i == row - 1) { if ((board[i][j] == board[i - 1][j]) && (board[i - 1][j] == board[i - 2][j]) && (board[i][j] != ' ')) return board[i][j]; } else if (i == row - 2) { if ((board[i][j] == board[i - 1][j]) && (board[i - 1][j] == board[i - 2][j]) && (board[i][j] != ' ') || (board[i][j] == board[i - 1][j]) && (board[i - 1][j] == board[i + 1][j]) && (board[i][j] != ' ')) return board[i][j]; } else { if ((board[i][j] == board[i + 1][j]) && (board[i + 1][j] == board[i + 2][j]) && (board[i][j] != ' ') || (board[i][j] == board[i - 1][j]) && (board[i - 1][j] == board[i + 1][j]) && (board[i][j] != ' ') || (board[i][j] == board[i - 1][j]) && (board[i - 1][j] == board[i - 2][j]) && (board[i][j] != ' ')) return board[i][j]; } } } //判斷主對角線 for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { if (i<row-2&&j<col-2) { if((board[i][j] == board[i + 1][j + 1] && board[i][j] == board[i + 2][j + 2] && board[i][j] != ' ')) return board[i][j]; } if (i>0&&i<row-1&&j>0&&j<col-1) { if ((board[i][j] == board[i + 1][j + 1] && board[i][j] == board[i - 1][j - 1] && board[i][j] != ' ')) return board[i][j]; } if (i >1&&j>1) { if ((board[i][j] == board[i - 1][j - 1] && board[i][j] == board[i - 2][j - 2] && board[i][j] != ' ')) return board[i][j]; } } } //判斷次對角線 for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { if (i<row-2&&j>1) { if ((board[i][j] == board[i + 1][j - 1] && board[i][j] == board[i + 2][j - 2] && board[i][j] != ' ')) return board[i][j]; } if (j>0&&j<col-1&&i>0&&i<row-1) { if ((board[i][j] == board[i - 1][j + 1] && board[i][j] == board[i + 1][j - 1] && board[i][j] != ' ')) return board[i][j]; } if (i>1&&j<col-2) { if ((board[i][j] == board[i - 1][j + 1] && board[i][j] == board[i - 2][j + 2] && board[i][j] != ' ')) return board[i][j]; } } } //判斷平局 int flag = 0; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { if (board[i][j] == ' ') flag = 1; } } if (flag == 0) return 'Q'; return 'C'; }
我們這里再看一下反復(fù)調(diào)用玩家下棋player_move(board, ROW, COL)函數(shù)和電腦下棋computer_move(board, ROW, COL)函數(shù)和打印棋盤函數(shù)print_board(board, ROW, COL)函數(shù)到終止循環(huán)的代碼。反復(fù)調(diào)用這幾個函數(shù)也就是實現(xiàn)了反復(fù)下棋的效果。如果沒有贏的,我們就進行反復(fù)下棋。如果有贏的或者平局,我們就停止下棋。我們來看代碼實現(xiàn)。
while (1) { //玩家下棋 player_move(board, ROW, COL); print_board(board, ROW, COL); //判斷是否結(jié)束 // * 玩家勝利 // # 電腦勝利 // Q 平局 // C 繼續(xù)游戲 ret=is_win(board, ROW, COL); if (ret != 'C') break; //電腦下棋 computer_move(board, ROW, COL); print_board(board, ROW, COL); ret = is_win(board, ROW, COL); if (ret != 'C') break; }
綜上就是我整個三子棋游戲?qū)崿F(xiàn)的思路了??傮w來說還是比較簡單的。我們把上面的代碼整合一下來看。
三、整合三子棋游戲代碼
由于代碼量相對來說有一點多,所以我們就將函數(shù)的聲明的定義分開,這樣有利于提高代碼的可讀性,同時會保持一個良好的思路,且方便編寫代碼。
我們將函數(shù)的聲明放在單獨的一個game.h的頭文件,函數(shù)的實現(xiàn)放在一個單獨的game.c源文件,函數(shù)的主方法及調(diào)用放在另一個單獨的test.c源文件。
game.h
#include<stdio.h> //數(shù)組行和列的大小 #define ROW 3 #define COL 3 //初始化數(shù)組 void init_board(char board[ROW][COL],int row,int col); //打印格式化數(shù)組 void print_board(char board[ROW][COL], int row, int col); //玩家下棋 * void player_move(char board[ROW][COL], int row, int col); //電腦下棋 # void computer_move(char board[ROW][COL], int row, int col); //判斷輸贏或者平局 char is_win(char board[ROW][COL], int row, int col);
game.c
#include "game.h" void init_board(char board[ROW][COL], int row, int col) { int i = 0; for (i = 0; i < row; i++) { int j = 0; for (j = 0; j < col; j++) { board[i][j] = ' '; } } } void print_board(char board[ROW][COL], int row, int col) { int i = 0; for (i = 0; i < row; i++) { int j = 0; for (j = 0; j < col; j++) { printf(" %c ", board[i][j]); if (j < col - 1) printf("|"); } printf("\n"); if (i < row - 1) { for (j = 0; j < row; j++) { printf("---"); if (j < col - 1) printf("|"); } } printf("\n"); } } void player_move(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; printf("請選擇你要下棋的坐標(biāo):"); while (1) { scanf("%d %d", &x, &y); if ((x >= 1 && x <= row) && (y >= 1 && y <= col)) { if (board[x - 1][y - 1] == ' ') { board[x - 1][y - 1] = '*'; break; } else { printf("該坐標(biāo)已經(jīng)被占有,請重新選擇:"); } } else { printf("該坐標(biāo)非法,請輸入合法坐標(biāo):"); } } } void computer_move(char board[ROW][COL], int row, int col) { printf("電腦下棋:\n"); while (1) { int x = rand() % 3; int y = rand() % 3; if (board[x][y] == ' ') { board[x][y] = '#'; break; } } } char is_win(char board[ROW][COL], int row, int col) { int i = 0; //判斷行 for (i = 0; i < row; i++) { int j = 0; for (j = 0; j < col; j++) { if (j == 0) { if ((board[i][0] == board[i][1]) && (board[i][1] == board[i][2]) && (board[i][1] != ' ')) return board[i][0]; } else if (j == 1) { if ((board[i][0] == board[i][1]) && (board[i][1] == board[i][2]) && (board[i][1] != ' ') || (board[i][1] == board[i][2]) && (board[i][2] == board[i][23]) && (board[i][1] != ' ')) return board[i][1]; } else if (j == col - 1) { if ((board[i][j] == board[i][j - 1]) && (board[i][j - 1] == board[i][j - 2]) && (board[i][j] != ' ')) return board[i][j]; } else if (j == col - 2) { if ((board[i][j] == board[i][j - 1]) && (board[i][j - 1] == board[i][j - 2]) && (board[i][j] != ' ') || (board[i][j] == board[i][j - 1]) && (board[i][j] == board[i][j + 1]) && (board[i][j] != ' ')) return board[i][j]; } else { if ((board[i][j] == board[i][j - 1]) && (board[i][j - 1] == board[i][j - 2]) && (board[i][j] != ' ') || (board[i][j] == board[i][j - 1]) && (board[i][j] == board[i][j + 1]) && (board[i][j] != ' ') || (board[i][j] == board[i][j + 1]) && (board[i][j + 1] == board[i][j + 2]) && (board[i][j] != ' ')) return board[i][j]; } } } //判斷列 int j = 0; for (j = 0; j < col; j++) { for (i = 0; i < row; i++) { if (i == 0) { if ((board[0][j] == board[1][j]) && (board[1][j] == board[2][j]) && (board[1][j] != ' ')) return board[0][j]; } else if (i == 1) { if ((board[0][j] == board[1][j]) && (board[1][j] == board[2][j]) && (board[1][j] != ' ') || (board[1][j] == board[2][j]) && (board[2][j] == board[3][j]) && (board[1][j] != ' ')) return board[1][j]; } else if (i == row - 1) { if ((board[i][j] == board[i - 1][j]) && (board[i - 1][j] == board[i - 2][j]) && (board[i][j] != ' ')) return board[i][j]; } else if (i == row - 2) { if ((board[i][j] == board[i - 1][j]) && (board[i - 1][j] == board[i - 2][j]) && (board[i][j] != ' ') || (board[i][j] == board[i - 1][j]) && (board[i - 1][j] == board[i + 1][j]) && (board[i][j] != ' ')) return board[i][j]; } else { if ((board[i][j] == board[i + 1][j]) && (board[i + 1][j] == board[i + 2][j]) && (board[i][j] != ' ') || (board[i][j] == board[i - 1][j]) && (board[i - 1][j] == board[i + 1][j]) && (board[i][j] != ' ') || (board[i][j] == board[i - 1][j]) && (board[i - 1][j] == board[i - 2][j]) && (board[i][j] != ' ')) return board[i][j]; } } } //判斷主對角線 for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { if (i<row-2&&j<col-2) { if((board[i][j] == board[i + 1][j + 1] && board[i][j] == board[i + 2][j + 2] && board[i][j] != ' ')) return board[i][j]; } if (i>0&&i<row-1&&j>0&&j<col-1) { if ((board[i][j] == board[i + 1][j + 1] && board[i][j] == board[i - 1][j - 1] && board[i][j] != ' ')) return board[i][j]; } if (i >1&&j>1) { if ((board[i][j] == board[i - 1][j - 1] && board[i][j] == board[i - 2][j - 2] && board[i][j] != ' ')) return board[i][j]; } } } //判斷次對角線 for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { if (i<row-2&&j>1) { if ((board[i][j] == board[i + 1][j - 1] && board[i][j] == board[i + 2][j - 2] && board[i][j] != ' ')) return board[i][j]; } if (j>0&&j<col-1&&i>0&&i<row-1) { if ((board[i][j] == board[i - 1][j + 1] && board[i][j] == board[i + 1][j - 1] && board[i][j] != ' ')) return board[i][j]; } if (i>1&&j<col-2) { if ((board[i][j] == board[i - 1][j + 1] && board[i][j] == board[i - 2][j + 2] && board[i][j] != ' ')) return board[i][j]; } } } //判斷平局 int flag = 0; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { if (board[i][j] == ' ') flag = 1; } } if (flag == 0) return 'Q'; return 'C'; }
test.c
#include "game.h" void game() { char ret = 0; srand(time(NULL)); char board[ROW][COL]; //初始化數(shù)組 全為空格 init_board(board, ROW, COL); //打印格式化數(shù)組 print_board(board, ROW, COL); while (1) { //玩家下棋 player_move(board, ROW, COL); print_board(board, ROW, COL); //判斷是否結(jié)束 // * 玩家勝利 // # 電腦勝利 // Q 平局 // C 繼續(xù)游戲 ret=is_win(board, ROW, COL); if (ret != 'C') break; //電腦下棋 computer_move(board, ROW, COL); print_board(board, ROW, COL); ret = is_win(board, ROW, COL); if (ret != 'C') break; } if (ret == '*') printf("恭喜玩家取得勝利!\n"); else if (ret == '#') printf("電腦取得勝利。\n"); else if (ret == 'Q') printf("平局了哦。\n"); } void meau() { printf("*********************\n"); printf("***** 1.play *****\n"); printf("***** 0.exit *****\n"); printf("*********************\n"); } void test() { int input = 0; do { meau(); printf("請選擇是否要開始游戲:"); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("退出游戲\n"); break; default: printf("選擇錯誤\n"); } } while (input); } int main() { test(); return 0; }
到此這篇關(guān)于C語言三子棋的實現(xiàn)思路到過程詳解的文章就介紹到這了,更多相關(guān)C語言三子棋內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++學(xué)習(xí)之虛函數(shù)表與多態(tài)詳解
這篇文章主要為大家詳細介紹了C++中虛函數(shù)表與多態(tài)的相關(guān)知識,文中的示例代碼講解詳細,對我們學(xué)習(xí)C++有一定的幫助,感興趣的小伙伴可以了解一下2023-03-03C++ explicit構(gòu)造函數(shù)實例解析
這篇文章主要介紹了C++ explicit構(gòu)造函數(shù),需要的朋友可以參考下2014-07-07C++ 動態(tài)內(nèi)存分配詳解(new/new[]和delete/delete[])
這篇文章主要介紹了C++ 動態(tài)內(nèi)存分配詳解(new/new[]和delete/delete[]),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05matlab模擬退火算法單約束車間流水線調(diào)度解決實現(xiàn)及示例
這篇文章主要為大家介紹了matlab模擬退火算法求解單約束車間流水線調(diào)度的實現(xiàn)及示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2022-02-02C/C++?實現(xiàn)動態(tài)資源文件釋放的方法
當(dāng)我們開發(fā)Windows應(yīng)用程序時,通常會涉及到使用資源(Resource)的情況。資源可以包括圖標(biāo)、位圖、字符串等,它們以二進制形式嵌入到可執(zhí)行文件中,這篇文章主要介紹了C/C++?實現(xiàn)動態(tài)資源文件釋放,需要的朋友可以參考下2023-12-12C/C++使用socket實現(xiàn)判斷ip是否能連通
這篇文章主要為大家詳細介紹了C/C++如何使用socket實現(xiàn)判斷ip是否能連通,文中的示例代碼講解詳細,具有一定的學(xué)習(xí)價值,感興趣的小伙伴可以了解一下2023-07-07