C实现三子棋 人机对弈

C语言实现的三子棋,可以人和电脑一起下棋。

源码在最后面!!!!!!

先展示效果!!!!

32d20486e0dd4825b5252902f9bd2ac5.png

 这里是运行结果,不过这个不是人工智能,可能是人工智障,由于我的水平也就这里,所以也写不出来比较聪明的人机。

9154dc66313144ef9ae81f305f3a2e7c.png

这里程序从main函数进去去调用test函数 

384b91c6068e47c0bc417435cc55569e.png

test函数中用来里面是逻辑大框,如果玩游戏的话,输入1可以走到game函数,game函数中是玩游戏的整个过程

d67f4a6822784a22855d2cd9b8c74f01.png

如果想要玩游戏的话首先得有棋盘,所以先打印棋盘,而棋盘中也需要可以存放玩家和电脑的落子,而存放落子可以通过数组实现

 所以首先得有数组存放落子

这里是数组的创建和初始化

a10d6d35c88f4eea8f539a4df013ff7a.png

 接下来就是打印棋盘

30e3e089c62a446abded340e7645eb1c.png

 

 等棋盘和存放落子的地方初始化和打印好之后,玩家和电脑就可以开始落子了

首先是玩家走

玩家走的地方必须在棋盘里面,所以用if判断玩家的落子位置是否合法,如果不合法需要重新落子,如果合法也需要判断落子的地方是否有子,如果没有即可以落子

701641af2c4c4a3da0ab640356b8db85.png

 接下来是人机走

由于是人机走,所以需要让人机可以自动产生落子的数字,可以通过rand函数得到随机数字,然后用随机数字模棋盘的长宽,即可以得到一个人合法的落子位置,同时也需要判断落子的位置是否有子

1009264ec4f4401ea4138e40fc94362a.png

 等玩家或者电脑每走一步后,就需要判断是否胜利,其中结果有,玩家胜,电脑胜,或者平局

其中判断过程可能有的结果是

玩家胜

电脑胜

平局(棋盘已经满了)

继续执行(继续执行是棋盘上还有位置)

c9f1bb7df9ca438b83275d020b63b252.png

 

所以要判断棋盘是否满还需要一个判断棋盘是否满的函数,就是上面这个

0b92612352b74101aed27be9159ac479.png

 等玩家或者电脑胜利后或者是平局后,即可进去菜单选择继续游戏还是退出游戏

下面是源码

!!!!!!!!!!!!!!!!!!!!

game.h

#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<time.h>

#define ROW 3
#define COL 3


//初始化
void Init_Board(char board[ROW][COL], int  row,int col);

//棋盘打印
void print_Board(char board[ROW][COL], int row, int col);

//玩家走
void player_Move(char board[ROW][COL], int row, int col);

//电脑走
void computer_Move(char board[ROW][COL], int row, int col);

char is_win(char board[ROW][COL], int row, int col);

~~~~~~~~~~~~~~~~~~~~

#define _CRT_SECURE_NO_WARNINGS 1

 

 

#include"game.h"

//初始化

void Init_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++)

  {

   board[i][j] = ' ';

  }

 }

}

 

//棋盘打印

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

  if (i < row - 1)

  {

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

   {

    printf("---");

    if (j < col - 1)

     printf("|");

   }

  }

  printf("\n");

 

 }

}

 

//电脑走

void computer_Move(char board[ROW][COL], int row, int col)

{

 printf("电脑下棋\n");

 

 while (1)

 {

  int i = rand() % row;

  int j = rand() % row;

 

  if (board[i - 1][j - 1] == ' ')

  {

   board[i - 1][j - 1] = '#';

   break;

  }

 

 }

}

 

//玩家走

void player_Move(char board[ROW][COL], int row, int col)

{

 printf("玩家走\n");

 

 while (1)

 {

  int i = 0;

  int j = 0;

  printf("请输入要下棋的坐标\n");

  scanf("%d %d", &i, &j);

  if (i >= 0 && i <= row && j >= 0 && j <= col)

  {

   if (board[i - 1][j - 1] == ' ')

   {

    board[i - 1][j - 1] = '*';

    break;

   }

   else

   {

    printf("坐标被占用,请重新输入\n");

   }

  }

  else

  {

   printf("坐标非法\n");

  }

  

 }

}

 

 

int is_Fill(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++)

  {

   if (board[i][j] == ' ')

   {

    return 0;

   }

  }

  return 1;

 }

}

 

//判断是否胜利

char is_win(char board[ROW][COL], int row, int col)

{

 int i = 0;

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

 {

  if (board[i][0] == board[i][1] &&board[i][0] == board[i][2] && board[i][0] != ' ')

  {

   return board[i][0];

  }

  

 }

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

 {

  if (board[0][i] == board[1][i] && board[0][i] == board[2][i] && board[0][i] != ' ')

  {

   return board[0][i];

  }

 }

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

 {

  if (board[0][0] == board[1][1] && board[0][0] == board[2][2] &&board[1][1]!=' ')

}

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

 {

  if (board[0][0] == board[1][1] && board[0][0] == board[2][2] &&board[1][1]!=' ')

  {

   return board[0][0];

  }

 }

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

 {

  if (board[0][2] == board[1][1] && board[0][2] == board[2][0] && board[1][1] != ' ')

  {

   return board[1][1];

  }

 }

 

 //判断是否满了,满了返回Q没有满返回C

 if (is_Fill(board, row, col)==1)

 {

  return 'Q';

 }

 

 //返回C游戏继续

 return 'C';

}

~~~~~~~~~~~~~~~~~~~~

#define _CRT_SECURE_NO_WARNINGS 1

 

#include"game.h"

 

void menu()

{

 printf("********************************\n");

 printf("********* 1.play **********\n");

 printf("********************************\n");

 printf("********* 0.exit **********\n");

 printf("********************************\n");

}

 

void game()

{

 char ret = 0;

 char board[ROW][COL];

 //初始化数组

 Init_Board(board,ROW,COL);

 //棋盘打印

 print_Board(board, ROW, COL);

 //玩家走

 while (1)

 {

  player_Move(board, ROW, COL);

  print_Board(board, ROW, COL);

  //判断是否胜利

  ret = is_win(board, ROW, COL);

  if (ret != 'C')

  {

   break;

  }

  computer_Move(board, ROW, COL);

  print_Board(board, ROW, COL);

  //判断是否胜利

  ret = is_win(board, ROW, COL);

  if (ret != 'C')

  {

   break;

  }

 }

 if (ret == '*')

 {

  printf("玩家赢\n");

 }

 else if (ret == '#')

 {

  printf("电脑赢\n");

 }

 else if(ret=='Q')

 {

  printf("平局\n");

 }

 

 

 }

 

void test()

{

 srand((unsigned int)time(NULL));

 int input = 0;

 

 do

 {

  menu();

  printf("请选择:>\n");

  scanf("%d", &input);

  switch (input)

  {

  case 1:

   printf("玩游戏\n");

   game();

   break;

  case 0:

   printf("退出游戏\n");

   break;

  default:

   printf("选址错误,请重新输入:>\n");

   break;

  }

 } while (input);

 

}

 

int main()

{

 test();

 return 0;

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Naxx Crazy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值