C编程练习-五子棋升级版(键盘上下左右控制落子)

发布时间 2023-07-28 15:05:19作者: luojfan

#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>
#include<getch.h>

char board[15][15]; //棋盘
char role = '@'; //角色
char key_x,key_y; //下子坐标

//初始化棋盘
void init_board(void)
{
  for(int i=0; i<15; i++)
  {
    for(int j=0; j<15; j++)
    {
      board[i][j] = '*';
    }
  }
}

//显示棋盘
void show_board(void)
{
  system("clear");
  for(int i=0; i<15; i++)
  {
    for(int j=0; j<15; j++)
    {
      printf(" %c",board[i][j]);
    }
    printf("\n");
  }
}

//落子
void get_key(void)
{
  printf("请%c落子:",role);
  for(;;)
  {
    printf("\33[%hhd;%hhdH",key_x+1,(key_y+1)*2);
    switch(getch())

    {
      case 183: key_x > 0 && key_x--; break;  //上
      case 184: key_x < 14 && key_x++; break; //下
      case 186: key_y > 0 && key_y--; break;  //左
      case 185: key_y < 14 && key_y++; break;//右
      case 10:
      if('*' == board[key_x][key_y])
      {
        board[key_x][key_y] = role;
        return;
      }
    }
  }
}

//计算某个小方向上有多少个连续棋子
int count_key(int ox,int oy) //    左:ox=-1       右:ox=1         上: oy=-1         下: oy=1
{
  int count = 0;
  for(int x=key_x+ox,y=key_y+oy; 0<=x && 14>=x && 0<=y && 14>=y; x+=ox,y+=oy)
  {
    if(board[x][y] == role) count++;
    else break;
  }
  return count;
}

//判断是否五子连珠
bool is_win(void)
{
  if(4<=count_key(-1,0)+count_key(1,0)) return true; //横
  if(4<=count_key(0,-1)+count_key(0,1)) return true; //竖
  if(4<=count_key(-1,-1)+count_key(1,1)) return true; //左对角线
  if(4<=count_key(-1,1)+count_key(1,-1)) return true; //右对角线
  return false;
}

int main(int argc,const char* argv[])
{
  init_board();
  for(int i=0; i<225; i++)
  {
    show_board();

    get_key();

    if(is_win())
    {
     show_board();
      printf("游戏结束,恭喜%c胜利!\n",role);
      return 0;
    }

    //交换角色
    role = role=='@'? '$' : '@';
  }
  printf("和棋!\n");
}