C语言 三子棋游戏

我们来进行一个三子棋游戏的编写,三子棋游戏是建立在学习数组后的基础上来进行编写的,编写代码之前 我们要了解游戏的流程,和棋盘怎么创建.
棋盘: 用二维数组来表示,创建一个3*3的二维数组,每个元素是一个char类型.
’x’表示玩家1
’o’表示玩家2(玩家二我们用人工智障来代替)
空格表示空白.

游戏流程;
1.创建棋盘,并且初始化~把所有位置都设为空格.
2.打印棋盘.
3.玩家1进行落子.(玩家输入棋盘坐标(row,col)进行落子)
4.判定获胜.
5.玩家2(电脑)进行落子.
6.判定获胜.

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define Max_row 3
#define Max_col 3

void init(char chess3[Max_row][Max_col]){
     for(int row = 0 ; row < Max_row;row++){
         for(int col = 0 ; col < Max_col;col++){
            chess3[row][col] = ' ';
            }
      }
      //设置随机种子;
      srand((unsigned int) time(0));
 }

void print(char chess3[Max_row][Max_col]) {
    printf("+---+---+---+\n");
    for (int row = 0; row < Max_row; row++) {
        printf("|");
        for (int col = 0; col < Max_col; col++) {
            printf(" %c |", chess3[row][col]);
        }
        printf("\n+---+---+---+\n");
    }
}
 
void playerMove(char chess3[Max_row][Max_col]){ 
  printf("please play chess...\n");
   while(1){
     printf("please input coordinate(row col):");
     int row = 0;
     int col = 0;
     scanf("%d %d", &row, &col);
     //进行合法性校验.
     if(row < 0 || row >= Max_row || col < 0 || col >= Max_col){
     printf("coordinate wrong! please input again!\n");
        continue;
     }
     //若用户输入位置已有子
     if(chess3[row][col] !=' '){
        printf("pleas enter another coordinate!\n");
        continue;
     }
     //进行落子
     chess3[row][col] = 'x';
     break;
 }  
}

void computerMove(char chess3[Max_row][Max_col]){
   while(1){
     int row = rand() % Max_row;
     int col = rand() % Max_col;
     if(chess3[row][col] !=' '){
        continue;
      }
   chess3[row][col] = 'o';
   break;
   }
}   

//返回1表示满了 0表示没满
int isFull(char chess3[Max_row][Max_col]){
    //遍历棋盘看看有没有空格.
    for(int row = 0 ; row < Max_row;row++){
       for(int col= 0;row < Max_col;col++){
           if(chess3[row][col] == ' '){
               return 0;
               }
       }
    }
    return 1;
}
//此处约定;
//如果返回 x 表示玩家获胜
//如果返回 o 表示电脑获胜
//如果返回 ' ' 表示胜负未分,还要继续下棋
//如果返回q 表示和棋
char isGameOver(char chess3[Max_row][Max_col]){
     //扫描所有行列及对角线
     for(int row = 0; row < Max_row;row++){
        if(chess3[row][0] != ' ' 
        && chess3[row][0] == chess3[row][1] 
        && chess3[row][0] == chess3[row][2]){
        return chess3[row][0];
        }
     }
     for(int col = 0; col < Max_col;col++){
        if(chess3[0][col] != ' ' 
        && chess3[0][col] == chess3[1][col] 
        && chess3[0][col] == chess3[2][col]){
        return chess3[0][col];
        }
     }
     if(chess3[0][0] != ' ' 
     && chess3[0][0] == chess3[1][1] 
     && chess3[0][0] == chess3[2][2]){
        return chess3[0][0];
      }
      if(chess3[0][2] != ' ' 
      && chess3[0][2] == chess3[1][1] 
      && chess3[0][2] == chess3[2][0]){
        return chess3[0][2];
      }
      //判定是否和棋
      if(isFull(chess3)){
         return 'q';
      }
      //胜负未分
      return ' ';       
}   
            
int main(){
    char chess3[Max_row][Max_col];
    //1.对棋盘进行初始化.
    init(chess3);
    char winner = ' ';
    while(1){
       //打印棋盘之前 先清屏幕;
       system("cls");
       //2.打印棋盘.
       print(chess3);
       //3.玩家落子.
       playerMove(chess3);
       //4.判定胜负
       winner = isGameOver(chess3);
       if(winner != ' '){  
          break;
        }
       //5.电脑落子
       computerMove(chess3);
       //6.判定胜负
       char winner = isGameOver(chess3);
       if(winner != ' '){          
          break;
        } 
    }
    print(chess3);
    if(winner == 'x'){
       printf("you win!\n");
    }else if(winner == 'x'){
             printf("you should go to hospital!\n");
    }else{
         printf("you = rz!\n");
    }
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值