C编程练习-五子棋

五子棋项目:
数据分析:
1、定义15*15棋盘二维数组
2、定义角色变量(1?2?) '@'黑棋 '$' 白棋 '*'空
  char role = '@';
3、定义变量 用于记录落子位置
  逻辑分析:考虑是否需要初始化棋盘
for(;;)
{
  1、清屏、打印棋盘
  2、落子
    判断是否超范围 如果是则提示非法并重新落子
    判断是否已有棋子,如果是则提示并重新落子成功落子才继续
  3、判断是否五子连珠
     是:结束程序
  4、交换角色
}

 

代码:

复制代码
#include<stdio.h>
#include<stdbool.h>
#include<stdlib.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(;;)
  {
    scanf("%hhd %hhd",&key_x,&key_y);
    if(0>key_x || 14<key_x || 0>key_y || 14<key_y)
    {
      printf("坐标非法请重新输入:\n");
      continue;
    }
    if('*' != board[key_x][key_y])
    {
      printf("该位置已有棋子,请重新输入:");
      continue;
    }
    board[key_x][key_y] = role;
    return;
  }
}

//判断是否五子连珠
bool is_win(void)
{
  int cnt = 0;
  //左上
  for(int x=key_x-1,y=key_y-1;x>=0 &&y>=0;x--,y--)
  {
    if(board[x][y]==role) cnt++;
    else break;
  }
  //右下
  for(int x=key_x+1,y=key_y+1; x<=14&&y<=14; x++,y++)
  {
    if(board[x][y] == role) cnt++;
    else break;
  }
  if(4<=cnt) return true;

  cnt = 0;

//左下
  for(int x=key_x+1,y=key_y-1;x<=14 &&y>=0;x++,y--)
  {
    if(board[x][y]==role) cnt++;
    else break;
  }
//右上
  for(int x=key_x-1,y=key_y+1; x>=0&&y<=14; x--,y++)
  {
    if(board[x][y] == role) cnt++;
    else break;
  }
  if(4<=cnt) return true;

cnt=0;

//
  for(int x=key_x,y=key_y-1; y>=0;y--)
  {
    if(board[x][y]==role) cnt++;
    else break;
  }
//
  for(int x=key_x-1,y=key_y+1; y<=14; y++)
  {
    if(board[x][y] == role) cnt++;
    else break;
  }
  if(4<=cnt) return true;

  cnt = 0;

//
  for(int x=key_x-1,y=key_y-1; x>=0;x--)
  {
    if(board[x][y]==role) cnt++;
    else break;
  }
//
  for(int x=key_x-1,y=key_y+1; x<=14; x++)
  {
    if(board[x][y] == role) cnt++;
    else break;
  }
  if(4<=cnt) return true;

  return false;
}


int main(int argc,const char* argv[])
{
  init_board();
  for(;;)
  {
    show_board();

    get_key();

    if(is_win())
    {
      show_board();
      printf("%c赢了!\n",role);
      return 0;
    }

    //交换角色
    role = role=='@'? '$' : '@';
  }
}  
复制代码

 

posted @   冲他丫的  阅读(97)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示