c语言实现三子棋

亲爱的读者们,你们好鸭!(* ̄3 ̄)╭,我!又回来啦!和上次不同,这次我给你们带来了一个大宝贝儿(把手伸进口袋),瞧,是新出炉的三子棋教程呦( •̀ ω •́ )✧。那么话不多说,我们开始吧!

(前半部分为讲解分析,后半为源码)

1.创建菜单(毕竟比较简单,我就不多讲啦)

2.初始化棋盘

(1)头文件中

宏定义ROW与COL

申明initboard函数

(2)源文件中(主)

创建二维数组board

(3)源文件(函数实现)

解释:将二维数组初始为空格

3.打印棋盘

(1)头文件申明函数

 (2)源文件(主)

(3)打印函数实现

具体步骤为

第一行:空格 | 空格 | 空格 

第二行: --- | --- | ---

第三行:空格 | 空格 | 空格 

第四行: --- | --- | ---

第五行:空格 | 空格 | 空格 

 4.玩家下棋实现

(1)头文件申明

(2)源文件(主)

          玩家下棋后,并打印棋盘

 (3)源文件(函数实现)

        对应玩家输入的坐标,将二维数组board中的空格替换为星号

 5.电脑下棋实现(伪随机)

(1)头文件

 (2)源文件(主)

其中srand((unsigned int)time(NULL));是为了生成随机数

rand()一起使用

具体见   rand - C++ Reference (cplusplus.com)

 (3)源文件(函数实现)

与前面的“玩家下棋”同一原理

 6.判断输赢实现

那么,现在就到了最难的一步啦!加油啊(自我想象)

(1)头文件

(2)源文件(主)

 如果ret = ‘*’,则玩家赢

 如果ret = ‘#’,则电脑赢

 如果ret = ‘c',   则为’继续‘

 如果ret = ‘p',则为平局

(3)源文件(函数实现) 

主要分为三部分

a.同一行相同

b.同一列相同

c.对角线交叉相同

 其中有一个函数isfull判断是否平局(下满棋盘)

就这样,讲解完毕(终于)!!!!

那么下面就放码出来吧!!!

///game.c/


#pragma once
#define _CRT_SECURE_NO_WARNINGS
#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);

//输赢判断
char iswin(char board[ROW][COL], int row, int col)

/test.c/


#include "game.h"

void menu()
{
    printf("********************\n");
    printf("*****  三子棋  *****\n");
    printf("*****  1.play  *****\n");
    printf("*****  0.exit  *****\n");
    printf("********************\n");
}
int 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");
    }
}
int main()
{
    int input = 0;
    srand((unsigned int)time(NULL));
    while (1)
    {
        menu();
        scanf("%d", &input);

        if (input == 1)
        {
            game();
        }
        else
        {
            printf("游戏结束\n");
            break;
        }
    }
    return 0;
}



/game.c/


#include "game.h"

//初始化棋盘
void initboard(char board[ROW][COL], int row, int col)
{
    for (row = 0; row < 3; row++)
    {
        for (col = 0; col < 3; col++)
        {
            board[row][col] = ' ';
        }
    }
}

//打印棋盘
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)
        {
            for (j = 0; j < col; j++)
            {
                printf("---");
                if (j != col - 1)
                {
                    printf("|");
                }
            }
            printf("\n");
        }
    }
}

//玩家下棋
void playermove(char board[ROW][COL], int row, int col)
{
    printf("玩家下棋:>");
    int i = 0;
    int j = 0;
    while (1)
    {
        scanf("%d %d", &i, &j);
        if (board[i - 1][j - 1] == ' ')
        {
            board[i - 1][j - 1] = '*';
            break;
        }
        else
        {
            printf("坐标错误或被占用,请重新输入:>");
        }
    }
}

//电脑下棋
void computermove(char board[ROW][COL], int row, int col)
{
    printf("电脑下棋:\n");
    while (1)
    {
        int i = rand() % row;
        int j = rand() % col;
        if (board[i][j] == ' ')
        {
            board[i][j] = '#';
            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;
    int j = 0;
    //水平
    for (i = 0; i < row; i++)
    {
        if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
        {
            return board[i][0];
        }
    }
    //竖直
    for (j = 0; j < col; j++)
    {
        if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[0][j] != ' ')
        {
            return board[0][j];
        }
    }
    //对角线
    if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')
    {
        return board[0][0];
    }
    if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ')
    {
        return board[0][2];
    }
    int a = isfull(board,row,col);
    if (a == 1)
    {
        return 'p';
    }
    return 'c';
}

/over/

靓仔,你发现了彩蛋撒☆*: .。. o(≧▽≦)o .。.:*☆

sai  ko  ni  hai tei si da !!!!  jo  jo  !!!!


文章标签:

原文连接:https://blog.csdn.net/m0_69023444/article/details/124546176

相关推荐

【Linux系统编程:基础IO 壹】简单复习C语言文件接口 | 学习系统文件接口 | 认识文件描述符 | Linux下,一切皆文件 | 重定向原理

C语言自定义类型篇——自定义类型:结构体,枚举,联合

C语言——三种方式实现学生信息管理

【C】文件操作进阶知识

【c ++ primer 笔记】第8章 IO库

带你刷(牛客网)C语言百题(第二天)

TCP的粘包问题代码说明

【C语言】文件操作详解

【C语言】动态内存管理

C语言文件篇——文件操作

【C语言进阶】自定义类型——结构体

【深入理解C】动态内存管理

数学建模国赛 2020B-穿越沙漠 第一关 Lingo 和 C语言 动态规划求解

【C】柔性数组

全面解析C语言多媒体开源框架GStreamer

Python究竟属不属于嵌入式语言?

C/C++牛客网刷题练习之翻转链表篇

非递归算法——快速排序、归并排序

【C语言】静态&动态&文件通讯录(超万字)

C语言进阶——自定义类型:结构体 枚举 联合