[c语言编程]三子棋

1:开始前的准备思路

游戏的规则:游戏分为双方对战,双方依次在9宫格棋盘上摆放棋子,率先将自己的三个棋子走成一条线就视为胜利,而对方就算输了,但是三子棋在很多时候会出现和棋的局面。

思考的过程(主函数-----菜单的创建--------棋盘的创建-------操作系统的实现--------胜负的判断)接下来我会按照这个思路逐渐将这个代码写完。

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

2:主函数与菜单的创造

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

int main(void)
{
    int input = 0;                                                          //用数字来进行选择
    
    
    srand((unsigned)time(NULL));                            //这一步先不用看,后面加的
    
    
    do
    {
        menu();
        printf("请选择:>");
        scanf_s("%d", &input);
        switch (input)                                                            当主函数的基础代码写完之后,要进行
        {                                                                                菜单的编程,一般来说游戏需要满足可以
        case 1:                                                                      退出,开始游戏,打完一把游戏之后
            game();                                                                 选择是否继续游戏这几个条件。所以
            break;                                                                    先打印菜单
        case 0:出菜单
            printf("退出游戏\n");
            break;
        default:
            printf("选择错误,重新选择\n");
        }
    } while (input);

    return 0;
}
//主函数

完成之后编译是这个图

 

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

3:棋盘的创造

首先要打印出棋盘的格子,格子应该是这个样子

这里我们要用数组来实现

头文件的创造

//初始化棋盘---使之为空格
void initboard(char board[ROW] [COL], int row, int col);

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

初始化棋盘,使之为空格,这样之后数组里面的内容可以日后打印其他的字符

=========================================================================

我在这里先附上自己的三个文件(方便大家观看)

源1 就是指

 

源2就是指

=========================================================================

打印棋盘的实现

           放置到源文件中的准备中

      上面这两个图放置到源1文件中

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

4:操作系统的实现

顾名思义,玩家输入坐标点,棋盘上打印出符号*,之后电脑在棋盘上打印出符号#,两者打印的地方不能一样,代码如下

=========================================================================

 

上面的放置到头文件中

 

这两张在源文件中

void playermove(char board[ROW][COL], int row, int col)
{
    printf("玩家走:>\n");
    
    int x = 0;
    int y = 0;


    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[][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;
        }
    }
}
//电脑走的实现

这两段代码在源1文件中

========================================================================

5:胜负的判断

这里有四种情况

玩家赢了

电脑赢了

平局

游戏还在继续

所以每一种情况都要写,具体的代码如下

=========================================================================

 

 

 

 列和对角线的判断就是指看是不是有三个符号连在了一起,之后要判断是电脑赢了,还是玩家赢了,而平局的话也要输出平局了这一个结果,代码在下面

if (ret == '*')
    {
        printf("玩家赢了\n");                                                   //字符类型的符号反馈是谁赢了
        
    }
    else if (ret == '#')
    {
        printf("电脑赢了\n");
    }
    else
    {
        printf("平局\n");
    }
    displayboard(board, ROW, COL);
}

=========================================================================

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

6,文章到这里也就结束了,附上我的代码,谢谢大家的浏览。

头文件

=========================================================================

#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 boar[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);

=========================================================================

源文件

=========================================================================

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"

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);
}
//准备与工作

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

int main(void)
{
    int input = 0;
    
    
    srand((unsigned)time(NULL));
    
    
    do
    {
        menu();
        printf("请选择:>");
        scanf_s("%d", &input);
        switch (input)
        {
        case 1:
            game();
            break;
        case 0:
            printf("退出游戏\n");
            break;
        default:
            printf("选择错误,重新选择\n");
        }
    } while (input);

    return 0;
}
//主函数

=========================================================================

源1文件

=========================================================================

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


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

    //平局判断
    int ret = isfull(board, row, col);
    
    if (ret == 1)
    {
        return 'q';
    }
  
    return 'c';
}
//游戏胜利的判断

=========================================================================
 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值