24/05/22(1122) 依然是一些数组收尾(没收完) 用数组编写三子棋和扫雷

&&      并且

||        或者

三子棋:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>

int Menu(){
    printf("=================\n");
    printf("欢迎来到三子棋游戏\n");
    printf("1.开始游戏\n");
    printf("0.退出游戏\n");
    printf("=================\n");
    printf("请输入您的选择");
    int choice = 0;
    scanf("%d", &choice);
    return choice;
}

#define MAX_ROW 3
#define MAX_COL 3

void Init(char chessBoard[MAX_ROW][MAX_COL]){
    srand((unsigned int)time(0));
    //for (int row = 0; row < MAX_ROW; row++){
    //    for (int col = 0; col < MAX_COL; col++){
    //        chessBoard[row][col] = ' ';
    //    }
    //}
    memset(chessBoard, ' ', MAX_ROW * MAX_ROW * sizeof(char));
}

void print(char chessBoard[MAX_ROW][MAX_COL]){
    // 把棋盘的内容打印出来
    for (int row = 0; row < MAX_ROW; row++){
        printf("+---+---+---+\n");
        printf("| %c | %c | %c |\n", chessBoard[row][0], chessBoard[row][1], chessBoard[row][2]);
    }
    printf("+---+---+---+\n");
}

void PlayerMove(char chessBoard[MAX_ROW][MAX_COL]){
    printf("轮到玩家落子!\n");
    while (1){
        printf("请输入您要落子位置的坐标(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("您的输入有误!\n");
            continue;
        }
        if (chessBoard[row][col] != ' '){
            //当前位置已经有子了,不能重复落子
            printf("该位置已经有子了!\n");
            continue;
        }
        chessBoard[row][col] = 'X';
        break;
    }
}
    
void ComputerMove(char chessBoard[MAX_ROW][MAX_COL]){
    printf("轮到电脑落子!\n");
    while (1){
        int row = rand() % MAX_ROW;
        int col = rand() % MAX_COL;
        if (chessBoard[row][col] != ' '){
            continue;
        }
        chessBoard[row][col] = 'O';
        break;
    }
}

//判定棋盘是否满了,满了返回 1 ,否则返回 0 .
int IsFull(char chessBoard[MAX_ROW][MAX_COL]){
    //查找棋盘上是否有空位
    for (int row = 0; row < MAX_ROW; row++){
        for (int col = 0; col < MAX_COL; col++){
            if (chessBoard[row][col] == ' '){
                //找到空位
                return 0;
            }
        }
    }
    //所有位置都找完了 返回1
    return 1;
}

//返回值表示游戏的状况
//1.返回 X 表示玩家获胜
//2.返回 O 表示电脑获胜
//3.返回' '表示未分胜负
//4.返回 Q 表示和棋
char Check(char chessBoard[MAX_ROW][MAX_COL]){
    //1.检查所有的行是否有连成三个子的情况
    for (int row = 0; row < MAX_ROW; row++){
        if (chessBoard[row][0] != ' '
            && chessBoard[row][0] == chessBoard[row][1]
            && chessBoard[row][0] == chessBoard[row][2]){
            return chessBoard[row][0];
        }
    }
    //2.检查所有的列
    for (int col = 0; col < MAX_COL; col++){
        if (chessBoard[0][col] != ' '
            && chessBoard[0][col] == chessBoard[1][col]
            && chessBoard[0][col] == chessBoard[2][col]){
            return chessBoard[0][col];
        }
    }

    //3.检查对角线
    if (chessBoard[0][0] != ' ' 
        && chessBoard[0][0] == chessBoard[1][1]
        && chessBoard[0][0] == chessBoard[2][2]){
        return chessBoard[0][0];
    }
    if (chessBoard[0][2] != ' '
        && chessBoard[0][2] == chessBoard[1][1]
        && chessBoard[0][2] == chessBoard[2][0]){
        return chessBoard[0][2];
    }
    //4.如果满了就是和棋
    if (IsFull(chessBoard)){
        return 'Q';
    }
    return ' ';
}

void Game(){
    //一局游戏的核心函数
    //1.创建并初始化一个棋盘(字符类型的二维数组)
    //尽量避免使用 magic number
    //最好给这个数字起一个合适的名字
    char chessBoard[MAX_ROW][MAX_ROW] = { 0 };
    Init(chessBoard);
    char winner = ' ';
    while (1){
        //2.先打印棋盘
        print(chessBoard);
        //3.提示玩家落子
        PlayerMove(chessBoard);
        //4.检查游戏是否结束
        winner = Check(chessBoard);
        if (winner =! ' '){
            break;
        }
        //5.电脑进行落子
        ComputerMove(chessBoard);
        //6.检查游戏是否结束
        winner = Check(chessBoard);
        if (winner != ' '){
            break;
        }
        //7.回到 2 继续执行
    }
    print(chessBoard);
    if (winner == 'X'){
        printf("恭喜你 赢了\n");
    }
    else if (winner == 'O'){
        printf("下不过电脑\n");
    }
    else{
        printf("和电脑五五开\n");
    }
}

int main(){
    while (1){
        int choice = Menu();
        if (choice == 1){
            Game();
        }
        else if (choice == 0){
            printf("goodbyd!\n");
            break;
        }
        else{
            printf("您的输入有误!\n");
        }
    }
    system("pause");
    return 0;
}

驼峰式命名:

小驼峰 showMap(变量起名)

大驼峰 ShowMap(函数/类起名)

UNIX like风格: show_map

匈牙利命名法(学校课本上的老古董):int iRet = 0;long lSum = 0;

alt + <- 回到上一个位置

扫雷框架(待填充)

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define MAX_ROW 9
#define MAX_COL 9
#define MINE_COUNT 10

int Meni(){
    printf("========================\n");
    printf("欢迎来到扫雷游戏\n");
    printf("1.开始游戏\n");
    printf("0.结束游戏\n");
    printf("========================\n");
    printf("请输入选项\n");
    int choice = 0;
    scanf("%d",&choice);
    return choice;
}

void Init(char showMap[MAX_ROW][MAX_COL],
    char mineMap[MAX_ROW][MAX_COL]){
    //1.先初始化 showMap,把所有位置都设成 * 
    memset(showMap, '*', MAX_ROW * MAX_COL);
    //2.再初始化 mineMap,先把里面所有位置都设成 0 
    //  然后随机找出十个位置设成地雷
    srand((unsigned int)time(0));
    memset(mineMap, '0', MAX_ROW * MAX_COL);
    int count = MINE_COUNT;
    while (count > 0){
        int row = rand() % MAX_ROW;
        int col = rand() % MAX_COL;
        if (mineMap[row][col] == '1'){
            //这里已经是雷!重新随机
            continue;
        }
    }
}

void Game(){
    //1.先创建两个地图,并初始化
    char showMap[MAX_ROW][MAX_COL] = { 0 };
    char mineMap[MAX_ROW][MAX_COL] = { 0 };
    Init(showMap, mineMap);
    while (1){
        //2.打印地图
        printf(showMap);
        //3.提示玩家输入要翻开位置的坐标,并校验
        int row = 0;
        int col = 0;
        Input(&row, &col);
        //4.检查当前位置是否是雷.如果是则游戏失败
        if (CheckMine(mineMap, row, col)){
            printf("踩雷了\n");
            break;
        }
        //5.检查当前位置是否是最后一个位置,如果是则游戏胜利
        if (CheckLastBlank(showMap)){
            printf("恭喜扫雷完成\n");

        }
        //6.更新翻开的当前位置,把 * 替换成一个数字
        Update(showMap, row, col);
    }
}

int main(){
    while (1){
        int choice = Menu();
        if (choice == 1){
            Game();
        }
        else if (choice == 0){
            break;
            printf("GoodBye!\n");
        }
        else{
            printf("输入有误\n");
        }
    }
    system("pause");
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值