三子棋C语言实现

下面是三子棋(井字棋)代码,(电脑落子采用的随机数生成).

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_ROW 3
#define MAX_COL 3
 int Menu(){
 printf("=========================\n");
 printf("1.开始游戏\n");
 printf("0.结束游戏\n");
 printf("=========================\n");
 printf("请输入您的选择:");
 int choose = 0;
 scanf("%d", &choose);
 return choose;
}
 char chess_board[MAX_ROW][MAX_COL];
 void InitChess(){
  for (int row = 0; row < MAX_ROW; row++){
   for (int col = 0; col < MAX_COL; col++){
    chess_board[row][col] = ' ';
   }
  }
 }
 void Print(){
  for (int row = 0; row < MAX_ROW; row++){
   printf("| %c | %c | %c |\n", chess_board[row][0], chess_board[row][1],chess_board[row][2]);
   if (row != MAX_ROW-1){
    printf("|---|---|---|\n");
   }
  }
 }
 void MovePlayer(){
  printf("玩家落子:\n");
  while (1){
   printf("请输入一组坐标(row, col)\n");
   int row = 0;
   int col = 0;
   scanf("%d %d", &row, &col);
   if (row >= MAX_ROW || row < 0 || col >= MAX_ROW || col < 0){
    printf("您的输入非法!\n");
    continue;
   }
   if (chess_board[row][col] != ' '){
    printf("您输入的坐标已有棋子,请重新输入!\n");
    continue;
   }
   chess_board[row][col] = 'x';
   break;
  }
 }
 void MoveCp(){
  while (1){
   int row = rand() % MAX_ROW;
   int col = rand() % MAX_COL;
   if (chess_board[row][col] != ' '){
    continue;//已有棋子,重新随机
   }
   chess_board[row][col] = 'o';
   break;
  }
 }
 //函数返回1为棋盘满了,返回0为没满
 int IsFull(){
  for (int row = 0; row <= MAX_ROW; row++){
   for (int col = 0; col <= MAX_COL; col++){
    if (chess_board[row][col] == ' '){
     return 0;
    }
   }
  }
  return 1;
 }
 //返回'x'为人胜利
 //返回'o'为电脑胜利
 //返回'q'为和局
 //返回' '继续游戏
 char CheckGameOver(){
  for (int row = 0; row < MAX_ROW; row++){
   if (chess_board[row][0] == chess_board[row][1] && chess_board[row][0] == chess_board[row][2]){
    return chess_board[row][0];
   }
  }
     for (int col = 0; col < MAX_COL; col++){
   if (chess_board[0][col] == chess_board[1][col] && chess_board[0][col] == chess_board[2][col]){
     return chess_board[0][col];
    }
   }
    if (chess_board[0][0] == chess_board[1][1] && chess_board[0][0] == chess_board[2][2]){
     return chess_board[0][0];
    }
    if (chess_board[0][2] == chess_board[1][1] && chess_board[0][2] == chess_board[2][0]){
     return chess_board[0][2];
    }
    if (IsFull()){
     return 'q';
    }
    return ' ';
   }
 void Game(){
  char winner=' ';
  InitChess();              //初始化棋盘
  while (1){
   system("cls");
   Print();                 //打印棋盘
   MovePlayer();            //玩家落子
   winner = CheckGameOver(); //判断胜负
   if (winner !=' '){
    break;                  //未分出胜负
   }
   MoveCp();                //电脑落子
   winner = CheckGameOver(); //判断胜负
   if (winner != ' '){
    break;                  // 未分出胜负
   }
  }
   if (winner == 'x'){
   system("cls");
    printf("您胜利了!\n");
    Print();
   }
   else if (winner == 'o'){
    printf("弱爆了,电脑都下不过!\n");
   }
   else if (winner == 'q'){
    printf("菜鸡,和电脑五五开!\n");
   }
   else{
    printf("出错了~~~\n");
   }
 }
 int main(){
  while (1){
   int choose = Menu();
   if (choose == 1){
    Game();
   }
   else if(choose==0){
    printf("goodbye!\n");
    break;
   }
   else{
    printf("您的输入有误!\n");
   }
  }
  system("pause");
  return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值