完成简单的三子琪游 戏

基本思路

  1. 初始化棋盘:
  2. 下棋:
  3. 判断输赢

实现

1、初始化棋盘

void init_board(char board[ROW][COL], int row, int col)
{
 memset(&board[0][0],' ',row*col*sizeof(board[0][0]));
}

2、打印棋盘

void print_board(char board[ROW][COL], int row, int col)
{
 int i = 0;
 for (i = 0; i < row; i++)
 {
  int j = 0;
  for (j = 0; j < col; j++)
  {
   printf(" %c ",board[i][j]);
   if (j < col - 1)
    printf("|");
  }
  printf("\n");
  for (j = 0; j < col; j++)
  {
   printf("---");
   if (j < col - 1)
   {
    printf("|");
   }
  }
  printf("\n");
 }
}

3、下棋
第一步:玩家走

void play_move(char board[ROW][COL], int row, int col,int n)
{
 int x = 0, y = 0;
 while (1)
 {
  printf("请玩家输入坐标:->");
  scanf("%d%d",&x,&y);
  if (x >=1 && x <= n&& y>=1 && y <=n && board[x - 1][y - 1] == ' ')
  {
   board[x - 1][y - 1] = 'X';
   break;
  }
  else printf("输入错误请重新输入\n");
 }
}

第二步:电脑走

void compture_move(char board[ROW][COL], int row, int col,int n)
{
 while (1)
 {
  
  int x = rand() % n;
  int y = rand() % n;
  printf("电脑走\n");
  if (board[x][y] == ' ')
  {
   board[x][y] = 'Y';
   break;
  }
 }
}

4、判断输赢

char IF_WIN(char board[ROW][COL], int row, int col,int n )
{
 int i = 0;
 //判断行是否相等,如果相等返回此行第一个字符
  for (i = 0; i < row; i++)
  {
   int j = 0;
   int count = 0;
   char  ret = board[i][0];
   for (j = 1; j < col; j++)
   {
    if (ret== board[i][j])
    {
     count++;
    }
   }if (count == n-1)
   {
    return board[i][0];
   }
  }
  //判断列是否相等,如果相等返回此列第一个字符
  for (i = 0; i < row; i++)
  {
   int j = 0, count = 0;
   char  ret = board[0][i];
   for (j = 1; j < col; j++)
   {
    if (ret== board[j][i])
    {
     count++;
    }
   }
   if (count == n-1)
   {
    return board[0][i];
   }
  }
  //判断主对角线是否相等,如果相等返回此对角线第一个字符
    for (i = 0; i < row; i++)
  {
   int j = 0, count = 0;
   char ret = board[0][0];
   for (j = i; j <= i; j++)
   {
    if (ret== board[i][j])
    {
     count++;
    }
   }
   if (count == n-1)
   {
    return board[0][0];
   }
  }
   //判断次对角线是否相等,如果相等返回此对角线第一个字符
  for (i = 0; i < row; i++)
  {
   int j = 0, count = 0;
   char ret = board[0][2];
   for (j = 1-i; j <=1- i; j++)
   {
    if (ret==board[j][i])
    {
     count++;
    }
   }
   if (count == n-1)
   {
    return board[0][2];
   }
   }
   //判断平局
   if (1 == is_full(board, ROW, COL))///调用is_full函数
  {
   return 'Q';
  }
}
//判断棋盘是否已满
int is_full(char board[ROW][COL], int row, int col)
{
 int i = 0;
 char ret = 0;
 for (i = 0; i < row; i++)
 {
  int j = 0;
  for (j = 0; j < col; j++)
  {
   ret += board[i][j];
  }
 }
 if (ret == (('X '*(row-1)*(col-1))+('Y '*(row-1)*(col-1)))
  return 1;
}

主函数

#define _CRT_SECURE_NO_DEPRECATE 1
#include <stdio.h>
#include "game.h"
void game(char board[ROW][COL], int row, int col,int n)
{
 char ch = { 0 };
 init_board(board, ROW, COL);
 print_board(board, ROW, COL);
 while (1)
 {
  play_move(board, ROW, COL,n);
  ch=IF_WIN(board, ROW, COL,n);
  if ('X' == ch)
  {
   printf("玩家赢\n");
  }
  else if ('Y' == ch)
  {
   printf("电脑赢\n");
  }
  else if ('Q' == ch)
  {
   printf("平局\n");
  }
  print_board(board, ROW, COL);
  compture_move(board, ROW, COL,n);
  ch = IF_WIN(board, ROW, COL, n);
  if ('X' == ch)
  {
   printf("玩家赢\n");
  }
  else if ('Y' == ch)
  {
   printf("电脑赢\n");
  }
  else if ('Q' == ch)
  {
   printf("平局\n");
  }
  print_board(board, ROW, COL);
 }
}
int main()
{
 char board[ROW][COL] = {0};
 int input = 0;
 int n = 0;
 printf("请选择要玩的几子琪\n");
 scanf("%d", &n);
 srand((unsigned int)time(NULL));
 do 
 {
  menu();
  printf("请输入选择:>\n");
  scanf("%d", &input);
  switch (input)
  {
  case 1:game(board,ROW,COL,n); break;
  case 0:break;
  default:printf("输入错误请,请重新输入:>"); break;
  }
 } while (input);
 return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值