三子棋

写这个游戏,我们要先把大概思路的框架搭好:
1.3X3的棋盘
2.玩家下:要选择的位置是否在这个棋盘内,选择的位置是否已有棋子
3.电脑下:通过随机数产生位置坐标,同样要判断选择的位置是否已有棋子
4.不管是玩家还是电脑下完都要判断是否赢了
5.判赢:某行某列或对角线上是否有三个一样的,或棋盘是否满了,满了为平局

//头文件 sanziqi.h
#ifndef __SANZIQI_H__  //防止头文件被重复引用后,当预处理是在主函数里头文件被多次替换而耗时,
                       //当使用这条语句后,可避免头文件的重复引用
#define __SANZIQI_H__
#define ROW 3
#define COL 3

//菜单
void menu();
//游戏
void game();
//谁赢
void Who_Win(char ret);
//棋盘初始化
void Init_Board(char Board[ROW][COL], int row, int col);
//显示棋盘
void Display(char Board[ROW][COL], int row, int col);
//玩家走棋
void Player(char Board[ROW][COL], int row, int col);
//电脑走棋
void Computer(char Board[ROW][COL], int row, int col);
//判断棋盘是否满
int Is_Full(char Board[ROW][COL], int row, int col);
//判断是否有输赢
char Is_Win(char Board[ROW][COL], int row, int col);
#endif
//sanziqi.c
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include"sanziqi.h"

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

void Who_Win(char ret)
{
    if (ret == 'O')
    {
        printf("玩家赢\n");
    }
    else
    {
        if (ret == 'X')
        {
            printf("电脑赢\n");
        }
        else
        {
            if (ret == 'q')
            {
                printf("平局\n");
            }
        }
    }
}

void game()
{
    char Board[ROW][COL] = { 0 };
    char ret = 0;
    Init_Board(Board, ROW, COL);
    Display(Board, ROW, COL);
    while (1)
    {
        Player(Board, ROW, COL);
        printf("玩家走棋\n");
        Display(Board, ROW, COL);
        ret = Is_Win(Board, ROW, COL);//判断是否有人赢,若有人赢则退出这个循环
        if (ret != 0)
        {
            Who_Win(ret);
            break;
        }
        Computer(Board, ROW, COL);
        printf("电脑走棋\n");
        Display(Board, ROW, COL);
        ret = Is_Win(Board, ROW, COL);//判断是否有人赢,若有人赢则退出这个循环
        if (ret != 0)
        {
            Who_Win(ret);
            break;
        }
    }
}
//初始化棋盘
void Init_Board(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 Display(char Board[ROW][COL], int row, int col)
{
    int i = 0;
    for (i = 0; i < 3; i++)
    {
        printf("| %c | %c | %c |\n", Board[i][0], Board[i][1], Board[i][2]);
        if (i!= 2)
        {
            printf("-------------\n");
        }
    }
}

//玩家下棋
void Player(char Board[ROW][COL], int row, int col)
{
    int i = 0;
    int j = 0;
    printf("请输入你要下的位置>\n");
    while (1)
    {
        scanf("%d %d", &i, &j);
        if (i<1 || i>3 || j<1 || j>3)
        {
            printf("输入错误,请重新输入坐标>\n");

        }
        else
        {
            //因为人习惯的坐标是从1开始的,所以输入后坐标要减1
            if (Board[i - 1][j - 1] == ' ')
            {
                Board[i - 1][j - 1] = 'O';
                break;
            }
            else
            {
                printf("此位置有棋子,请重新输入位置>\n");
            }
        }
    }
}

//电脑下棋
void Computer(char Board[ROW][COL], int row, int col)
{
    int i = 0;
    int j = 0;
    while (1)
    {
        //电脑的坐标是由随机数产生的
        //任何数对某个数去余,假如这个数是是n,则余数的范围是0--(n-1)
        i = rand() % 3;
        j = rand() % 3;
        if (Board[i][j] == ' ')
        {
            Board[i][j] = 'X';
            break;
        }
    }
}

//判断棋盘是否满了
int Is_Full(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 1;
            }
        }
    }
        return 0;
}

//判断是否赢有4种情况,还有一种是棋盘满了然后是平局
//1.三行中的某一行相等
//2.三列中的某一列相等
//3.右斜线相等
//4.左斜线相等
//注意:相等但不能等于空格
char Is_Win(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 < row; 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];
    }
    if (Is_Full(Board, ROW, COL) == 0)
    {
        return 'q';
    }
    return 0;
}
//main.c
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include"sanziqi.h"

int main()
{
    int input = 0;
    srand((unsigned int) time(NULL));//产生随机数的一个起始时间
    do
    {
        menu();
        scanf("%d", &input);
        switch (input)
        {
        case 1:game();
            break;
        case 0:
            break;
        default:printf("输入错误,请重新输入>\n");
            break;
        }
    } while (input);
        return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值