两个吃奶一个添下面视频_人妻第一页香蕉网_欧美xxxx少妇_妺妺窝人体色www婷婷

一、源碼簡介

這是一個(gè)可以進(jìn)行五子棋游戲的小程序,采用C語言進(jìn)行編寫。

上下左右控制光標(biāo)位置,空格下子,黑白棋交替進(jìn)行。

 編譯環(huán)境:Dev-c++(采取純C語言寫法),沒有調(diào)用第三方庫,簡單易學(xué)


二、運(yùn)行截圖

下棋時(shí)候界面,光標(biāo)顯示位置,空格下子

五子棋界面1

獲勝后提示界面:

五子棋界面2



三、源碼解析

先看主函數(shù)部分:

int main()
{
    system("title 五-子-棋"-- Dotcpp(dotcpp.com));//設(shè)置文件標(biāo)題
    system("mode con cols=64 lines=32");//設(shè)置窗口大小
    system("color E0");//設(shè)置背景顏色
    while(1)
    {
        Gamerun();//Gamerun的每一次循環(huán)是進(jìn)行一整局游戲
    }
    return 0;//實(shí)際用不上
}

為了實(shí)現(xiàn)游戲的運(yùn)行,我們需要完成Gamerun這個(gè)函數(shù)。下面是函數(shù)的框架,也是這個(gè)游戲運(yùn)行的具體流程

初始化變量

循環(huán)對局:

{

打印棋盤;

以下循環(huán){

接收鍵盤輸入

輸入為esc,退出游戲

輸入為方向鍵,改變光標(biāo)位置

輸入為空格,走子并判定勝負(fù),分出勝負(fù)則跳出循環(huán)

}

處理勝利事件

}

具體為代碼就是

void Gamerun()
{
    int input;//定義鍵盤輸入字符
    Initialize();//初始化變量
    while(1)
    {
        Datatomap();//將對局信息輸入緩沖變量
        Showcursor();//將光標(biāo)加入緩沖變量
        Printmap();   //打印棋盤
        input=getch();//等待鍵盤輸入指令
        if(input==27)exit(0); //若輸入是Esc,退出游戲
        else if(input==32)//若輸入空格,進(jìn)行走子
        {
            if(Put())//走子成功
            {
                if(Check())break;//檢查是否分出勝負(fù)
                else
                    now=3-now;//切換走子方
            }
            else;//走子失敗
        }
        else if(input==0xE0)//如果按下的是方向鍵,會填充兩次輸入,第一次為0xE0表示按下的是控制鍵
        {
            Movecursor(getch());//利用第二次輸入移動光標(biāo)
        }
        else;
    }
    Showtest();//將勝利文字輸入緩沖區(qū)
    Printmap();//打印棋盤
    getch();//輸入任意鍵開始下一局游戲
}

getch()可以立即對輸入的字符做出反應(yīng),而不像getchar()還要輸入回車。

 

我們來詳細(xì)看這幾個(gè)步驟。

1. 初始化變量:隨著項(xiàng)目的推進(jìn),我們自然會知道哪些數(shù)據(jù)需要初始化。先在這里放一個(gè)空函數(shù)。

void Initialize()
{  
}

2. 打印棋盤:

我們可以通過打印制表符的方式來拼接整個(gè)棋盤。自然,我們需要一個(gè)緩沖變量來存儲整個(gè)棋盤的信息,這個(gè)變量又是對局信息經(jīng)過轉(zhuǎn)換得到的。

 

int data[LENGTH][LENGTH];//儲存對局信息,0空白,1黑子,2白子

char map[LENGTH*2+1][LENGTH*2+1][5];//需要打印的棋盤,包括邊框,子的位置,以及文字

(建議緩沖變量不要像我這么寫。這個(gè)三維字符數(shù)組的本意是想構(gòu)建一個(gè)二維的字符串組,但在后續(xù)的操作中,就會發(fā)現(xiàn)這引起了可能的麻煩。有條件的同學(xué)可以試試,改變這個(gè)變量的形式,看看這個(gè)程序應(yīng)該怎么寫。)

 

設(shè)定將對局信息轉(zhuǎn)化為緩沖變量的函數(shù)

void Datatomap()//由對局信息生成棋盤信息
{
    int i,j;
    for(i=0;i<LENGTH*2+1;i++)
    {
        for(j=0;j<LENGTH*2+1;j++)
        {
            if(i==0&&j==0)strcpy(map[i][j]," ┏");
            else if(i==0&&j==LENGTH*2)strcpy(map[i][j]," ┓");
            else if(i==LENGTH*2&&j==0)strcpy(map[i][j]," ┗");
            else if(i==LENGTH*2&&j==LENGTH*2)strcpy(map[i][j]," ┛");
            else if(i==0&&j%2==0)strcpy(map[i][j]," ┯");
            else if(i==LENGTH*2&&j%2==0)strcpy(map[i][j]," ┷");
            else if((i==0||i==LENGTH*2)&&j%2==1)strcpy(map[i][j]," ━");
            else if(j==0&&i%2==0)strcpy(map[i][j]," ┠ ");
            else if(j==LENGTH*2&&i%2==0)strcpy(map[i][j],"┨");
            else if((j==0||j==LENGTH*2)&&i%2==1)strcpy(map[i][j]," ┃");
            else if(i%2==0&&j%2==0&&data[i/2][j/2]==0)strcpy(map[i][j],"┼ ");//注意棋盤變量的長度和棋局變量并不相同
            else if(i%2==0&&j%2==0&&data[i/2][j/2]==1)strcpy(map[i][j],"●");
            else if(i%2==0&&j%2==0&&data[i/2][j/2]==2)strcpy(map[i][j],"○");
            else if(i%2==0&&j%2==1)strcpy(map[i][j],"—");
            else if(i%2==1&&j%2==0)strcpy(map[i][j]," │");
            else
                strcpy(map[i][j],"  ");
        }
    }
}

 

設(shè)定打印棋盤信息的函數(shù)

void Printmap()//將棋盤信息打印至屏幕
{
    system("cls");//清理屏幕,準(zhǔn)備寫入
    int i,j;
    char line[100];//定義一個(gè)函數(shù),存放當(dāng)前輸出行的數(shù)據(jù)
    for(i=0;i<LENGTH*2+1;i++)//逐行輸出棋盤數(shù)據(jù)
    {
        strcpy(line,"");
        for(j=0;j<LENGTH*2+1;j++)
        {
            strcat(line,map[i][j]);//將輸出拼接到該行的末尾
        }
        printf("%s",line);//打印該行的數(shù)據(jù)
        if(i<LENGTH*2)printf("\n");
        else;
    }
}這里設(shè)定每次打印一行的數(shù)據(jù)。如果利用雙循環(huán),調(diào)用printf次數(shù)過多,會變得很卡。

 

完成這一步之后,屏幕上應(yīng)該已經(jīng)能看到輸出了。有可能字符的位置還是不大對,通過改變?yōu)閙ap[i][j]賦值的函數(shù)內(nèi)容,可以看出究竟是哪里出了問題,然后在適當(dāng)?shù)奈恢锰砑涌崭裾{(diào)整。

現(xiàn)在我們的成果是這樣的。

棋盤效果

之后每做一步,也可以看看顯示界面的變化,這樣方便及時(shí)修正程序當(dāng)中的錯(cuò)誤。

 

3. 接收鍵盤輸入并處理命令:

如果輸入為Esc,退出程序。

if(input==27)exit(0); //若輸入是Esc,退出游戲

如果輸入為方向鍵,切換光標(biāo)指示的位置。

else if(input==0xE0)//如果按下的是方向鍵,會填充兩次輸入,第一次為0xE0表示按下的是控制鍵
{
     Movecursor(getch());//利用第二次輸入移動光標(biāo)
}

這里需要定義一個(gè)函數(shù),以顯示光標(biāo)位置。

void Showcursor()//在棋盤信息中加入光標(biāo)位置
{
    strcpy(map[x*2-1][y*2-1]," ┏");
    strcpy(map[x*2-1][y*2+1]," ┓");
    strcpy(map[x*2+1][y*2-1]," ┗");
    strcpy(map[x*2+1][y*2+1]," ┛");//在光標(biāo)的周圍加入制表符
}

 

如果輸入空格,執(zhí)行走子程序。

else if(input==32)//若輸入空格,進(jìn)行走子
{
   if(Put())//走子成功
   {
         if(Check())break;//檢查是否分出勝負(fù)
         else
          now=3-now;//切換走子方
   }
   else;//走子失敗
}

 

4. 走子并且檢驗(yàn)勝負(fù)

走子后,修改棋局變量,打印棋盤。

int Put()//走子
{
    if(data[x][y]==0)//若光標(biāo)處無子
    {
        data[x][y]=now;//改變棋局?jǐn)?shù)據(jù)
        Datatomap();//由對局?jǐn)?shù)據(jù)生成棋盤信息
        Printmap;//打印棋盤
        return 1;
    }
    else
        return 0;
}

 

定義檢驗(yàn)是否分出勝負(fù)的函數(shù)。

int Check()//檢查從落子點(diǎn)出發(fā),八個(gè)方向該類型棋子的數(shù)目
{
    int a=0,b=0,c=0,d=0,i;//四個(gè)方向上連續(xù)子的數(shù)目
    for(i=1;i<5;i++)
    {
        if(x+i>=0&&x+i<LENGTH&&data[x+i][y]==now)a++;
        else break;
    }
    for(i=1;i<5;i++)
    {
        if(x-i>=0&&x-i<LENGTH&&data[x-i][y]==now)a++;
        else break;
    }
    for(i=1;i<5;i++)
    {
        if(y+i>=0&&y+i<LENGTH&&data[x][y+i]==now)b++;
        else break;
    }
    for(i=1;i<5;i++)
    {
        if(y-i>=0&&y-i<LENGTH&&data[x][y-i]==now)b++;
        else break;
    }
    for(i=1;i<5;i++)
    {
        if(y+i<LENGTH&&x+i<LENGTH&&data[x+i][y+i]==now)c++;
        else break;
    }
    for(i=1;i<5;i++)
    {
        if(y-i>=0&&x-i>=0&&data[x-i][y-i]==now)c++;
        else break;
    }
    for(i=1;i<5;i++)
    {
        if(y-i>=0&&x+i<LENGTH&&data[x+i][y-i]==now)d++;
        else break;
    }
    for(i=1;i<5;i++)
    {
        if(y+i<LENGTH&&x-i>=0&&data[x-i][y+i]==now)d++;
        else break;
    }
    if(a==4||b==4||c==4||d==4)return 1;
    else return 0;
}

 

5. 處理勝利事件

在勝利時(shí)需要一個(gè)表達(dá)文本的功能。設(shè)定一個(gè)函數(shù),通過改變緩沖變量間接打印文字。

void Showtest()//勝利時(shí)加入文字
{
    if(now==1)
    {
        strcpy(map[15][14],"黑");
        strcpy(map[15][15],"勝");
        strcpy(map[15][16],"!");
    }
    else
    {
       strcpy(map[15][14],"白");
        strcpy(map[15][15],"勝");
        strcpy(map[15][16],"!");
    }
}

增加勝利文字,打印棋盤;輸入任意鍵,重新開始游戲。

Showtest();//將勝利文字輸入緩沖區(qū)
    Printmap();//打印棋盤
    getch();//輸入任意鍵開始下一局游戲



四,完整代碼下載

C語言五子棋源碼下載  

點(diǎn)贊(8)

C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍(lán)橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點(diǎn)擊了解:

一點(diǎn)編程也不會寫的:零基礎(chǔ)C語言學(xué)練課程

解決困擾你多年的C語言疑難雜癥特性的C語言進(jìn)階課程

從零到寫出一個(gè)爬蟲的Python編程課程

只會語法寫不出代碼?手把手帶你寫100個(gè)編程真題的編程百練課程

信息學(xué)奧賽或C++選手的 必學(xué)C++課程

藍(lán)橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競賽課入門課程

手把手講解近五年真題的藍(lán)橋杯輔導(dǎo)課程

Dotcpp在線編譯      (登錄可減少運(yùn)行等待時(shí)間)