學(xué)習(xí)啦 > 興趣愛(ài)好 > 學(xué)下棋 > 五子棋 > 如何用c語(yǔ)言做五子棋

如何用c語(yǔ)言做五子棋

時(shí)間: 雪花750 分享

如何用c語(yǔ)言做五子棋

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

  用c語(yǔ)言做五子棋的方法

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

五子棋C語(yǔ)言代碼如下

  #include

  #include

  #include

  #include

  #include

  #define CROSSRU 0xbf /*右上角點(diǎn)*/

  #define CROSSLU 0xda /*左上角點(diǎn)*/

  #define CROSSLD 0xc0 /*左下角點(diǎn)*/

  #define CROSSRD 0xd9 /*右下角點(diǎn)*/

  #define CROSSL 0xc3 /*左邊*/

  #define CROSSR 0xb4 /*右邊*/

  #define CROSSU 0xc2 /*上邊*/

  #define CROSSD 0xc1 /*下邊*/

  #define CROSS 0xc5 /*十字交叉點(diǎn)*/

  /*定義棋盤(pán)左上角點(diǎn)在屏幕上的位置*/

  #define MAPXOFT 5

  #define MAPYOFT 2

  /*定義1號(hào)玩家的操作鍵鍵碼*/

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

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

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

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

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

  /*定義2號(hào)玩家的操作鍵鍵碼*/

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

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

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

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

  #define PLAY2DO 0x1c0d/*落子--回車(chē)鍵Enter*/

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

  #define ESCAPE 0x011b

  /*定義棋盤(pán)上交叉點(diǎn)的狀態(tài), 即該點(diǎn)有無(wú)棋子 */

  /*若有棋子, 還應(yīng)能指出是哪個(gè)玩家的棋子 */

  #define CHESSNULL 0 /*沒(méi)有棋子*/

  #define CHESS1 'O'/*一號(hào)玩家的棋子*/

  #define CHESS2 'X'/*二號(hào)玩家的棋子*/

  /*定義按鍵類(lèi)別*/

  #define KEYEXIT 0/*退出鍵*/

  #define KEYFALLCHESS 1/*落子鍵*/

  #define KEYMOVECURSOR 2/*光標(biāo)移動(dòng)鍵*/

  #define KEYINVALID 3/*無(wú)效鍵*/

  /*定義符號(hào)常量: 真, 假 --- 真為1, 假為0 */

  #define TRUE 1

  #define FALSE 0

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

  /* 定義數(shù)據(jù)結(jié)構(gòu) */

  /*棋盤(pán)交叉點(diǎn)坐標(biāo)的數(shù)據(jù)結(jié)構(gòu)*/

  struct point

  {

  int x,y;

  };

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

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

  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; /*指示當(dāng)前行棋方 */

  struct point gCursor; /*光標(biāo)在棋盤(pán)上的位置 */

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

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

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

  /*主函數(shù)*/

  void main()

  {

  int press;

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

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

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

  while(1)

  {

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

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

  {

  /*是退出鍵*/

  case KEYEXIT:

  clrscr();/*清屏*/

  bOutWhile = TRUE;

  break;

  /*是落子鍵*/

  case KEYFALLCHESS:

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

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

  else

  {

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

  /*如果當(dāng)前行棋方贏棋*/

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

  {

  DoWin(gPlayOrder);

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

  }

  /*否則*/

  else

  /*交換行棋方*/

  ChangeOrder();

  ShowOrderMsg(gPlayOrder);

  }

  break;

  /*是光標(biāo)移動(dòng)鍵*/

  case KEYMOVECURSOR:

  MoveCursor(gPlayOrder,press);

  break;

  /*是無(wú)效鍵*/

  case KEYINVALID:

  break;

  }

  if(bOutWhile==TRUE)

  break;

  }

  /*游戲結(jié)束*/

  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號(hào)玩家 */

  gPlayOrder = CHESS1;

  /* 棋盤(pán)數(shù)據(jù)清零, 即棋盤(pán)上各點(diǎn)開(kāi)始的時(shí)候都沒(méi)有棋子 */

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

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

  gChessBoard[i][j]=CHESSNULL;

  /*光標(biāo)初始位置*/

  gCursor.x=gCursor.y=0;

  /*畫(huà)棋盤(pán)*/

  textmode(C40);

  DrawMap();

  /*顯示操作鍵說(shuō)明*/

  i=0;

  textcolor(BROWN);

  while(Msg[i]!=NULL)

  {

  gotoxy(25,3+i);

  cputs(Msg[i]);

  i++;

  }

  /*顯示當(dāng)前行棋方*/

  ShowOrderMsg(gPlayOrder);

  /*光標(biāo)移至棋盤(pán)的左上角點(diǎn)處*/

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

  }

  /*畫(huà)棋盤(pán)*/

  void DrawMap(void)

  {

  int i,j;

  clrscr();

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

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

  DrawCross(i,j);

  }

  /*畫(huà)棋盤(pán)上的交叉點(diǎn)*/

  void DrawCross(int x,int y)

  {

  gotoxy(x+MAPXOFT,y+MAPYOFT);

  /*交叉點(diǎn)上是一號(hào)玩家的棋子*/

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

  {

  textcolor(LIGHTBLUE);

  putch(CHESS1);

  return;

  }

  /*交叉點(diǎn)上是二號(hào)玩家的棋子*/

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

  {

  textcolor(LIGHTBLUE);

  putch(CHESS2);

  return;

  }

  textcolor(GREEN);

  /*左上角交叉點(diǎn)*/

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

  {

  putch(CROSSLU);

  return;

  }

  /*左下角交叉點(diǎn)*/

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

  {

  putch(CROSSLD);

  return;

  }

  /*右上角交叉點(diǎn)*/

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

  {

  putch(CROSSRU);

  return;

  }

  /*右下角交叉點(diǎn)*/

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

  {

  putch(CROSSRD);

  return;

  }

  /*左邊界交叉點(diǎn)*/

  if(x==0)

  {

  putch(CROSSL);

  return;

  }

  /*右邊界交叉點(diǎn)*/

  if(x==18)

  {

  putch(CROSSR);

  return;

  }

  /*上邊界交叉點(diǎn)*/

  if(y==0)

  {

  putch(CROSSU);

  return;

  }

  /*下邊界交叉點(diǎn)*/

  if(y==18)

  {

  putch(CROSSD);

  return;

  }

  /*棋盤(pán)中間的交叉點(diǎn)*/

  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)

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

  press=bioskey(0);

  lowbyte=press&0xff;

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

  return(press);

  }

  /*落子錯(cuò)誤處理*/

  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)

  {

  /*判斷交叉點(diǎn)上有無(wú)棋子*/

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

  {

  /*若沒(méi)有棋子, 則可以落子*/

  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;

  }

  /*判斷當(dāng)前行棋方落子后是否贏棋*/

  int JudgeWin(int Order,struct point Cursor)

  {

  int i;

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

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

  if(JudgeWinLine(Order,Cursor,i))

  return TRUE;

  return FALSE;

  }

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

  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;

  }

  /*移動(dòng)光標(biāo)*/

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

  }

  /*游戲結(jié)束處理*/

  void EndGame(void)

  {

  textmode(C80);

  }

  /*顯示當(dāng)前行棋方*/

  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();

  }

  /*檢查用戶的按鍵類(lèi)別*/

  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;/*是光標(biāo)移動(dòng)鍵*/

  else

  return KEYINVALID;/*按鍵無(wú)效*/

  }


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

1.五子棋必勝開(kāi)局技巧

2.五子棋如何入門(mén)

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

4.五子棋開(kāi)局大全 26種開(kāi)局方法

5.競(jìng)技五子棋

646554