太阳不下山 发表于 2021-8-8 13:08:30

C语言基于循环语句的三子棋小游戏

数组的应用实例1:三子棋
以下是基于Visual Studio编程平台的三子棋游戏工程
test.c//**************************************************************
//****************************test.c****************************
//***************************测试文件****************************
//**************************************************************
#define _CRT_SECURE_NO_WARNINGS 1

#include "game.h"
#include <stdio.h>

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

void game()
{
        //创建一个数组,存放玩家和计算机走出的棋盘信息
        //数组内全是空格
        char board = { 0 };
        char ret = 0;

        //init board
        InitBoard(board, ROW, COL);
        //打印棋盘
        DisplayBoard(board,ROW,COL);
        //下棋
        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");
        }
}

void test()
{
        int input = 0;
        srand((unsigned int)time(NULL));

        do
        {
                menu();
                printf("请选择:>");
                scanf("%d", &input);
                switch (input)
                {
                case 1:
                        game();
                        break;
                case 0:
                        printf("退出游戏\n");
                        break;
                default:
                        printf("选择有误,请重新选择。\n");
                        break;
                }
        } while (input);//非0重新循环
}

int main()
{
        test();

        return 0;
}game.h//**************************************************************
//****************************game.h****************************
//**************************************************************
#define _CRT_SECURE_NO_WARNINGS 1
#define ROW 3
#define COL 3

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

//声明
void InitBoard(char board, int row, int col);
void DisplayBoard(char board, int row, int col);
void PlayerMove(char board, int row, int col);
void ComputerMove(char board, int row, int col);
int IsFull(char board, int row, int col);

//告诉我们四种游戏的状态
//玩家赢 - '*'
//电脑赢 - '#'
//平局   - 'Q'
//继续   - 'C'
char IsWin(char board, int row, int col);game.c
//**************************************************************
//****************************game.c****************************
//**************************************************************
#define _CRT_SECURE_NO_WARNINGS 1

#include "game.h"

void InitBoard(char board, int row, int col)
{
        int i = 0;
        int j = 0;
        for (i = 0; i < ROW; i++)
        {
                for (j = 0; j < COL; j++)
                {
                        board = ' ';
                }
        }
}

//void DisplayBoard(char board, int row, int col)
//{
//        int i = 0;
//        for (i = 0; i < row; i++)
//        {
//                //1. 打印一行的数据
//                printf(" %c | %c | %c \n",board,board,board);
//                //2.打印分割行
//                if(i<row-1)
//                        printf("---|---|---\n");
//        }
//}

void DisplayBoard(char board, int row, int col)
{
        int i = 0;
        for (i = 0; i < row; i++)
        {
                int j = 0;
                for (j = 0; j < col; j++)
                {
                        //1. 打印一行的数据
                        printf(" %c ", board);
                        if(j<col-1)
                                printf("|");
                }
                printf("\n");

                //2.打印分割行
                if (i < row - 1)
                {
                        for (j = 0; j < col; j++)
                        {
                                printf("---");
                                if(j<col-1)
                                        printf("|");
                        }
                        printf("\n");
                }
        }
}

void PlayerMove(char board, int row, int col)
{
        int x = 0;
        int y = 0;

        printf("玩家走:>\n");
        printf("请输入要下的坐标:>\n");
       
        while (1)
        {
                scanf("%d%d", &x, &y);
                //判断x,y坐标是否合法
                if (x >= 1 && x <= row && y >= 1 && y <= col)
                {
                        if (board == ' ')
                        {
                                board = '*';
                                break;
                        }
                        else
                        {
                                printf("该坐标被占用!\n");
                        }
                }
                else
                {
                        printf("坐标非法,请重新输入:>\n");
                }
        }
}

void ComputerMove(char board, int row, int col)
{
        int x = 0;
        int y = 0;

        printf("电脑走:>\n");
        while (1)
        {
                x = rand() % row;
                y = rand() % col;
                if (board == ' ')
                {
                        board = '#';
                        break;
                }
        }
}


int IsFull(char board, int row, int col)
{
        int i = 0;
        int j = 0;
        for (i = 0; i < row; i++)
        {
                for (j = 0; j < col; j++)
                {
                        if (board == ' ')
                        {
                                return 0;
                        }
                }
        }
        return 1;
}

char IsWin(char board, int row, int col)
{
        int i = 0;

        //判断横三行
        for (i = 0; i < row; i++)
        {
                if (board == board && board == board && board != ' ')
                {
                        return board;
                }
        }
        //判断竖三列
        for (i = 0; i < col; i++)
        {
                if (board == board && board == board && board != ' ')
                {
                        return board;
                }
        }
        //判断两条对角线
        if (board == board && board == board && board != ' ')
                return board;
        if (board == board && board == board && board != ' ')
                return board;
        //判断是否平局
        if (1 == IsFull(board, ROW, COL))
        {
                return 'Q';
        }
        return 'C';
}

复制

文档来源:51CTO技术博客https://blog.51cto.com/u_15308703/3309772
页: [1]
查看完整版本: C语言基于循环语句的三子棋小游戏