亚洲欧美精品沙发,日韩在线精品视频,亚洲Av每日更新在线观看,亚洲国产另类一区在线5

<pre id="hdphd"></pre>

  • <div id="hdphd"><small id="hdphd"></small></div>
      學習啦 > 興趣愛好 > 學下棋 > 五子棋 > 如何用c語言做五子棋

      如何用c語言做五子棋

      時間: 雪花750 分享

      如何用c語言做五子棋

        五子棋主要流行于華人和漢字文化圈的國家以及歐美一些地區(qū),是世界上最古老的棋。下面學習啦小編給你介紹如何用c語言做五子棋,歡迎閱讀。

        用c語言做五子棋的方法

        五子棋游戲是一款很經(jīng)典的智力游戲,只有學過編程語言的人,把五子棋的編程原理弄懂了,就能用自己熟悉的語言實現(xiàn)出來。

      五子棋C語言代碼如下

        #include

        #include

        #include

        #include

        #include

        #define CROSSRU 0xbf /*右上角點*/

        #define CROSSLU 0xda /*左上角點*/

        #define CROSSLD 0xc0 /*左下角點*/

        #define CROSSRD 0xd9 /*右下角點*/

        #define CROSSL 0xc3 /*左邊*/

        #define CROSSR 0xb4 /*右邊*/

        #define CROSSU 0xc2 /*上邊*/

        #define CROSSD 0xc1 /*下邊*/

        #define CROSS 0xc5 /*十字交叉點*/

        /*定義棋盤左上角點在屏幕上的位置*/

        #define MAPXOFT 5

        #define MAPYOFT 2

        /*定義1號玩家的操作鍵鍵碼*/

        #define PLAY1UP 0x1157/*上移--'W'*/

        #define PLAY1DOWN 0x1f53/*下移--'S'*/

        #define PLAY1LEFT 0x1e41/*左移--'A'*/

        #define PLAY1RIGHT 0x2044/*右移--'D'*/

        #define PLAY1DO 0x3920/*落子--空格鍵*/

        /*定義2號玩家的操作鍵鍵碼*/

        #define PLAY2UP 0x4800/*上移--方向鍵up*/

        #define PLAY2DOWN 0x5000/*下移--方向鍵down*/

        #define PLAY2LEFT 0x4b00/*左移--方向鍵left*/

        #define PLAY2RIGHT 0x4d00/*右移--方向鍵right*/

        #define PLAY2DO 0x1c0d/*落子--回車鍵Enter*/

        /*若想在游戲中途退出, 可按 Esc 鍵*/

        #define ESCAPE 0x011b

        /*定義棋盤上交叉點的狀態(tài), 即該點有無棋子 */

        /*若有棋子, 還應能指出是哪個玩家的棋子 */

        #define CHESSNULL 0 /*沒有棋子*/

        #define CHESS1 'O'/*一號玩家的棋子*/

        #define CHESS2 'X'/*二號玩家的棋子*/

        /*定義按鍵類別*/

        #define KEYEXIT 0/*退出鍵*/

        #define KEYFALLCHESS 1/*落子鍵*/

        #define KEYMOVECURSOR 2/*光標移動鍵*/

        #define KEYINVALID 3/*無效鍵*/

        /*定義符號常量: 真, 假 --- 真為1, 假為0 */

        #define TRUE 1

        #define FALSE 0

        /**********************************************************/

        /* 定義數(shù)據(jù)結構 */

        /*棋盤交叉點坐標的數(shù)據(jù)結構*/

        struct point

        {

        int x,y;

        };

        /**********************************************************/

        /*自定義函數(shù)原型說明 */

        void Init(void);

        int GetKey(void);

        int CheckKey(int press);

        int ChangeOrder(void);

        int ChessGo(int Order,struct point Cursor);

        void DoError(void);

        void DoOK(void);

        void DoWin(int Order);

        void MoveCursor(int Order,int press);

        void DrawCross(int x,int y);

        void DrawMap(void);

        int JudgeWin(int Order,struct point Cursor);

        int JudgeWinLine(int Order,struct point Cursor,int direction);

        void ShowOrderMsg(int Order);

        void EndGame(void);

        /**********************************************************/

        /**********************************************************/

        /* 定義全局變量 */

        int gPlayOrder; /*指示當前行棋方 */

        struct point gCursor; /*光標在棋盤上的位置 */

        char gChessBoard[19][19];/*用于記錄棋盤上各點的狀態(tài)*/

        /**********************************************************/

        /**********************************************************/

        /*主函數(shù)*/

        void main()

        {

        int press;

        int bOutWhile=FALSE;/*退出循環(huán)標志*/

        printf("Welcome www.schoolhacker.com");

        Init();/*初始化圖象,數(shù)據(jù)*/

        while(1)

        {

        press=GetKey();/*獲取用戶的按鍵值*/

        switch(CheckKey(press))/*判斷按鍵類別*/

        {

        /*是退出鍵*/

        case KEYEXIT:

        clrscr();/*清屏*/

        bOutWhile = TRUE;

        break;

        /*是落子鍵*/

        case KEYFALLCHESS:

        if(ChessGo(gPlayOrder,gCursor)==FALSE)/*走棋*/

        DoError();/*落子錯誤*/

        else

        {

        DoOK();/*落子正確*/

        /*如果當前行棋方贏棋*/

        if(JudgeWin(gPlayOrder,gCursor)==TRUE)

        {

        DoWin(gPlayOrder);

        bOutWhile = TRUE;/*退出循環(huán)標志置為真*/

        }

        /*否則*/

        else

        /*交換行棋方*/

        ChangeOrder();

        ShowOrderMsg(gPlayOrder);

        }

        break;

        /*是光標移動鍵*/

        case KEYMOVECURSOR:

        MoveCursor(gPlayOrder,press);

        break;

        /*是無效鍵*/

        case KEYINVALID:

        break;

        }

        if(bOutWhile==TRUE)

        break;

        }

        /*游戲結束*/

        EndGame();

        }

        /**********************************************************/

        /*界面初始化,數(shù)據(jù)初始化*/

        void Init(void)

        {

        int i,j;

        char *Msg[]=

        {

        "Player1 key:",

        " UP----w",

        " DOWN--s",

        " LEFT--a",

        " RIGHT-d",

        " DO----space",

        "",

        "Player2 key:",

        " UP----up",

        " DOWN--down",

        " LEFT--left",

        " RIGHT-right",

        " DO----ENTER",

        "",

        "exit game:",

        " ESC",

        NULL,

        };

        /* 先手方為1號玩家 */

        gPlayOrder = CHESS1;

        /* 棋盤數(shù)據(jù)清零, 即棋盤上各點開始的時候都沒有棋子 */

        for(i=0;i<19;i++)

        for(j=0;j<19;j++)

        gChessBoard[i][j]=CHESSNULL;

        /*光標初始位置*/

        gCursor.x=gCursor.y=0;

        /*畫棋盤*/

        textmode(C40);

        DrawMap();

        /*顯示操作鍵說明*/

        i=0;

        textcolor(BROWN);

        while(Msg[i]!=NULL)

        {

        gotoxy(25,3+i);

        cputs(Msg[i]);

        i++;

        }

        /*顯示當前行棋方*/

        ShowOrderMsg(gPlayOrder);

        /*光標移至棋盤的左上角點處*/

        gotoxy(gCursor.x+MAPXOFT,gCursor.y+MAPYOFT);

        }

        /*畫棋盤*/

        void DrawMap(void)

        {

        int i,j;

        clrscr();

        for(i=0;i<19;i++)

        for(j=0;j<19;j++)

        DrawCross(i,j);

        }

        /*畫棋盤上的交叉點*/

        void DrawCross(int x,int y)

        {

        gotoxy(x+MAPXOFT,y+MAPYOFT);

        /*交叉點上是一號玩家的棋子*/

        if(gChessBoard[x][y]==CHESS1)

        {

        textcolor(LIGHTBLUE);

        putch(CHESS1);

        return;

        }

        /*交叉點上是二號玩家的棋子*/

        if(gChessBoard[x][y]==CHESS2)

        {

        textcolor(LIGHTBLUE);

        putch(CHESS2);

        return;

        }

        textcolor(GREEN);

        /*左上角交叉點*/

        if(x==0&&y==0)

        {

        putch(CROSSLU);

        return;

        }

        /*左下角交叉點*/

        if(x==0&&y==18)

        {

        putch(CROSSLD);

        return;

        }

        /*右上角交叉點*/

        if(x==18&&y==0)

        {

        putch(CROSSRU);

        return;

        }

        /*右下角交叉點*/

        if(x==18&&y==18)

        {

        putch(CROSSRD);

        return;

        }

        /*左邊界交叉點*/

        if(x==0)

        {

        putch(CROSSL);

        return;

        }

        /*右邊界交叉點*/

        if(x==18)

        {

        putch(CROSSR);

        return;

        }

        /*上邊界交叉點*/

        if(y==0)

        {

        putch(CROSSU);

        return;

        }

        /*下邊界交叉點*/

        if(y==18)

        {

        putch(CROSSD);

        return;

        }

        /*棋盤中間的交叉點*/

        putch(CROSS);

        }

        /*交換行棋方*/

        int ChangeOrder(void)

        {

        if(gPlayOrder==CHESS1)

        gPlayOrder=CHESS2;

        else

        gPlayOrder=CHESS1;

        return(gPlayOrder);

        }

        /*獲取按鍵值*/

        int GetKey(void)

        {

        char lowbyte;

        int press;

        while (bioskey(1) == 0)

        ;/*如果用戶沒有按鍵,空循環(huán)*/

        press=bioskey(0);

        lowbyte=press&0xff;

        press=press&0xff00 + toupper(lowbyte);

        return(press);

        }

        /*落子錯誤處理*/

        void DoError(void)

        {

        sound(1200);

        delay(50);

        nosound();

        }

        /*贏棋處理*/

        void DoWin(int Order)

        {

        sound(1500);delay(100);

        sound(0); delay(50);

        sound(800); delay(100);

        sound(0); delay(50);

        sound(1500);delay(100);

        sound(0); delay(50);

        sound(800); delay(100);

        sound(0); delay(50);

        nosound();

        textcolor(RED+BLINK);

        gotoxy(25,20);

        if(Order==CHESS1)

        cputs("PLAYER1 WIN!");

        else

        cputs("PLAYER2 WIN!");

        gotoxy(25,21);

        cputs(" \<^+^>/");

        getch();

        }

        /*走棋*/

        int ChessGo(int Order,struct point Cursor)

        {

        /*判斷交叉點上有無棋子*/

        if(gChessBoard[Cursor.x][Cursor.y]==CHESSNULL)

        {

        /*若沒有棋子, 則可以落子*/

        gotoxy(Cursor.x+MAPXOFT,Cursor.y+MAPYOFT);

        textcolor(LIGHTBLUE);

        putch(Order);

        gotoxy(Cursor.x+MAPXOFT,Cursor.y+MAPYOFT);

        gChessBoard[Cursor.x][Cursor.y]=Order;

        return TRUE;

        }

        else

        return FALSE;

        }

        /*判斷當前行棋方落子后是否贏棋*/

        int JudgeWin(int Order,struct point Cursor)

        {

        int i;

        for(i=0;i<4;i++)

        /*判斷在指定方向上是否有連續(xù)5個行棋方的棋子*/

        if(JudgeWinLine(Order,Cursor,i))

        return TRUE;

        return FALSE;

        }

        /*判斷在指定方向上是否有連續(xù)5個行棋方的棋子*/

        int JudgeWinLine(int Order,struct point Cursor,int direction)

        {

        int i;

        struct point pos,dpos;

        const int testnum = 5;

        int count;

        switch(direction)

        {

        case 0:/*在水平方向*/

        pos.x=Cursor.x-(testnum-1);

        pos.y=Cursor.y;

        dpos.x=1;

        dpos.y=0;

        break;

        case 1:/*在垂直方向*/

        pos.x=Cursor.x;

        pos.y=Cursor.y-(testnum-1);

        dpos.x=0;

        dpos.y=1;

        break;

        case 2:/*在左下至右上的斜方向*/

        pos.x=Cursor.x-(testnum-1);

        pos.y=Cursor.y+(testnum-1);

        dpos.x=1;

        dpos.y=-1;

        break;

        case 3:/*在左上至右下的斜方向*/

        pos.x=Cursor.x-(testnum-1);

        pos.y=Cursor.y-(testnum-1);

        dpos.x=1;

        dpos.y=1;

        break;

        }

        count=0;

        for(i=0;i

        {

        if(pos.x>=0&&pos.x<=18&&pos.y>=0&&pos.y<=18)

        {

        if(gChessBoard[pos.x][pos.y]==Order)

        {

        count++;

        if(count>=testnum)

        return TRUE;

        }

        else

        count=0;

        }

        pos.x+=dpos.x;

        pos.y+=dpos.y;

        }

        return FALSE;

        }

        /*移動光標*/

        void MoveCursor(int Order,int press)

        {

        switch(press)

        {

        case PLAY1UP:

        if(Order==CHESS1&&gCursor.y>0)

        gCursor.y--;

        break;

        case PLAY1DOWN:

        if(Order==CHESS1&&gCursor.y<18)

        gCursor.y++;

        break;

        case PLAY1LEFT:

        if(Order==CHESS1&&gCursor.x>0)

        gCursor.x--;

        break;

        case PLAY1RIGHT:

        if(Order==CHESS1&&gCursor.x<18)

        gCursor.x++;

        break;

        case PLAY2UP:

        if(Order==CHESS2&&gCursor.y>0)

        gCursor.y--;

        break;

        case PLAY2DOWN:

        if(Order==CHESS2&&gCursor.y<18)

        gCursor.y++;

        break;

        case PLAY2LEFT:

        if(Order==CHESS2&&gCursor.x>0)

        gCursor.x--;

        break;

        case PLAY2RIGHT:

        if(Order==CHESS2&&gCursor.x<18)

        gCursor.x++;

        break;

        }

        gotoxy(gCursor.x+MAPXOFT,gCursor.y+MAPYOFT);

        }

        /*游戲結束處理*/

        void EndGame(void)

        {

        textmode(C80);

        }

        /*顯示當前行棋方*/

        void ShowOrderMsg(int Order)

        {

        gotoxy(6,MAPYOFT+20);

        textcolor(LIGHTRED);

        if(Order==CHESS1)

        cputs("Player1 go!");

        else

        cputs("Player2 go!");

        gotoxy(gCursor.x+MAPXOFT,gCursor.y+MAPYOFT);

        }

        /*落子正確處理*/

        void DoOK(void)

        {

        sound(500);

        delay(70);

        sound(600);

        delay(50);

        sound(1000);

        delay(100);

        nosound();

        }

        /*檢查用戶的按鍵類別*/

        int CheckKey(int press)

        {

        if(press==ESCAPE)

        return KEYEXIT;/*是退出鍵*/

        else

        if

        ( ( press==PLAY1DO && gPlayOrder==CHESS1) ||

        ( press==PLAY2DO && gPlayOrder==CHESS2)

        )

        return KEYFALLCHESS;/*是落子鍵*/

        else

        if

        ( press==PLAY1UP || press==PLAY1DOWN ||

        press==PLAY1LEFT || press==PLAY1RIGHT ||

        press==PLAY2UP || press==PLAY2DOWN ||

        press==PLAY2LEFT || press==PLAY2RIGHT

        )

        return KEYMOVECURSOR;/*是光標移動鍵*/

        else

        return KEYINVALID;/*按鍵無效*/

        }


      看了“如何用c語言做五子棋 ”的人還看了:

      1.五子棋必勝開局技巧

      2.五子棋如何入門

      3.五子棋六種布陣方法介紹

      4.五子棋開局大全 26種開局方法

      5.競技五子棋

      646557