C语言练手

利用C语言编写的井字棋游戏,界面是由字符串组成,,用到的知识很简单,确是一个很好的练习。
可以判断该位置是否有棋子,判断胜负以及利用随机数做了一个傻瓜AI。

//
//  main.c
//  123
//
//  Created by 刘林 on 2018/7/16.
//  Copyright © 2018年 刘林. All rights reserved.
//

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
int main()
{
    //定义三个自定义函数,欢迎、游戏和再来一局
    void welcome();
    void game();
    void again();
    welcome();
    return 0;
}

//游戏模块
void game(){
    //定义变量,玩家、获胜者、行、列、选择下棋位置
    int player = 0; //玩家 1 或者 2
    int winner = 0; // 赢家
    int row = 0; // 行
    int rank = 0; // 列
    int choice = 0; //选择
    int ai[9]={};//ai选择列表
    char chessboard[3][3]={
        {'1','2','3'},
        {'4','5','6'},
        {'7','8','9'}
    };    //创建数字棋盘
    printf("\n\n我们开始游戏吧!\n\n");
    //开始游戏,结束条件为已经下了超过9步或者有获胜者
    for (int i = 0;i < 9 && winner == 0 ;i++)
    {   player = (i % 2)+1;
        //打印初始化棋谱,将创建的数字棋盘中的二位数组带入
        printf("         #         #         \n");
        printf("         #         #          \n");
        printf("    %c    #    %c    #    %c    \n",chessboard[0][0],chessboard[0][1],chessboard[0][2]);
        printf("         #         #         \n");
        printf("         #         #         \n");
        printf("##############################\n");
        printf("         #         #         \n");
        printf("         #         #         \n");
        printf("    %c    #    %c    #    %c    \n",chessboard[1][0],chessboard[1][1],chessboard[1][2]);
        printf("         #         #         \n");
        printf("         #         #         \n");
        printf("##############################\n");
        printf("         #         #         \n");
        printf("         #         #         \n");
        printf("         #         #         \n");
        printf("    %c    #    %c    #    %c    \n",chessboard[2][0],chessboard[2][1],chessboard[2][2]);
        printf("         #         #         \n");
        printf("         #         #         \n");
        //游戏规则说明
        
        if (player == 1) {
            printf("现在是电脑AI开始下,使用的棋子是%c\n");
            printf("正在思考中...\n");
            do {
                srand((unsigned) time(NULL)); //用时间做种,每次产生随机数不一样
                choice = rand() % 10; //产生0-9的随机数
                rank = choice % 3;
                rank--;
                row = choice /3;
            } while ((chessboard[row][rank]=='X') || (chessboard[row][rank]=='O') || choice==0);
            
        }else{
            printf("现在是玩家%d开始下,你使用的棋子是%c\n",player,player == 1?'X':'O');
            printf("请根据上面的数字选择下棋位置:\n");
        there:scanf("%d",&choice);
        }
        
        //读入下棋位置
        rank = choice % 3;
        rank--;
        row = choice /3;
        
        //*****非法判断*****
        //1、判断输入的数字是否在9以内
        if(choice <1 || choice > 9)
        {
            printf("请输入1-9范围内的数字!\n");
            goto there;
        }
        //2、判断该位置是否已经有棋子
        if((chessboard[row][rank]=='X')||(chessboard[row][rank]=='O'))
        {
            printf("该位置已经有人下了,请选择其它位置!\n");
            goto there;
        }
        
        //*****落子并判断*****
        
        //相应的位置落下对应的棋子
        chessboard[row][rank] = player == 1?'X':'O';
        //判断对角线是否相同
        if ((chessboard[0][0] == chessboard[1][1] && chessboard[0][0] == chessboard[2][2])||(chessboard[0][2]==chessboard[1][1]&& chessboard[0][2] == chessboard[2][0]))
        {
            winner = player;
        }
        //判断每一行 或者每一列是否相同
        else
        {
            for (int line = 0; line <= 2; line++)
            {
                if ((chessboard[line][0]==chessboard[line][1] && chessboard[line][0]==chessboard[line][2])||(chessboard[0][line]==chessboard[1][line] && chessboard[0][line]==chessboard[2][line]))
                    winner = player;
                
            }
        }
        
    }
    
    //游戏结束  打出最后棋谱
    printf("\n\n");
    printf("         #         #         \n");
    printf("         #         #          \n");
    printf("    %c    #    %c    #    %c    \n",chessboard[0][0],chessboard[0][1],chessboard[0][2]);
    printf("         #         #         \n");
    printf("         #         #         \n");
    printf("##############################\n");
    printf("         #         #         \n");
    printf("         #         #         \n");
    printf("    %c    #    %c    #    %c    \n",chessboard[1][0],chessboard[1][1],chessboard[1][2]);
    printf("         #         #         \n");
    printf("         #         #         \n");
    printf("##############################\n");
    printf("         #         #         \n");
    printf("         #         #         \n");
    printf("         #         #         \n");
    printf("    %c    #    %c    #    %c    \n",chessboard[2][0],chessboard[2][1],chessboard[2][2]);
    printf("         #         #         \n");
    printf("         #         #         \n");
    if (winner == 0)
    {
        printf("\n\n厉害!厉害!平局!\n");
    }
    else
        printf("\n\n****恭喜玩家%d,获胜!****\n",winner);
        again();
}

//再来一局模块
void again(){
    printf("\n\n###########################\n");
    printf("#                         #\n");
    printf("#     结   束   游   戏     #\n");
    printf("#                         #\n");
    printf("###########################\n\n\n");
    char start='N';
    printf("请输入Y重新开始游戏!\n");
    do {
        start=getchar();
    } while (start!='Y');
    if (start=='Y') {
        game();
    }
}

//欢迎界面模块
void welcome(){
    char start;//开始
    //游戏规则
    printf("#########################\n");
    printf("#                       #\n");
    printf("#   井      字      棋   #\n");
    printf("#                       #\n");
    printf("#########################\n");
    printf("游戏规则:\n");
    printf("欢迎来到井字棋,该游戏有两个玩家,一个打圈(O),一个打叉(✗),轮流在\n3乘3的格上打自己的符号,最先以横、直、斜连成一线则为胜。\n\n");
    //进入游戏界面
    printf("请输入Y开始游戏!\n");
    do {
        start=getchar();
    } while (start!='Y');
    if (start=='Y') {
        game();
    }
}