三子棋进阶版(源代码)

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

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


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


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


比如本题:三子棋


游戏开始要有游戏界面,进入游戏界面时候,要选择开始游戏(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月前
|
算法 C语言 C++
【C语言实战项目】三子棋游戏
【C语言实战项目】三子棋游戏
58 1
|
11月前
|
C语言
三子棋真是太神奇啦~~~C语言三子棋小游戏详解,具体到每一步操作的解释说明,不信你学不会!
三子棋真是太神奇啦~~~C语言三子棋小游戏详解,具体到每一步操作的解释说明,不信你学不会!
58 2
|
C语言
【C语言】小游戏--三子棋(下)
【C语言】小游戏--三子棋(下)
|
C语言
【C语言】小游戏--三子棋(上)
【C语言】小游戏--三子棋(上)
|
6月前
|
编译器 C语言
【C语言入门小游戏】三子棋
【C语言入门小游戏】三子棋
49 0
【C语言入门小游戏】三子棋
|
12月前
|
C语言
C语言经典小游戏-三子棋+扫雷
C语言经典小游戏-三子棋+扫雷
36 1
|
11月前
|
C语言
【三子棋】用C语言简单实现三子棋
【三子棋】用C语言简单实现三子棋
|
C语言
C语言---三子棋小游戏
本章介绍了,利用C原因中的二维数组,来实现三子棋小游戏,可以锻炼对二维数组的理解。夯实二维数组的基础。
C语言---三子棋小游戏
|
C语言
C语言小游戏--三子棋
使用C语言来实现儿时玩的小游戏--三子棋,简单易上手,快来试试吧!
95 1
|
程序员 C语言
c语言小项目(三子棋游戏实现)
首先一个项目是有对策和实现的。 对策就是我们的思路以及项目架构,实现就是具体的细节问题的解决。 完成这个三子棋游戏,我们首先来看思路,再看具体实现代码。 1.思路 1.1明确项目是由多文件组成的。 具体我创建了三个文件:一个头文件game.h,两个主文件main.c和game.c。 game.h里面包含了函数声明和库函数。main.c包含的内容是整个项目的主逻辑。game.c里面的内容是实现整个项目的函数。
86 0