代码编织梦想

8.数组的应用实例1:三子棋

创建一个头文件game.h,两个源文件game.c和test.c

头文件game.h用来存放函数的声明、使用库函数所需的头文件以及一些符号的定义;源文件用来存放函数的定义(具体实现);test.c用来测试以及存放主函数

-- -- -- -- -- -- -- -- -- --

头文件:game.h

#ifndef __GAME_H__
#define __GAME_H__
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:4996)

//头文件的包含
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

//符号的定义
#define ROW 3
#define COL 3

//函数的声明

//初始化棋盘的
void InitBoard(char board[ROW][COL], int row, int col);

//打印棋盘的函数
void DisplayBoard(char board[ROW][COL], int row, int col);

//玩家下棋
void PlayerMove(char board[ROW][COL], int row, int col);

//电脑下棋
void ComputerMove(char board[ROW][COL], int row, int col);

//
//1. 玩家赢了 - *
//2. 电脑赢了 - #
//3. 平局 - Q
//4. 游戏继续 - C

//判断游戏是否有输赢
char IsWin(char board[ROW][COL], int row, int col);
#endif // !__GAME_H__

-- -- -- -- -- -- -- -- -- --

源文件:game.c

#define _CRT_SECURE_NO_WARNINGS
#include "game.h"

void InitBoard(char board[ROW][COL], int row, int col)
{
    int i = 0;
    int j = 0;
    for (i = 0; i < row; i++)
    {
        for (j = 0; j < col; j++)
        {
            board[i][j] = ' ';
        }
    }
}

void DisplayBoard(char board[ROW][COL], int row, int col)
{
    int i = 0;
    for (i = 0; i < row; i++)
    {
        int j = 0;
        for (j = 0; j < col; j++)
        {
            printf(" %c ", board[i][j]);
            if(j<col-1)
                printf("|");
        }
        printf("\n");
        if (i < row - 1)
        {
            int j = 0;
            for (j = 0; j < col; j++)
            {
                printf("---");
                if(j<col-1)
                    printf("|");
            }
            printf("\n");
        }
    }
}


void PlayerMove(char board[][COL], int row, int col) 
{
    int x = 0;
    int y = 0;

    printf("玩家走:>\n");

    while (1)
    {
        printf("请输入下棋的坐标:>");
        scanf("%d %d", &x, &y);
        //判断坐标合法性
        if (x >= 1 && x <= row && y >= 1 && y <= col)
        {
            //下棋
            //坐标是否被占用
            if (board[x - 1][y - 1] == ' ')
            {
                board[x - 1][y - 1] = '*';
                break;
            }
            else
            {
                printf("坐标被占用, 请重新输入\n");
            }
        }
        else
        {
            printf("坐标非法, 请重新输入\n");
        }
    }
}

void ComputerMove(char board[ROW][COL], int row, int col)
{
    printf("电脑走:>\n");

    while (1)
    {
        int x = rand() % row;
        int y = rand() % col;

        //判断占用
        if (board[x][y] == ' ')
        {
            board[x][y] = '#';
            break;
        }
    }
}


int IsFull(char board[ROW][COL], int row, int col)
{
    int i = 0;
    int j = 0;
    for (i = 0; i < row; i++)
    {
        for (j = 0; j < col; j++)
        {
            if (board[i][j] == ' ')
            {
                return 0;//棋盘没满
            }
        }
    }

    return 1;//棋盘满了
}
char IsWin(char board[ROW][COL], int row, int col)
{
    int i = 0;
    //判断三行
    for (i = 0; i < row; i++)
    {
        if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
        {
            return  board[i][1];//
        }
    }
    
    //判断三列
    for (i = 0; i < col; i++)
    {
        if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
        {
            return board[1][i];
        }
    }

    //判断对角线
    if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
    {
        return board[1][1];
    }
    if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
    {
        return board[1][1];
    }

    //判断平局
    //如果棋盘满了返回1, 不满返回0
    int ret = IsFull(board, row, col);
    if (ret == 1)
    {
        return 'Q';
    }

    //继续
    return 'C';
}

-- -- -- -- -- -- -- -- -- --

源文件:test.c

#define _CRT_SECURE_NO_WARNINGS 
#include "game.h"

void menu()
{
    printf("******************************\n");
    printf("******    1. play        *****\n");
    printf("******    0. exit        *****\n");
    printf("******************************\n");
}

void game()
{
    //存储数据 - 二维数组
    char board[ROW][COL];
    //初始化棋盘 - 初始化空格
    InitBoard(board, ROW, COL);

    //打印一下棋盘 - 本质是打印数组的内容
    DisplayBoard(board, ROW, COL);
    char ret = 0;//接受游戏状态
    while (1)
    {
        //玩家下棋
        PlayerMove(board, ROW, COL);
        DisplayBoard(board, ROW, COL);
        //判断玩家是否赢得游戏
        ret = IsWin(board, ROW, COL);
        if (ret != 'C')
            break;
        //电脑下棋
        ComputerMove(board, ROW, COL);
        DisplayBoard(board, ROW, COL);
        //判断电脑是否赢得游戏
        ret = IsWin(board, ROW, COL);
        if (ret != 'C')
            break;
    }
    if (ret == '*')
    {
        printf("玩家赢了\n");
    }
    else if(ret == '#')
    {
        printf("电脑赢了\n");
    }
    else
    {
        printf("平局\n");
    }
    DisplayBoard(board, ROW, COL);
}

int main()
{
    int input = 0;
    srand((unsigned int)time(NULL));

    do
    {
        menu();
        printf("请选择:>");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            game();
            break;
        case 0:
            printf("退出游戏\n");
            break;
        default:
            printf("选择错误,重新选择\n");
            break;
        }
    } while (input);

    return 0;
}

-- -- -- -- -- -- -- -- -- --

整合

//#ifndef __GAME_H__
//#define __GAME_H__
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:4996)
//头文件的包含
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

//符号的定义
#define ROW 3
#define COL 3

//函数的声明
//
初始化棋盘的
//void InitBoard(char board[ROW][COL], int row, int col);
//
打印棋盘的函数
//void DisplayBoard(char board[ROW][COL], int row, int col);
//
玩家下棋
//void PlayerMove(char board[ROW][COL], int row, int col);
//
电脑下棋
//void ComputerMove(char board[ROW][COL], int row, int col);
//

1. 玩家赢了 - *
2. 电脑赢了 - #
3. 平局 - Q
4. 游戏继续 - C
//
判断游戏是否有输赢
//char IsWin(char board[ROW][COL], int row, int col);
//#endif // !__GAME_H__
//
//
其实函数定义在主函数前面不用声明也行

void InitBoard(char board[ROW][COL], int row, int col)
{
    int i = 0;
    int j = 0;
    for (i = 0; i < row; i++)
    {
        for (j = 0; j < col; j++)
        {
            board[i][j] = ' ';
        }
    }
}


void DisplayBoard(char board[ROW][COL], int row, int col)
{
    int i = 0;
    for (i = 0; i < row; i++)
    {
        int j = 0;
        for (j = 0; j < col; j++)
        {
            printf(" %c ", board[i][j]);
            if (j < col - 1)
                printf("|");
        }
        printf("\n");
        if (i < row - 1)
        {
            int j = 0;
            for (j = 0; j < col; j++)
            {
                printf("---");
                if (j < col - 1)
                    printf("|");
            }
            printf("\n");
        }
    }
}


void PlayerMove(char board[][COL], int row, int col)
{
    int x = 0;
    int y = 0;

    printf("玩家走:>\n");

    while (1)
    {
        printf("请输入下棋的坐标:>");
        scanf("%d %d", &x, &y);
        //判断坐标合法性
        if (x >= 1 && x <= row && y >= 1 && y <= col)
        {
            //下棋
            //坐标是否被占用
            if (board[x - 1][y - 1] == ' ')
            {
                board[x - 1][y - 1] = '*';
                break;
            }
            else
            {
                printf("坐标被占用, 请重新输入\n");
            }
        }
        else
        {
            printf("坐标非法, 请重新输入\n");
        }
    }
}

void ComputerMove(char board[ROW][COL], int row, int col)
{
    printf("电脑走:>\n");

    while (1)
    {
        int x = rand() % row;
        int y = rand() % col;

        //判断占用
        if (board[x][y] == ' ')
        {
            board[x][y] = '#';
            break;
        }
    }
}


int IsFull(char board[ROW][COL], int row, int col)
{
    int i = 0;
    int j = 0;
    for (i = 0; i < row; i++)
    {
        for (j = 0; j < col; j++)
        {
            if (board[i][j] == ' ')
            {
                return 0;//棋盘没满
            }
        }
    }

    return 1;//棋盘满了
}
char IsWin(char board[ROW][COL], int row, int col)
{
    int i = 0;
    //判断三行
    for (i = 0; i < row; i++)
    {
        if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
        {
            return  board[i][1];//
        }
    }

    //判断三列
    for (i = 0; i < col; i++)
    {
        if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
        {
            return board[1][i];
        }
    }

    //判断对角线
    if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
    {
        return board[1][1];
    }
    if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
    {
        return board[1][1];
    }

    //判断平局
    //如果棋盘满了返回1, 不满返回0
    int ret = IsFull(board, row, col);
    if (ret == 1)
    {
        return 'Q';
    }

    //继续
    return 'C';
}
#define _CRT_SECURE_NO_WARNINGS 1



void menu()
{
    printf("******************************\n");
    printf("******    1. play        *****\n");
    printf("******    0. exit        *****\n");
    printf("******************************\n");
}

void game()
{
    //存储数据 - 二维数组
    char board[ROW][COL];
    //初始化棋盘 - 初始化空格
    InitBoard(board, ROW, COL);

    //打印一下棋盘 - 本质是打印数组的内容
    DisplayBoard(board, ROW, COL);
    char ret = 0;//接受游戏状态
    while (1)
    {
        //玩家下棋
        PlayerMove(board, ROW, COL);
        DisplayBoard(board, ROW, COL);
        //判断玩家是否赢得游戏
        ret = IsWin(board, ROW, COL);
        if (ret != 'C')
            break;
        //电脑下棋
        ComputerMove(board, ROW, COL);
        DisplayBoard(board, ROW, COL);
        //判断电脑是否赢得游戏
        ret = IsWin(board, ROW, COL);
        if (ret != 'C')
            break;
    }
    if (ret == '*')
    {
        printf("玩家赢了\n");
    }
    else if (ret == '#')
    {
        printf("电脑赢了\n");
    }
    else
    {
        printf("平局\n");
    }
    DisplayBoard(board, ROW, COL);
}

int main()
{
    int input = 0;
    srand((unsigned int)time(NULL));

    do
    {
        menu();
        printf("请选择:>");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            game();
            break;
        case 0:
            printf("退出游戏\n");
            break;
        default:
            printf("选择错误,重新选择\n");
            break;
        }
    } while (input);

    return 0;
}

这个电脑其实是非常傻的,由于是使用rand来实现电脑下出随机坐标的,所以电脑并不会“乘胜追击”和“堵”,要让电脑下的棋变得更加“智能”还是有点难度的,感兴趣的朋友可以试试,看有没有什么思路

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

70236840620e6fd0ade1e1ba6aeb2506.png

22623985f50adcce48e0ab106e379555.png

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_73663803/article/details/129458064

4.数组与方法 —— 数组的引用传递_扬帆远航hao的博客-爱代码爱编程_传入数组的引用

学习目标 掌握数组的引用传递 可以使用方法接收或返回一个数组 了解Java对数组操作的支持 4.1传递及返回数组 之前的方法操作传递和返回的都是基本数据类型,但是方法中也可用来传递和返回数组。如果要向方法中传递一个数组,则方法的接收参数处必须是符合其类型的数组。而且数组属于引用数据类型,所以在把数组传递进方法之后,如果方法对数组本身做了任何修改,

五、TypeScript 数组-爱代码爱编程

TypeScript 数组 1. 数组概述2. 创建数组3. 数组长度和索引3.1 概述3.2 数组长度4. 取值和存值4.1 取值4.2 存值4.3 添加元素5. 遍历数组 现在我们来学习 TypeScript 数组,学完这一节,我们要知道,如何使用数组;如何创建数组;如何获取数组中的元素;如何遍历数组。 1. 数组概述 ​ 首先,什么是

java math.max 取数组最大值_Math.max得到数组中最大值-爱代码爱编程

Math.max(param1,param2) 因为参数不支持数组。 所以可以根据apply的特点来解决, var max = Math.max.apply(null,array),这样就可以轻易的得到一个数组中最大的一项 注:在调用apply的时候第一个参数给了一个null,这个是因为没有对象去调用这个方法,我们只需要用这个方法帮我们运算,得到

JS(数组批处理).数组中的值变成对象中属性-爱代码爱编程

有一个长度为5的学生数组["jack","rose","john","kitty","doggy"],有10000道题,为每个学生随机抽取5道,生成抽题结果并输出(题号可以重) 输出结果 {jack:[3,1,4,5,9],rose:[2,6,5,3,8]...} 思考:数组每个值要变成对象中每一个属性;需要遍历;10000道题是随机需要mathAPI