一个简单的三子棋游戏(c语言实现)

题目是:在一个3*3大小的矩阵中下棋一方有连续三个子便获胜

代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<time.h> 
  
         
char arr[3][3] = { 0 };            //直接定义外部变量所有的函数可以直接使用    因为考虑到棋盘大小是固定的
int size = 9;                   //棋盘大小固定  每下一个子都会使可以下子的容量-1
void chessboard()                                    //打印棋盘
{
 int i = 0, j = 0;
 printf("   |   |   \n");
 for (i = 0; i < 3; i++)
 {
  printf("_%c_|_%c_|_%c_\n", arr[i][0], arr[i][1], arr[i][2]);   //棋盘对应位置下棋
  if (i < 2)
   printf("   |   |   \n");
 }
}
void player()                                       //玩家下棋
{
 int m = 0, n = 0;
 printf("player(@):");              //输入的是对应的坐标    
 scanf_s("%d%d", &m, &n);          //玩家输入的坐标必须在范围内并且不能是被下过的地方
 if (m<1 || m>3 || n<1 || n>3 || arr[m - 1][n - 1] != ' ')
 {
  printf("this place can not play!\n");    //如果不符合要求则继续调用这个函数
  player();
 }
 else
 {
  arr[m - 1][n - 1] = '@';   //将棋子放入相应的内容 棋盘容量-1
  size--;
 }
}

void computer()                                     //电脑下棋
{
 printf("computer(#):\n");      
  int m = 0, n = 0;
  srand(time(NULL));          //电脑的坐标是随机产生的   以时间为种子
  m = rand() % 3;            //对3取余产生0-2的随机数赋给数组下标
  n = rand() % 3;
  while (arr[m][n] != ' ')     //如果产生的坐标不符合要求则循环产生      (效率比较低)
  {
   m = rand() % 3;
   n = rand() % 3;
  }
  arr[m][n] = '#';               //操作后容量-1
  size--;            
}
 
int winner()                                        //判断获胜者
{                            //虽然代码多但是效率高  本来想采用函数比较考虑到效率太低就放弃了
 if ((arr[0][0] == arr[0][1] && arr[0][1] == arr[0][2] && arr[0][2] == '@') ||
  (arr[1][0] == arr[1][1] && arr[1][1] == arr[1][2] && arr[1][2] == '@') ||
  (arr[2][0] == arr[2][1] && arr[2][1] == arr[2][2] && arr[2][2] == '@') ||
  (arr[0][0] == arr[1][0] && arr[1][0] == arr[2][0] && arr[2][0] == '@') ||
  (arr[0][1] == arr[1][1] && arr[1][1] == arr[2][1] && arr[2][1] == '@') ||
  (arr[0][2] == arr[1][2] && arr[1][2] == arr[2][2] && arr[2][2] == '@') ||
  (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[2][2] == '@') ||
  (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[2][0] == '@'))
  return 1;                        //玩家获胜
 else if ((arr[0][0] == arr[0][1] && arr[0][1] == arr[0][2] && arr[0][2] == '#') ||
  (arr[1][0] == arr[1][1] && arr[1][1] == arr[1][2] && arr[1][2] == '#') ||
  (arr[2][0] == arr[2][1] && arr[2][1] == arr[2][2] && arr[2][2] == '#') ||
  (arr[0][0] == arr[1][0] && arr[1][0] == arr[2][0] && arr[2][0] == '#') ||
  (arr[0][1] == arr[1][1] && arr[1][1] == arr[2][1] && arr[2][1] == '#') ||
  (arr[0][2] == arr[1][2] && arr[1][2] == arr[2][2] && arr[2][2] == '#') ||
  (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[2][2] == '#') ||
  (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[2][0] == '#'))
  return 0;                     //电脑获胜
 else if (size == 0)
  return -1;                     //平局
 else
  return 2;           //只是为了消除编译的警告并无实际意义
}

int main()
{
 int i = 0, j = 0;    //将数组初始化为空格
 for (i = 0; i < 3; i++)
 {
  for (j = 0; j < 3; j++)
  {
   arr[i][j] = ' ';
  }
 }
 while (1)        //循环对弈直到一方获胜或者平局
 {
  chessboard();          //循环每次开始都打印棋盘
  if (winner() == -1 || winner() == 0 || winner() == 1)   
  {
   break;
  }
  player();        //每下一个子后都打印棋盘 然后就判断又没有人获胜
  chessboard();
  if (winner() == -1 || winner() == 0 || winner() == 1)
  {
   break;
  }
  computer(); 
 }
 if (winner() == 1)
 {
  printf("player win!\n");
 }
 else if (winner() == 0)
 {
  printf("computer win!\n");
 }
 else
 {
  printf("no one win!\n");
 }
 system("pause");
 return 0;
}
 当然这个程序还有很多改进的地方,这个只是一个简单的雏形。

 

 

本文出自 “aiali” 博客,请务必保留此出处http://aliddd.blog.51cto.com/10780547/1709376

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值