C语言实现三子棋小游戏

三子棋,和五子棋的原理是一样的,当玩家或者是电脑的某一方先将各自的三个棋子下成一条线时谁就赢,游戏就会结束。

游戏会有三种结果:电脑赢、玩家赢、平局。在代码中也需要这三种情况的判定。

要写程序,就要清楚代码需要几个模块,可以分为以下几个:

  1. 棋盘初始化
  2. 电脑、玩家分别走棋
  3. 输赢的判定
先对头文件定义:

头文件名 sanziqi.h

#ifndef __sanziqi_h__
#define __sanziqi_h__

#include <stdio.h>
#include <string.h>
#include <windows.h>

#define ROW 3 //三横行
#define COL 3 //三竖行

void InitBoard(char arr[ROW][COL], int row, int col);
//棋盘初始化
void DisplayBoard(char arr[ROW][COL], int row, int col);
//棋盘的展示
void ComputerMove(char arr[ROW][COL], int row, int col);
//电脑下棋
void PlayerMove(char arr[ROW][COL], int row, int col);
//玩家下棋
char IsWin(char arr[ROW][COL], int row, int col);
//判断输赢
char IsFull(char arr[ROW][COL], int row, int col);
//判断棋盘是否下满 下满则为平局
#endif
下来可以写以上各个需求的具体实现:

sanziqi.c


 #include"sanziqi.h"

void InitBoard(char arr[ROW][COL], int row, int col)
{
    int i = 0;
    int j = 0;
    for(i = 0;i<row;i++)
        for (j = 0; j < col; j++)
        {
            arr[i][j] = ' ';
        }
        //此处可以用memset函数实现,为展示清楚写成for
}

void DisplayBoard(char arr[ROW][COL], int row, int col)
{
    int i = 0;
    for (i = 0; i < row; ++i)
    {
        printf(" %c | %c | %c \n", arr[i][0], arr[i][1], arr[i][2]);
        if (i != row - 1)
        {
            printf("--- --- ---\n");
        }
    }
    printf("\n");
}
void ComputerMove(char arr[ROW][COL], int row, int col)
{
    printf("computer go\n");
    while(1)
    {
        int x = rand() % row;
        int y = rand() % col;
        if (arr[x][y] == ' ')
        {
            arr[x][y] = 'x';
            break;
        }
    }
}
//电脑下棋采用了随机的下法


void PlayerMove(char arr[ROW][COL], int row, int col)
{
    while(1)
    {
        int x, y;
        printf("player go\n");  
        scanf("%d%d", &x, &y);
        if ((1 <= x && x <= 3) && (1 <= y && y <= 3))
        {
            if (arr[x-1][y-1] == ' ')
            {
                arr[x-1][y-1] = 'O';
                break;
            }
            else
            {
                printf("this place have chess\n");
            }
        }
        else
        {
            printf("error place\n");
        }
    }
}


char IsWin(char arr[ROW][COL], int row, int col)
{
    int i;
    for (i = 0; i < row; i++)
    {
        if ((arr[i][0] == arr[i][1]) && (arr[i][1]==arr[i][2])&&arr[i][0]!=' ')
        return arr[i][1];
    }//行的判断
    for (i = 0; i < col; i++)
    {
        if ((arr[0][i] == arr[1][i]) && (arr[1][i] == arr[2][i]) && arr[2][i] != ' ')
            return arr[1][i];
    }//列的判断
    if ((arr[0][2] == arr[1][1]) && (arr[1][1] == arr[2][0]) && arr[1][1] != ' ')
    {
        return arr[1][1];
    }
    if ((arr[0][0] == arr[1][1]) && (arr[1][1] == arr[2][2]) && arr[2][2] != ' ')
    {
        return arr[2][2];
    }
    //这两个是斜行的判断
    else if (IsFull(arr, row, col) == 1)
    {
        return 'w';
    }
    //平局的返回值
    else
    {
        return ' ';
    }
}


char IsFull(char arr[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 (arr[i][j] == ' ')
                return 0;
        }
    }//如果每个位置都不为空,证明已经平局
    return 1;
}
在实现了各个模块的功能之后,就可以将它们整合在一起。
如下是main.c
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
#include"sanziqi.h"

int menu(void)
{
    int choose;
    printf("----------------------\n");
    printf("--------1.play--------\n");
    printf("--------0.exit--------\n");
    printf("----------------------\n");
    printf("choose:> ");
    scanf("%d", &choose);
    return choose;
}
//菜单选择

void game()
{
    char board[ROW][COL];
    char ret;
    srand((unsigned int)time(NULL));
    InitBoard(board, ROW, COL);
    DisplayBoard(board, ROW, COL);
        while(1)
        {       
            ComputerMove(board, ROW, COL);
            DisplayBoard(board, ROW, COL);
            ret = IsWin(board, ROW, COL);
            if (ret != ' ')
                break;

            PlayerMove(board, ROW, COL);
            DisplayBoard(board, ROW, COL);
            ret = IsWin(board, ROW, COL);   
            if (ret != ' ') 
                break;  
        } 
        if (ret == 'x')
        {
            printf("computer win\n");
        }
        else if (ret == 'O')
        {
            printf("gamer win\n");
        }
        else if (ret == 'w')
        {
            printf("平局\n");
        }
}

int main()
{
    int choose = 0;
    do
    {
        choose = menu();
        switch (choose)
        {
        case 1:
            printf("PLAY\n");
            game();
            break;
        case 0: 
            exit(0);
            break;
        default:
            printf("CHOOSE ERROR\n");
            break;
        }
    } while (1);
    return 0;
    system("pause");
}

游戏菜单:
这里写图片描述

游戏结果:

这里写图片描述
这里写图片描述
这里写图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值