• <output id="aynwq"><form id="aynwq"><code id="aynwq"></code></form></output>

    <mark id="aynwq"><option id="aynwq"></option></mark>
  • <mark id="aynwq"><option id="aynwq"></option></mark><label id="aynwq"><dl id="aynwq"></dl></label>
  • 學習啦 > 興趣愛好 > 學下棋 > 五子棋 > 如何用c語言做五子棋

    如何用c語言做五子棋

    時間: 雪花750 分享

    如何用c語言做五子棋

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

      用c語言做五子棋的方法

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

    五子棋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

      /*定義棋盤上交叉點的狀態, 即該點有無棋子 */

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

      #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

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

      /* 定義數據結構 */

      /*棋盤交叉點坐標的數據結構*/

      struct point

      {

      int x,y;

      };

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

      /*自定義函數原型說明 */

      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];/*用于記錄棋盤上各點的狀態*/

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

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

      /*主函數*/

      void main()

      {

      int press;

      int bOutWhile=FALSE;/*退出循環標志*/

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

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

      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;/*退出循環標志置為真*/

      }

      /*否則*/

      else

      /*交換行棋方*/

      ChangeOrder();

      ShowOrderMsg(gPlayOrder);

      }

      break;

      /*是光標移動鍵*/

      case KEYMOVECURSOR:

      MoveCursor(gPlayOrder,press);

      break;

      /*是無效鍵*/

      case KEYINVALID:

      break;

      }

      if(bOutWhile==TRUE)

      break;

      }

      /*游戲結束*/

      EndGame();

      }

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

      /*界面初始化,數據初始化*/

      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;

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

      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)

      ;/*如果用戶沒有按鍵,空循環*/

      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++)

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

      if(JudgeWinLine(Order,Cursor,i))

      return TRUE;

      return FALSE;

      }

      /*判斷在指定方向上是否有連續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 主站蜘蛛池模板: 久久国产精品久久久久久久久久| 国产精品久久久尹人香蕉| 噼里啪啦国语在线播放| 久久成人免费电影| 黑人巨大精品欧美一区二区免费 | 秋葵视频在线免费观看| 巨胸喷奶水www永久免费| 国产aaaaaa| 中文字幕成人在线| 自拍偷自拍亚洲精品播放| 护士强迫我闻她的臭丝袜脚| 国产xxxx色视频在线观看| 中文字幕第13亚洲另类| 精品露脸国产偷人在视频7| 成人18网址在线观看| 别揉我胸啊嗯奶喷了动态图| www视频在线观看| 激情三级hd中文字幕| 国产黄视频网站| 亚洲国产欧洲综合997久久| ass亚洲**毛茸茸pics| 最新黄色网址在线观看| 国产在线播放免费| 中文字幕日韩视频| 精品久久久久久亚洲精品| 天天久久综合网站| 亚洲最大成人网色香蕉| 婷婷综合五月天| 日韩av激情在线观看| 国产乱子伦视频在线观看| 中国性猛交xxxxx免费看| 男女做性猛烈叫床视频免费 | 四虎永久在线观看免费网站网址 | 亚洲武侠欧美自拍校园| 旧里番6080在线观看| 国产乱码卡一卡2卡三卡四| 中国女人一级毛片| 污污网站在线观看| 国产真实乱了全集磁力| 久久久亚洲欧洲日产国码二区| 精品欧美一区二区三区免费观看|