C++語(yǔ)言設(shè)計(jì)實(shí)現(xiàn)五子棋
本文為大家分享了C++五子棋的設(shè)計(jì)思路和設(shè)計(jì)實(shí)現(xiàn),供大家參考,具體內(nèi)容如下
算法思路:
在結(jié)束了對(duì)C++的學(xué)習(xí)之后,準(zhǔn)備自己編制一些簡(jiǎn)單的練習(xí)程序。目前初步設(shè)想是編制一個(gè)人機(jī)對(duì)戰(zhàn)的簡(jiǎn)易五子棋軟件。 以下為個(gè)人設(shè)計(jì)思考的過(guò)程。
首先,進(jìn)行問(wèn)題分析與設(shè)計(jì)。計(jì)劃實(shí)現(xiàn)的功能為,開(kāi)局選擇人機(jī)或雙人對(duì)戰(zhàn),確定之后比賽開(kāi)始。比賽結(jié)束后初始化棋盤(pán),詢問(wèn)是否繼續(xù)比賽或退出。后續(xù)可加入復(fù)盤(pán)、悔棋等功能。整個(gè)過(guò)程中,涉及到了棋子和棋盤(pán)兩種對(duì)象,同時(shí)要加上人機(jī)對(duì)弈時(shí)的AI對(duì)象,即涉及到三個(gè)對(duì)象。
棋盤(pán)類(lèi)的設(shè)計(jì)。
數(shù)據(jù)存儲(chǔ):五子棋棋盤(pán)為15*15的網(wǎng)格結(jié)構(gòu),即一共有225個(gè)節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)有橫豎坐標(biāo)各一,同時(shí)每個(gè)節(jié)點(diǎn)狀態(tài)有3種,黑,白,或者為空。可考慮采用二維數(shù)組來(lái)存儲(chǔ)。每個(gè)節(jié)點(diǎn)三種狀態(tài),適合采用枚舉(enum)類(lèi)型。
-* 實(shí)現(xiàn)功能*:1. 棋盤(pán)對(duì)象應(yīng)負(fù)責(zé)實(shí)時(shí)更新棋盤(pán)狀態(tài)并對(duì)外顯示,因此需要接收棋子對(duì)象的輸入,同時(shí)需要對(duì)外輸出。而棋盤(pán)對(duì)象不需要對(duì)棋子對(duì)象發(fā)送信息,所以可以設(shè)計(jì)棋盤(pán)類(lèi)中更新棋盤(pán)狀態(tài)的函數(shù)接收棋子對(duì)象作為形參。2. 同時(shí),在每次走棋之后,棋盤(pán)對(duì)象都要及時(shí)更新棋盤(pán)信息,即輸出棋盤(pán)狀態(tài)。3. 而且,每次走棋之后更新輸出之前,應(yīng)該對(duì)棋子走棋是否符合規(guī)則以及輸贏進(jìn)行判定。若將規(guī)則判定單獨(dú)封裝為一個(gè)對(duì)象,則不方便調(diào)用棋盤(pán)信息,故將規(guī)則判定設(shè)計(jì)為棋盤(pán)類(lèi)的成員函數(shù),接收兩個(gè)形參,一個(gè)是棋盤(pán)當(dāng)前的狀態(tài),一個(gè)是即將走的下一步棋,即一個(gè)棋子對(duì)象。
設(shè)計(jì)棋子對(duì)象。棋子對(duì)象應(yīng)包含兩種信息。一是棋子顏色,二是當(dāng)前要走的棋子的位置坐標(biāo),并保留對(duì)外輸出的接口。
接下來(lái)細(xì)化規(guī)則判定函數(shù)。
- 首先進(jìn)行走棋規(guī)則判定。接收當(dāng)前棋子位置信息后,判定該位置是否越界或?yàn)榭眨舴强栈蛘咴浇?,則判定違規(guī),拋擲異常,交付上級(jí)調(diào)用處理。
- 然后進(jìn)行輸贏判定。按照一定順序?qū)Ξ?dāng)前落子位置的相鄰元素進(jìn)行同色判定并計(jì)數(shù)。當(dāng)發(fā)現(xiàn)某條直線上同色棋子超過(guò)四枚,則判定當(dāng)前走棋方獲勝 。判定過(guò)程中同樣需要注意是否越界。若均未構(gòu)成五星連珠,則進(jìn)入平局判定。
- 平局判定,遍歷棋盤(pán),統(tǒng)計(jì)空位,若空位為0,即棋盤(pán)已滿,判定為平局。
接下來(lái)設(shè)計(jì)下棋AI。設(shè)計(jì)為一個(gè)棋子類(lèi)型的函數(shù),即接收當(dāng)前棋盤(pán)狀態(tài)和對(duì)方最后一次落棋,返回棋子對(duì)象類(lèi)型。
對(duì)弈算法設(shè)計(jì)。
- 首先進(jìn)行先后手判定:若棋盤(pán)為空則直接落子(8,8),正中開(kāi)局。
- 然后進(jìn)行防守判定:針對(duì)對(duì)方上次落棋進(jìn)行活棋檢測(cè),在橫、豎、左斜、右斜四條直線上依次進(jìn)行檢測(cè)。在任意方向檢測(cè)到四或活三,即可進(jìn)行 封堵操作,給出所有可行的封堵位置。若未檢測(cè)到四或活三,則統(tǒng)計(jì)活二并給出所有可能的封堵位置。然后針對(duì)所有可能的封堵位置進(jìn)行評(píng)分,選取分?jǐn)?shù)最高的位置進(jìn)行落子。若上述檢測(cè)均未找到防守點(diǎn),則轉(zhuǎn)入進(jìn)攻算法。
- 進(jìn)攻算法:采用枚舉,即暴力破解的方法。遍歷整個(gè)棋盤(pán)的所有空位,并給出每個(gè)空位的評(píng)分,選取最高分進(jìn)行落子。
- 活棋檢測(cè)算法:給定參照棋子,在四個(gè)方向上分別檢測(cè)。以橫向檢測(cè)為例,設(shè)參照棋子坐標(biāo)為(x,y),設(shè)定同色計(jì)數(shù)器count=1(計(jì)算同色棋子數(shù)目),設(shè)定封鎖端統(tǒng)計(jì)量lock=0,設(shè)定已判斷的方向統(tǒng)計(jì)judge=0。對(duì)x-1,判斷節(jié)點(diǎn)狀態(tài),若同色計(jì)數(shù)器加1,繼續(xù)判斷x-2;若異色,則lock+1,judge+1,若judge=2,終止判斷,若judge<2,反向判斷x+1;若空白,judge+1,若judge=2,終止判斷,若judge<2,反向判斷。最后得到被封堵的端口數(shù)lock和同色數(shù)count。若lock=0,count=3或2,判定為活3或活2。若lock=1,count=4,判定為4,若lock=1,count=3,判定為半3。但是在這種算法中,關(guān)于空白的判定存在著一些問(wèn)題。用0代表空白,用+代表同色,-代表異色,則當(dāng)出現(xiàn)下列情況時(shí):-0++0-,-+++0-,事實(shí)上是死棋,而+0++0,+0+++-,實(shí)際上相當(dāng)于活3或半4。為此,需要對(duì)活2和半3的情況進(jìn)行進(jìn)一步篩選,即空白端應(yīng)保證連續(xù)兩個(gè)空白。在活棋檢測(cè)過(guò)程中,如果遇到活3或者半4,則立即終止檢測(cè),返回落子的可能位置。若沒(méi)有則記錄活2半3的防守位置,換方向檢測(cè)。最后返回一個(gè)棋子類(lèi)的數(shù)組,包含所有建議的落子位置。若均無(wú),則遍歷棋盤(pán),統(tǒng)計(jì)所有空白位置,返回。
- 落子位置評(píng)分算法:對(duì)活棋檢測(cè)返回?cái)?shù)組中的每個(gè)位置進(jìn)行評(píng)分,即以該點(diǎn)為己方參照點(diǎn),進(jìn)行活棋檢測(cè),若有count=5,直接返回該落子位置。有活三或者半4,分?jǐn)?shù)加20,有活2,分?jǐn)?shù)加5,對(duì)角線有相鄰?fù)?,分?jǐn)?shù)+2,有異色,分?jǐn)?shù)-2,橫豎有同色,分?jǐn)?shù)+1,有異色,分?jǐn)?shù)-1。最后排序,取最高分對(duì)應(yīng)的落子,返回該落子。
接下來(lái)則是數(shù)據(jù)結(jié)構(gòu)和對(duì)象設(shè)計(jì)及主函數(shù)調(diào)用實(shí)現(xiàn):
類(lèi)及類(lèi)的實(shí)現(xiàn)
#define RENJU_H #include <iostream> #include <windows.h> #include <string> #define hor 7 #define ver 4 using namespace std; //用于記錄坐標(biāo) struct position { int x; int y; position() { x = 0; y = 0; } position(int a,int b) { x = a; y = b; } }; //用于記錄棋子顏色和節(jié)點(diǎn)狀態(tài) enum state { blank=0,black=1,white=2 }; //用于存儲(chǔ)棋局分析信息:未完賽,犯規(guī),平局,黑方勝,白方勝 enum result { go_on,error,draw,black_win,white_win }; // 設(shè)置光標(biāo) void setpos(COORD a) { HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorPosition(out, a); } // 設(shè)置光標(biāo) void setpos(int i, int j) { COORD pos = { i, j }; setpos(pos); } //繪圖函數(shù),用于在指定坐標(biāo)輸出指定字符 inline void gps(int x,int y,char c) { setpos(y,x); cout<<c; } //繪圖函數(shù),用于在指定坐標(biāo)輸出整數(shù) inline void gps(int x,int y,int i) { setpos(y,x); if(i>=10) cout<<i; else cout<<0<<i; } //繪圖函數(shù),用于在指定坐標(biāo)輸出字符串 inline void gps(int x,int y,string s) { setpos(y,x); cout<<s; } //繪圖函數(shù),用于在給定坐標(biāo)打印棋盤(pán)中的一格 void tab(int x,int y,state str) { string s; switch (str) { case blank: s=" "; break; case black: s="黑"; break; case white: s="白"; break; default: break; } setpos(y,x); cout<<" ------ "; setpos(y,x+1); cout<<"| |"; setpos(y,x+2); cout<<"| "<<s<<" |"; setpos(y,x+3); cout<<"| |"; setpos(y,x+4); cout<<" ------ "; } //查找最大值 int MAX(const int *a,int n) { int max = a[0]; for(int i =1; i < n ;i++) { if(a[i] > max) max = a[i]; } return max; } //檢測(cè)是否符合勝利條件 //棋子類(lèi) class chess { public: inline chess(int x=0,int y=0,state c=blank) { point.x=x,point.y=y; color=c; }; inline chess(chess &ch) { point=ch.drop_point(); color=ch.get_color(); } ~chess(){}; struct position drop_point()const;//用于向外部提供棋子位置 inline state get_color() const { return color;}//提供棋子顏色信息 void set_point();//用于從外部獲取棋子位置 void set_point(int x,int y){ point.x=x,point.y=y;} void set_point(position p){ point.x=p.x,point.y=p.y;} void set_color(state c){ color=c;}//設(shè)置棋子顏色 private: position point; enum state color; }; position chess::drop_point()const { return point; } void chess::set_point() { if(color==black) { setpos(110,1); cout<<"請(qǐng)黑方輸入落子列數(shù)和行數(shù),空格隔開(kāi):"; cin>>point.x>>point.y; while(point.x<1||point.x>15) { setpos(110,1); cout<<"列數(shù)輸入超出范圍,請(qǐng)重新輸入1~15之間數(shù)字 "; cin>>point.x; } while(point.y<1||point.y>15) { setpos(110,2); cout<<"行數(shù)輸入超出范圍,請(qǐng)重新輸入1~15之間數(shù)字 "; cin>>point.y; } } else if(color==white) { setpos(110,1); cout<<"請(qǐng)白方輸入落子列數(shù)和行數(shù),空格隔開(kāi):"; cin>>point.x>>point.y; while(point.x<1||point.x>15) { setpos(110,1); cout<<"列數(shù)輸入超出范圍,請(qǐng)重新輸入1~15之間數(shù)字 "; cin>>point.x; } while(point.y<1||point.y>15) { setpos(110,2); cout<<"行數(shù)輸入超出范圍,請(qǐng)重新輸入1~15之間數(shù)字 "; cin>>point.y; } } point.x--; point.y--; } //棋盤(pán)類(lèi) class chessboard { public: chessboard() { for(int i=0;i<15;i++) for(int j=0;j<15;j++) { square[i][j]=blank; } } chessboard(chessboard *cb) { for(int i=0;i<15;i++) for(int j=0;j<15;j++) { square[i][j]=cb->viewboard(i,j); } } inline state viewboard(position p_c) const;//接收坐標(biāo),返回該位置的狀態(tài) inline state viewboard(int x,int y) const;//接收整數(shù)坐標(biāo),返回該位置的狀態(tài) void update(chess ch);//接收新棋子,更新棋盤(pán)狀態(tài) void display()const;//向外輸出棋盤(pán)狀態(tài) result judge(chess ch)const;//規(guī)則函數(shù),判斷走棋是否犯規(guī)和輸贏 void clear()//清空棋盤(pán) { for(int i=0;i<15;i++) for(int j=0;j<15;j++) { square[i][j]=blank; } } private: state square[15][15]; }; int check_five(chessboard bd,chess ch) { position ori=ch.drop_point(); int count=1;//計(jì)數(shù)器,統(tǒng)計(jì)同色個(gè)數(shù) int sum[4]={0}; bool locked=0;//邏輯標(biāo)記量,用來(lái)標(biāo)記是否遇到了非同色節(jié)點(diǎn) //水平方向檢測(cè) for(int i=0,locked=0;i<5&&((ori.x-i)>=0)&&(!locked);i++)//終止循環(huán)條件:同色超過(guò)4個(gè)或觸碰到棋盤(pán)邊界或遇到非同色節(jié)點(diǎn) if(ch.get_color()==bd.viewboard(ori.x-i,ori.y)) count++; else if(i!=0) locked=1; //sum[0]=count-1; for(int i=0,locked=0;i<5&&((ori.x+i)<=14)&&(!locked);i++)//終止循環(huán)條件:同色超過(guò)4個(gè)或觸碰到棋盤(pán)邊界或遇到非同色節(jié)點(diǎn) if(ch.get_color()==bd.viewboard(ori.x+i,ori.y)) count++; else if(i!=0) locked=1; //sum[1]=count-sum[0]-2; sum[0]=count; if(count>=5) return count; //豎直方向檢測(cè) count=1; for(int i=0,locked=0;i<5&&((ori.y-i)>=0)&&(!locked);i++)//終止循環(huán)條件:同色超過(guò)4個(gè)或觸碰到棋盤(pán)邊界或遇到非同色節(jié)點(diǎn) if(ch.get_color()==bd.viewboard(ori.x,ori.y-i)) count++; else if(i!=0) locked=1; //sum[2]=count-1; for(int i=0,locked=0;i<5&&((ori.y+i)<=14)&&(!locked);i++)//終止循環(huán)條件:同色超過(guò)4個(gè)或觸碰到棋盤(pán)邊界或遇到非同色節(jié)點(diǎn) if(ch.get_color()==bd.viewboard(ori.x,ori.y+i)) count++; else if(i!=0) locked=1; //sum[3]=count-sum[2]-2; sum[1]=count; if(count>=5) return count; //左上到右下斜向檢測(cè) count=1; for(int i=0,locked=0;i<5&&((ori.y-i)>=0)&&((ori.x-i)>=0)&&(!locked);i++)//終止循環(huán)條件:同色超過(guò)4個(gè)或觸碰到棋盤(pán)邊界或遇到非同色節(jié)點(diǎn) if(ch.get_color()==bd.viewboard(ori.x-i,ori.y-i)) count++; else if(i!=0) locked=1; //sum[4]=count-1; for(int i=0,locked=0;i<5&&((ori.x+i)<=14)&&((ori.y+i)<=14)&&(!locked);i++)//終止循環(huán)條件:同色超過(guò)4個(gè)或觸碰到棋盤(pán)邊界或遇到非同色節(jié)點(diǎn) if(ch.get_color()==bd.viewboard(ori.x+i,ori.y+i)) count++; else if(i!=0) locked=1; //sum[5]=count-sum[4]-2; sum[2]=count; if(count>=5) return count; //左下到右上斜向檢測(cè) count=1; for(int i=0,locked=0;i<5&&((ori.y+i)<=14)&&((ori.x-i)>=0)&&(!locked);i++)//終止循環(huán)條件:同色超過(guò)4個(gè)或觸碰到棋盤(pán)邊界或遇到非同色節(jié)點(diǎn) if(ch.get_color()==bd.viewboard(ori.x-i,ori.y+i)) count++; else if(i!=0) locked=1; //sum[6]=count-1; for(int i=0,locked=0;i<5&&((ori.x+i)<=14)&&((ori.y-i)>=0)&&(!locked);i++)//終止循環(huán)條件:同色超過(guò)4個(gè)或觸碰到棋盤(pán)邊界或遇到非同色節(jié)點(diǎn) if(ch.get_color()==bd.viewboard(ori.x+i,ori.y-i)) count++; else if(i!=0) locked=1; //sum[7]=count-sum[6]-2; sum[3]=count; if(count>=5) return count; return MAX(sum,4); } state chessboard::viewboard(position p_c) const { return square[p_c.x][p_c.y]; } state chessboard::viewboard(int x,int y) const { return square[x][y]; } void chessboard::update(chess ch) { position pos=ch.drop_point(); square[pos.x][pos.y]=ch.get_color(); } void chessboard::display()const { system("cls"); for(int i=0;i<15;i++)//打印列坐標(biāo)說(shuō)明 { gps(0,6+i*hor,i+1); } for(int i=0;i<15;i++)//打印列坐標(biāo)說(shuō)明 { gps(16*ver,6+i*hor,i+1); } for(int i=0;i<15;i++)//打印行坐標(biāo)說(shuō)明 { gps(3+i*ver,1,i+1); } for(int i=0;i<15;i++)//打印行坐標(biāo)說(shuō)明 { gps(3+i*ver,1+16*hor,i+1); } for(int i=0,j=0;i<15;i++) { for(j=0;j<15;j++) tab(1+i*ver,3+hor*j,square[j][i]); } cout<<endl; } result chessboard::judge(chess set)const { bool full=1; if(viewboard(set.drop_point())!=blank) { return error; } if(check_five(*this,set)>=5&&(set.get_color()==black)) return black_win; if(check_five(*this,set)>=5&&(set.get_color()==white)) return white_win; for(int i=0;i<15;i++) for(int j=0;j<15;j++) { if(square[i][j]==blank) full=0; } if(full==1) return draw; else return go_on; } #endif
主函數(shù),應(yīng)該再定義game類(lèi)進(jìn)行優(yōu)化,不過(guò)設(shè)計(jì)的時(shí)候沒(méi)有考慮周全,還是按照C的思想寫(xiě)了。
#include "ai.h" #include <stdlib.h> int main() { system("mode con cols=150 lines=150 "); system("color 27"); chessboard bd; chess now; result final; int mode; gps(5,40,"==============歡迎使用簡(jiǎn)易五子棋!=============="); gps(10,50,">>>>輸入1或2進(jìn)行模式選擇<<<<"); gps(11,50," <1> 雙人對(duì)戰(zhàn) "); gps(12,50," <2> 人機(jī)對(duì)戰(zhàn) "); do{ cout<<endl<<" input mode:"; cin>>mode; }while(mode != 1 && mode != 2); //雙人對(duì)戰(zhàn) if (mode==1) { loop1: now.set_color(black);//執(zhí)黑先行 bd.clear(); bd.display(); //初始化棋盤(pán) setpos(110,0); cout<<"對(duì)局開(kāi)始,黑旗先行"; //循環(huán)判斷上一次落子結(jié)果,收集下一次輸入,直到棋局出結(jié)果 do{ now.set_point();//輸入 final=bd.judge(now); //判斷是否違規(guī) while(final==error)//犯規(guī)輸入則重新輸入 { system("cls"); bd.display(); setpos(110,10); cout<<"犯規(guī)(輸入坐標(biāo)已有棋子)!"; now.set_point(); final=bd.judge(now); } //正確落子后更新棋盤(pán) bd.update(now); bd.display(); //反轉(zhuǎn)下一步走棋的顏色 if(now.get_color()==black) now.set_color(white); else now.set_color(black); }while(final==go_on); switch (final) { case go_on: break; case error: break; case draw: setpos(110,10); cout<<"平局:游戲結(jié)束"; break; case black_win: setpos(110,10); cout<<"黑旗獲勝:游戲結(jié)束"; break; case white_win: setpos(110,10); cout<<"白旗獲勝:游戲結(jié)束"; break; default: break; } setpos(110,11); cout<<"是否繼續(xù)下一局?Y/N"; char flag; cin>>flag; if(flag == 'Y') goto loop1; } if(mode == 2) { chess ai_ch; system("cls"); gps(5,40,"==============歡迎使用簡(jiǎn)易五子棋!=============="); gps(10,50,">>>>輸入1或2進(jìn)行模式選擇<<<<"); gps(11,50," <1> 執(zhí)黑先行 "); gps(12,50," <2> 執(zhí)白后行 "); do{ cout<<endl<<" input mode:"; cin>>mode; }while(mode != 1 && mode != 2); if(mode == 1) { loop2: now.set_color(black);//執(zhí)黑先行 bd.clear(); bd.display(); //初始化棋盤(pán) Ai afago(bd,white); setpos(110,0); cout<<"對(duì)局開(kāi)始,請(qǐng)您落子"; now.set_point(); bd.update(now); ai_ch.set_color(white); ai_ch.set_point(left(now.drop_point(),false)); bd.update(ai_ch); bd.display(); //循環(huán)判斷上一次落子結(jié)果,收集下一次輸入,直到棋局出結(jié)果 do{ now.set_point();//輸入 final=bd.judge(now); //判斷是否違規(guī) while(final==error)//犯規(guī)輸入則重新輸入 { system("cls"); bd.display(); setpos(110,10); cout<<"犯規(guī)(輸入坐標(biāo)已有棋子)!"; now.set_point(); final=bd.judge(now); } //正確落子后更新棋盤(pán) bd.update(now); if(final != black_win) { ai_ch=afago.set_chess(); final=bd.judge(ai_ch); bd.update(ai_ch); bd.display(); }else{bd.display();} }while(final==go_on); switch (final) { case go_on: break; case error: break; case draw: setpos(110,10); cout<<"平局:游戲結(jié)束"; break; case black_win: setpos(110,10); cout<<"恭喜您棋藝高超,戰(zhàn)勝了AI:游戲結(jié)束"; break; case white_win: setpos(110,10); cout<<"電腦獲勝,請(qǐng)繼續(xù)努力提高自己:游戲結(jié)束"; break; default: break; } setpos(110,11); cout<<"是否繼續(xù)下一局?Y/N"; char flag; cin>>flag; if(flag=='Y') goto loop2; } if(mode == 2) { loop3: ai_ch.set_color(black);//AI執(zhí)黑先行 now.set_color(white); bd.clear(); //初始化棋盤(pán) Ai afago(bd,black); ai_ch.set_point(7,7); bd.update(ai_ch); bd.display(); setpos(110,0); cout<<"對(duì)局開(kāi)始,請(qǐng)您落子"; //循環(huán)判斷上一次落子結(jié)果,收集下一次輸入,直到棋局出結(jié)果 do{ now.set_point();//輸入 final=bd.judge(now); //判斷是否違規(guī) while(final==error)//犯規(guī)輸入則重新輸入 { system("cls"); bd.display(); setpos(110,10); cout<<"犯規(guī)(輸入坐標(biāo)已有棋子)!"; now.set_point(); final=bd.judge(now); } //正確落子后更新棋盤(pán) bd.update(now); if(final != white_win) { ai_ch=afago.set_chess(); final=bd.judge(ai_ch); bd.update(ai_ch); bd.display(); }else{bd.display();} }while(final==go_on); switch (final) { case go_on: break; case error: break; case draw: setpos(110,10); cout<<"平局:游戲結(jié)束"; break; case white_win: setpos(110,10); cout<<"恭喜您棋藝高超,戰(zhàn)勝了AI:游戲結(jié)束"; break; case black_win: setpos(110,10); cout<<"電腦獲勝,請(qǐng)繼續(xù)努力提高自己:游戲結(jié)束"; break; default: break; } setpos(110,11); cout<<"是否繼續(xù)下一局?Y/N"; char flag; cin>>flag; if(flag=='Y') goto loop3; } } return 0; }
更多有趣的經(jīng)典小游戲?qū)崿F(xiàn)專題,分享給大家:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
15種?C++?常見(jiàn)報(bào)錯(cuò)原因分析
這篇文章主要介紹了15種?C++?常見(jiàn)報(bào)錯(cuò),本文通過(guò)實(shí)例代碼給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-01-01用32位int型變量表示單引號(hào)括起來(lái)的四個(gè)字符的深入探討
本篇文章是對(duì)用32位int型變量表示單引號(hào)括起來(lái)的四個(gè)字符進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C語(yǔ)言實(shí)現(xiàn)繪制可愛(ài)的橘子鐘表
這篇文章主要為大家詳細(xì)介紹了如何利用C語(yǔ)言實(shí)現(xiàn)繪制可愛(ài)的橘子鐘表,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的可以了解一下2022-12-12C語(yǔ)言實(shí)現(xiàn)ATM機(jī)存取款系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)ATM機(jī)存取款系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11C語(yǔ)言 數(shù)組中重復(fù)的數(shù)字分析及方法
這篇文章主要介紹了C語(yǔ)言 數(shù)組中重復(fù)的數(shù)字分析及方法的相關(guān)資料,需要的朋友可以參考下2017-03-03C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)創(chuàng)建及遍歷十字鏈表
這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)十字鏈表的創(chuàng)建及遍歷,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2021-10-10