C五子棋项目

运行效果:

  

 思路:五子棋我们可以将代码分成棋盘和棋子两大部分,理所当然的,我们需要知道棋子下棋的位置和棋盘的大小。然后在五子棋中,我们是每下完一次棋便需要进行一次胜负的判定虽然在生活当中,在五子棋刚开始我们不会去思考胜负,但下到后面,我们仔细想想,我们是不是每下一次棋,便会思考胜负。当然,在回过头去想,对于编程来说,下棋的位置也需要进行思考

展示棋盘:

void ShowBoard(int board[][COL],int row,int col)
{
  printf("\e[1;1H\e[2J");
  printf(" ");
  int i=1;
  for(;i<=col;i++)
  {
    printf("%3d",i);
  }
  printf("\n");
  for(i=0;i<row;i++)
  {
    int j=0;
    printf("%2d",i+1);
    for(;j<col;j++)
    {
      if(board[i][j]==0)
        printf(" . ");
      else if(board[i][j]==PLAYER1)
        printf(" ◯ ");
      else if(board[i][j]==PLAYER2)
        printf(" ⬤ ");
    }
    printf("\n");
  }
}

下棋:

void PlayerMove(int board[][COL],int row,int col,int who)
{
  printf("Player%d Please Enter Your Pos#\n",who);
  while(1)
  {
    scanf("%d %d",&x,&y);
    if(x<1||x>row||y<1||y>col)
    {
      printf("Postion Error!\n");
      continue;
    }
    else if(board[x-1][y-1]!=0)
    {
      printf("Postion Is Occupied!\n");
      continue;
    }
    else
    {
      board[x-1][y-1]=who;
      break;
    }
  }
}

主体函数(game.c):

void game()
{
  int board[ROW][COL];
  memset(board,0,sizeof(board));
  int result=NEXT;
  do
  {
    ShowBoard(board,ROW,COL);
    PlayerMove(board,ROW,COL,PLAYER1);
    result=IsOver(board,ROW,COL);
    if(result!=NEXT) break;
    ShowBoard(board,ROW,COL);
    PlayerMove(board,ROW,COL,PLAYER2);
    result=IsOver(board,ROW,COL);
    if(result!=NEXT) break;
  }while(1);
  switch(result)
  {
    case PLAYER_WIN1:printf("恭喜用户1赢了\n");break;
    case PLAYER_WIN2:printf("恭喜用户2赢了\n");break;
    case DRAW:printf("平局\n");break;
    default:break;
  }
    ShowBoard(board,ROW,COL);
}

完整代码:

game.h

#include <stdio.h>
#include <string.h>
#define ROW 20
#define COL 20

#define NEXT 0
#define PLAYER1 1
#define PLAYER2 2

#define PLAYER_WIN1 1
#define PLAYER_WIN2 2
#define DRAW        3

enum Dir{
  LEFT,
  RIGHT,
  UP,
  DOWN,
  LEFT_UP,
  LEFT_DOWN,
  RIGHT_UP,
  RIGHT_DOWN
};

void menu();
void game();

game.c

#include "game.h"
int x=0;
int y=0;
void menu()
{
  printf("###########################\n");
  printf("#####1.play     0.exit#####\n");
  printf("###########################\n");
  printf("Please Selet# ");
}
int ChessCount(int board[][COL],int row,int col,enum Dir d)
{
  int _x=x-1;
  int _y=y-1;
  int count=0;
  while(1)
  {
    switch(d)
    {
      case LEFT:_y--;break;
      case LEFT_UP:_y--;_x--;break;
      case LEFT_DOWN:_y--;_x++;break;
      case UP:_x--;break;
      case DOWN:_x++;break;
      case RIGHT:_y++;break;
      case RIGHT_UP:_y++;_x--;break;
      case RIGHT_DOWN:_x++;_y++;break;
    }
    if(_x<0 ||_x >row-1 ||_y<0 ||_y>col-1)
    {
      break;
    }    
    if(board[x-1][y-1]==board[_x][_y])
    {
      count++;
    }
    else 
      break;
  }
  return count;
}
int IsOver(int board[][COL],int row,int col)
{
  int count1=ChessCount(board,ROW,COL,LEFT)+ChessCount(board,ROW,COL,RIGHT)+1;  
  int count2=ChessCount(board,ROW,COL,UP)+ChessCount(board,ROW,COL,DOWN)+1;  
  int count3=ChessCount(board,ROW,COL,LEFT_UP)+ChessCount(board,ROW,COL,RIGHT_DOWN)+1;  
  int count4=ChessCount(board,ROW,COL,LEFT_DOWN)+ChessCount(board,ROW,COL,RIGHT_UP)+1;  
  if(count1>=5 || count2>=5 ||count3>=5 || count4>=5)
  {
    if(board[x-1][y-1]==PLAYER1)
        return PLAYER1;
    return PLAYER2;
  }
  int i=0;
  for(;i<row;i++)
  {
    int j=0;
    for(;j<col;j++)
    {
      if(board[i][j]==0)
          return NEXT;
    }
  }
  return DRAW;
}
void ShowBoard(int board[][COL],int row,int col)
{
  printf("\e[1;1H\e[2J");
  printf(" ");
  int i=1;
  for(;i<=col;i++)
  {
    printf("%3d",i);
  }
  printf("\n");
  for(i=0;i<row;i++)
  {
    int j=0;
    printf("%2d",i+1);
    for(;j<col;j++)
    {
      if(board[i][j]==0)
        printf(" . ");
      else if(board[i][j]==PLAYER1)
        printf(" ◯ ");
      else if(board[i][j]==PLAYER2)
        printf(" ⬤ ");
    }
    printf("\n");
  }
}
void PlayerMove(int board[][COL],int row,int col,int who)
{
  printf("Player%d Please Enter Your Pos#\n",who);
  while(1)
  {
    scanf("%d %d",&x,&y);
    if(x<1||x>row||y<1||y>col)
    {
      printf("Postion Error!\n");
      continue;
    }
    else if(board[x-1][y-1]!=0)
    {
      printf("Postion Is Occupied!\n");
      continue;
    }
    else
    {
      board[x-1][y-1]=who;
      break;
    }
  }
}
void game()
{
  int board[ROW][COL];
  memset(board,0,sizeof(board));
  int result=NEXT;
  do
  {
    ShowBoard(board,ROW,COL);
    PlayerMove(board,ROW,COL,PLAYER1);
    result=IsOver(board,ROW,COL);
    if(result!=NEXT) break;
    ShowBoard(board,ROW,COL);
    PlayerMove(board,ROW,COL,PLAYER2);
    result=IsOver(board,ROW,COL);
    if(result!=NEXT) break;
  }while(1);
  switch(result)
  {
    case PLAYER_WIN1:printf("恭喜用户1赢了\n");break;
    case PLAYER_WIN2:printf("恭喜用户2赢了\n");break;
    case DRAW:printf("平局\n");break;
    default:break;
  }
    ShowBoard(board,ROW,COL);
}

main.c

#include "game.h"
int main()
{
  int input=0;
  int put=1;
  do
  {
    menu();
    scanf("%d",&input);
    switch(input)
    {
      case 1:game();break;
      case 0:put=0;printf("Good Bye\n");break;
      default :printf("Enter Erroy, Try Agin!\n");break; 
    }
  }while(put);
  return 0;
}

五子棋项目内容到此介绍结束了,感谢您的阅读!!!

如果内容对你有帮助的话,记得给我点个赞——做个手有余香的人。感谢大家的支持!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值