首页 > 其他分享 >初学C 三子棋

初学C 三子棋

时间:2024-07-15 12:28:39浏览次数:6  
标签:int 三子 初学 board printf row COL ROW

game.h

#define _CRT_SECURE_NO_WARNINGS 
#pragma once
//头文件的包含
#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.继续--C
//4.平局--Q
char iswin(char board[ROW][COL],int row,int col);

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++)
//    {
//        printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
//        if (i < row - 1)
//        {
//            printf("---|---|---\n");
//        }
//    }
//}
//不够通用

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[ROW][COL], int row, int col)
{
    int x = 0;
    int y = 0;
    printf("玩家走:\n");
    while (true)
    {
        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 (true)
    {

        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][0] == 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;
}

标签:int,三子,初学,board,printf,row,COL,ROW
From: https://blog.csdn.net/2403_85903590/article/details/140435561

相关文章

  • 《昇思25天学习打卡营第3天|初学教程/张量 Tensor》
    文章目录张量Tensor内积(InnerProduct)外积(OuterProduct)线性映射(LinearMapping)笛卡儿积(CartesianProduct)创建张量张量的属性张量索引张量运算Tensor与NumPy转换稀疏张量CSRTensorCOOTensor张量Tensor张量(Tensor)是一个可用来表示在一些矢量、标量和其他张量之......
  • Android初学者书籍推荐
    书单1.《Android应用开发项目式教程》,机械工业出版社,2024年出版2.《第一行代码Android》第二版3.《第一行代码Android》第三版4.《疯狂Android讲义》第四版5.《Android移动应用基础教程(AndroidStudio第2版)》从学安卓到用安卓再到教安卓,我翻阅了不下二十本书,培养了多......
  • 初学者必看的 3 个 Python 小项目
    我们都知道,将知识点融入实际操作是提高编程学习效率的关键。尤其对于初学者来说,通过学习一些涉及核心编程概念的简单项目,不仅可以深化对编程语言的理解,还能快速提高解决问题的能力。下面将探讨三个基础的Python项目:计算器、猜数字游戏和待办事项列表,旨在巩固Python基础......
  • 【后端 · 初学】使用IDEA新建一个Springboot项目
    1【newproject】=》【Springboot】=》配置项目的名称和存放位置,type选择【maven】。选择jdk,最好大于等于17.2选择需要的依赖,本项目使用mybatis-plus,所以不需要添加mybatis的依赖。选择完成点击create即可。3修改pom.xml,下面是一份验证过没有问题的依赖配置。由于......
  • 关于电气CAD对于初学者的介绍和相关资料
    电气图的特点3.1电气图的作用阐述电的工作原理,描述产品的构成和功能,提供装接和使用信息的重要工具和手段。3.2简化图简图是电气图的主要表达方式,是用图形符号、带注释的围框或简化外形表示系统或设备中各组成部分之间相互关系及其连接关系的一种图。3.3元件及连接线元件......
  • 7.10日学习打卡----初学Redis(五)
    7.10日学习打卡目录:7.10日学习打卡一.redis功能流水线pipeline什么是流水线?pipeline实现使用pipeline发布与订阅Redis的发布与订阅发布订阅命令行实现慢查询Redis命令执行的整个过程如何进行配置实践建议二.redis的持久化机制RDB持久化机制触发机制-主要三种方式......
  • 积木报表-初学
    一、SQL数据源1、报表查询参数1)IN(DaoFormat.in)需要使用表达式${DaoFormat.in('${参数名称}')}来实现代码示例select*fromdemowheresexin(${DaoFormat.in('${sex}')})2)LIKE查询使用sql的自带函数concat代码示例select*fromdemowhere1=1<#ifname??&&na......
  • 初学java
    Java作为一种广泛使用的高级编程语言,它以其跨平台性、面向对象设计、健壮的标准库、自动内存管理和安全性等优点而受到青睐。这些特性使得Java适用于多种计算平台,并且能够构建大型、复杂的应用程序,同时保证程序的稳定性和安全性。其也是目前使用最多的编程语言。Java有Java.ES,Ja......
  • 初学python
    一python的历史python的起源Python的创始人是GuidovanRossum(吉多·范罗苏姆),他于1989年圣诞节期间开始编写Python,最初的目标是创建一门易读、简洁且可扩展的编程语言。GuidovanRossum受到ABC语言的启发,ABC是一门教育用语言,他希望创建一门对新手友好但也能满足专业开发者......
  • 掌握BERT:从初学者到高级的自然语言处理(NLP)全面指南
    掌握BERT:从初学者到高级的自然语言处理(NLP)全面指南原文:https://medium.com/@shaikhrayyan123/a-comprehensive-guide-to-understanding-bert-from-beginners-to-advanced-2379699e2b51本文是对该文的翻译,感谢RayyanShaikh在Medium论坛上的文章~引言:BERT(BidirectionalEnc......