三子棋进阶版(源代码)

简介: 三子棋进阶版(源代码)

我们今天要分享的题目是三子棋,相信大家对于三子棋并不陌生


我们在设计三子棋的时候,脑袋一定不要混,不要害怕


做任何题目脑袋里要慢慢形成框架


比如本题:三子棋


游戏开始要有游戏界面,进入游戏界面时候,要选择开始游戏(1),退出游戏(0)


当我们选择开始游戏的时候要有游戏内的棋盘,所以要先打印一个棋盘


我们脑海中想到的是棋盘,这里拿三子棋举例


3*3的网格结构所以需要的符号有---,这个用来挡住空格 的下部分,|这个用来挡住空格的两侧。


当我们设计好棋盘之后,肯定是填棋盘,放棋子


我们放完电脑放


在每次放完之后需要判断输赢,平局和继续比赛。


判断输赢无非就是,行是三个,列是三个,两个对角线是三个


平局就是我们在判断输赢之后并没有结论


这时候如果棋盘没有空格就是满了,就是平局


若还有则游戏继续。


我们在分析完题目之后,话不多说直接上代码

我们这个代码可以实现N子棋,并不局限于三子棋,具体改变可以改变宏定义中的大小。

#include <stdio.h>   //输入输出函数头文件
#include <stdlib.h>  //rand头文件
#include <time.h>    //time头文件
#define Line 5   //宏定义line为3
#define Row 5    //宏定义row为3
//初始化棋盘
void Board_1(char ch[Line][Row],int line,int row)
{
    int i = 0;
    int j = 0;
    for(i=0;i<line;i++)
    {
        for(j=0;j<row;j++)
        {
            ch[i][j] = ' ';   //给每一个数组中的元素赋值个空格
        }
    }
}
//打印棋盘
void Board_2(char ch[Line][Row],int line,int row)
{
    int i = 0;
    int j = 0;  
    for(i=0;i<line;i++)
    {
        for(j=0;j<row;j++)
        {
            if(j<row-1)
            {
                printf(" %c |",ch[i][j]);
            }
            else
            printf(" %c ",ch[i][j]);
        }
        printf("\n");
        if(i<line-1)
        {
            for(j=0;j<row;j++)
            {
                if(j<row-1)
                {
                    printf("---|");
                }
                else
                printf("---");
            }
            printf("\n");  
        }
    }
}
//玩家下棋
void People(char ch[Line][Row],int line,int row)
{
    int i = 0;
    int j = 0;
    while(1)
    {
        printf("玩家下棋:>\n");
        scanf("%d %d",&i,&j);
        if((i>=1&&i<=line)&&(j>=1&&j<=row))
        {
            if(ch[i-1][j-1]!=' ')
            {
                printf("输入的坐标被占用,请重新输入:\n");
                continue;
            }
            else
            {
                ch[i-1][j-1] = '*';
                Board_2(ch,Line,Row);
                break;
            }
        }      
        else
        {
            printf("输入坐标错误,请重新输入:\n");
            continue;
        }
    }
}
//电脑下棋
void Computer(char ch[Line][Row],int line,int row)
{
    printf("电脑下棋:> \n");
    int x = 0;
    int y = 0;
    while(1)
    {
        x = rand()%line;   //随机数生成
        y = rand()%row;
        if(ch[x][y]== ' ')
        {
            ch[x][y] = 'a';
            Board_2(ch,Line,Row);
            break;
        }
    }
}
//判断是否下满,下满了就平局
int Is_full(char ch[Line][Row],int line,int row)
{
    int i = 0;
    int j = 0;
    for(i=0;i<line;i++)
    {
        for(j=0;j<row;j++)
        {
            if(ch[i][j]==' ')
            {
                return 1;
            }
        }
    }
    return 0;
}
//判断输赢
char Win_or(char ch[Line][Row],int line,int row)
{
    int i = 0;
    int j = 0;
    int flag3 = 0;
    int flag4 = 0;
    int flag5 = 0;
    for(i=0;i<line;i++) //行
    {
        int flag1 = 0;
        for(j=0;j<row-1;j++)
        {
            if(ch[i][j]!=ch[i][j+1])
            {
                flag1 = 1;
                break;
            }
        }
        if(flag1==0)
        {
            if(ch[i][0]==' ')
            {
                continue;
            }
            else
            return ch[i][0];
        }
    }
    for(j=0;j<row;j++)//列
    {
        int flag2 = 0;
        for(i=0;i<line-1;i++)
        {
            if(ch[i][j]!=ch[i+1][j])
            {
                flag2 = 1;
                break;
            }
        }
        if(flag2==0)
        {
            if(ch[0][j]==' ')
            {
                continue;
            }
            else
            return ch[0][j];
        }
    }
    for(i=0,j=0,flag3=0;i<line-1;i++,j++)//对角线左上右下
    {
        if(ch[i][j]!=ch[i+1][j+1])
        {
            flag3 = 1;
            break;
        }
    }
    if(flag3==0)
    return ch[0][0];
    for(i=line-1,j=row-1,flag4=0;i>0;i--,j--)//对角线左下右上
    {
        if(ch[i][j]!=ch[i-1][j-1])
        {
            flag4 = 1;
            break;
        }
    }
    if(flag4==0)
    return ch[0][0];
    int full = Is_full(ch,Line,Row);
    if(full==1)
    {
        return 'C';
    }
    return 'Q';
}
void Game ()
{
    char ret = 0;
    char ch[Line][Row] = {0};
    Board_1(ch,Line,Row);//初始化棋盘
    Board_2(ch,Line,Row);//打印棋盘
    while(1)
    {
        People(ch,Line,Row);//玩家下棋
        ret = Win_or(ch,Line,Row);//比较比赛战况
        if(ret != 'C')
        break;
        Computer(ch,Line,Row);//电脑下棋
        ret = Win_or(ch,Line,Row);
        if(ret != 'C')
        break;
    }
    if(ret == '*')
    printf("恭喜你赢得比赛 (*^o^*)\n");
    if(ret == 'a')
    printf("你输了 ╮( ̄▽ ̄"")╭\n");
    if(ret == 'Q')
    printf("平局,不分伯仲\n");
}
//菜单
void Menu()
{
    int a = 0;
    do
    {
        printf("*********************\n");
        printf("********1.play*******\n");
        printf("********0.exit*******\n");
        printf("*********************\n");
        printf("1-开始游戏  0-退出游戏 \n");
        scanf("%d",&a);
        if(a==1)
        {
            printf("开始比赛!!!\n");
            Game();
        }
        else if(a==0)
        {
            printf("退出游戏成功!!!\n");
            break;
        }
        else
        {
            printf("输入错误,请重新输入:> ");
            continue;
        }
    } while (a);
}
int main ()
{
    srand((unsigned int)time(NULL));//写rand之前要写这个
    Menu();
    return 0;
}
相关文章
|
6月前
|
开发工具 Android开发 开发者
在Android设备上运行Flutter应用程序时,如果遇到设备未授权的问题该如何解决?
在Android设备上运行Flutter应用程序时,如果遇到设备未授权的问题该如何解决?
333 61
|
消息中间件 弹性计算 前端开发
RabbitMQ入门 -- 阿里云服务器安装RabbitMQ
什么是RabbitMQ,浅谈RabbitMQ!
2252 1
RabbitMQ入门 -- 阿里云服务器安装RabbitMQ
|
8月前
|
SQL 关系型数据库 MySQL
云服务器常用端口作用
了解云服务器常用端口的作用有助于高效管理资源、快速定位问题及更好地使用云服务。常见端口包括:21(FTP,文件传输)、22(SSH,远程连接Linux)、25(SMTP,发送邮件)、80(HTTP,网页服务)、110/143(POP3/IMAP,接收邮件)、443(HTTPS,加密网页)、1433(SQL Server)、3306(MySQL)、3389(RDP,远程访问Windows桌面)和8080(代理服务)。
386 2
|
机器学习/深度学习 分布式计算 算法
机器学习PAI常见问题之下载了很多版本依赖包导致超时如何解决
PAI(平台为智能,Platform for Artificial Intelligence)是阿里云提供的一个全面的人工智能开发平台,旨在为开发者提供机器学习、深度学习等人工智能技术的模型训练、优化和部署服务。以下是PAI平台使用中的一些常见问题及其答案汇总,帮助用户解决在使用过程中遇到的问题。
|
7月前
|
消息中间件 Java Kafka
SpringBoot使用Kafka生产者、消费者
SpringBoot使用Kafka生产者、消费者
268 10
|
11月前
|
前端开发 Java UED
SpringMVC全局异常处理+拦截器使用+参数校验
通过使用 SpringMVC 的全局异常处理、拦截器和参数校验,可以有效提升 Web 应用程序的安全性、稳定性和用户体验。这些技术的合理应用,不仅可以保证代码的健壮性,还能提高代码的可维护性,为开发高质量的 Web 应用程序提供了坚实的基础。
263 6
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的旅游推荐系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的旅游推荐系统的详细设计和实现(源码+lw+部署文档+讲解等)
185 1
|
机器学习/深度学习 数据采集 数据挖掘
深入Scikit-learn:掌握Python最强大的机器学习库
【7月更文第18天】在当今数据驱动的世界中,机器学习已成为解锁数据潜力的关键。Python凭借其简洁的语法和丰富的库生态,成为数据科学家和机器学习工程师的首选语言。而在Python的众多机器学习库中,Scikit-learn以其全面、高效、易用的特点,被誉为机器学习领域的“瑞士军刀”。本文旨在深入探讨Scikit-learn的核心概念、实用功能,并通过实战代码示例,带你领略其强大之处。
403 12
|
算法 IDE 开发工具
通义灵码插件的优化建议
通义灵码是基于阿里云通义大模型的编码辅助工具,旨在提升开发者效率。为更好地满足开发需求,提出以下优化建议:1)提升生成速度,优化算法,引入分批处理;2)增强跨文件感知能力,理解代码上下文;3)完善云服务支持,深化与阿里云服务集成;4)丰富功能体验,增加编程语言支持;5)提升稳定性和兼容性,确保多环境运行;6)优化用户界面和交互,提供自定义选项;7)增加用户反馈渠道和社区支持,建立开发者交流平台。通过这些改进,通义灵码将为开发者带来更高效智能的编码体验。【6月更文挑战第1天】
407 2
|
Android开发
Android自带的DrawerLayout和ActionBarDrawerToggle实现侧滑效果
Android自带的DrawerLayout和ActionBarDrawerToggle实现侧滑效果