【初始C语言】/*使用C语言简单实现三子棋小游戏*/

作者简介:一名平凡的计算机小白,但持续喜欢探索新的知识领域!

本文内容:hello,大家好!今天给大家带来的就是使用C语言实现咋们小时候经常玩过的"三子棋"小游戏!

希望寄语:当你做一件事情感到越难受,你越是要去攻克它,因为成功的道路永远是崎岖的,你渴望山顶的风景,就要忍受爬山的艰辛!努力才是硬道理!

【初始C语言】/*使用C语言简单实现三子棋小游戏*/_第1张图片

 一:游戏描述

如下图:两人对局,当其中一人下的棋子形成一条横线、竖线或者是交叉线,即获得游戏胜利!

【初始C语言】/*使用C语言简单实现三子棋小游戏*/_第2张图片

 ️️二、游戏设计

首先我们需要设计一个二维数组来存放我们的这些棋子,可以看到上图中我们使用---和 | 来设计成我们的棋子落地位置,也就是给二维数组初始化一下:

代码实现:

void InitBoard(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++)
        {
            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)
        {
            for (j = 0; j < col; j++)
            {
                printf("---");
                if (j < col - 1)
                    printf("|");
            }
            printf("\n");
        }
    }
}

 好了,那么这个时候轮到我们的玩家下棋了,同理,我们设计一个函数来实现玩家下棋:

代码实现:

void player_move(char board[ROW][COL], int row, int col)
{
    int x = 0;
    int y = 0;
    printf("玩家下棋\n");
    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 computer_move(char board[ROW][COL], int row, int col)
{
    int x = 0;
    int y = 0;
    printf("电脑下棋:>\n");
    while (1)
    {
        x = rand() % row;//0~2
        y = rand() % col;//0~2
        if (board[x][y] == ' ')
        {
            board[x][y] = '#';
            break;
        }
    }
}

那么,有了这四个步骤之后,我们的三子棋小游戏的大纲就基本出来了,那么,是不是还缺点什么呢?没错,是个游戏总得判断输赢对叭,所以这里我们还需要一个函数实现判断是玩家赢了还是电脑赢了:

代码实现:

char is_win(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];
    }

在上述代码中我们只考虑到了输赢两种结果,但是当整个棋盘都下满的情况下,还是没有分出胜负,那么这个时候是不是就平局了?没错,这里我们还要考虑到平局的情况:

代码实现:

static int if_full(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++)
        {
            if (board[i][j] == ' ')
            {
                return 0;//没满
            }
        }
    }
    return 1;//满了
}

 这里我们需要判断棋盘是否满了,是返回1,不是返回0,然后输出是否形成平局:

   //判断平局
    if (if_full(board, row, col) == 1)
    {
        return 'Q';
    }

    //继续
    return 'C';

 OK,到这里我们的游戏部分就写完了,那么到我们的测试部分;测试部分我们首先定义一个菜单,用于提示用户输入输出:

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

 ✈️✈️三:完整代码演示

完成这个游戏我们需要在我们的VS2019里面,设置一个头文件和两个.c文件

【初始C语言】/*使用C语言简单实现三子棋小游戏*/_第3张图片

game.h完整代码

#pragma once


#include 
#include 
#include 

#define ROW 3
#define COL 3

//初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col);

//打印棋盘
void DisplayBoard(char board[ROW][COL], int row, int col);

//玩家下棋
void player_move(char board[ROW][COL], int row, int col);

//电脑下棋
void computer_move(char board[ROW][COL], int row, int col);

//判断输赢
char is_win(char board[ROW][COL], int row, int col);

 

game.c文件完整代码

#define _CRT_SECURE_NO_WARNINGS 1

#include "game.h"

void InitBoard(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++)
        {
            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)
        {
            for (j = 0; j < col; j++)
            {
                printf("---");
                if (j < col - 1)
                    printf("|");
            }
            printf("\n");
        }
    }
}

void player_move(char board[ROW][COL], int row, int col)
{
    int x = 0;
    int y = 0;
    printf("玩家下棋\n");
    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 computer_move(char board[ROW][COL], int row, int col)
{
    int x = 0;
    int y = 0;
    printf("电脑下棋:>\n");
    while (1)
    {
        x = rand() % row;//0~2
        y = rand() % col;//0~2
        if (board[x][y] == ' ')
        {
            board[x][y] = '#';
            break;
        }
    }
}

static int if_full(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++)
        {
            if (board[i][j] == ' ')
            {
                return 0;//没满
            }
        }
    }
    return 1;//满了
}

char is_win(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];
    }

    //判断平局
    if (if_full(board, row, col) == 1)
    {
        return 'Q';
    }

    //继续
    return 'C';
}

 

 test.c完整代码

#define _CRT_SECURE_NO_WARNINGS 1

//测试三子棋游戏的逻辑

#include "game.h"

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

void game()
{
	char ret = 0;
	//存放下棋的数据
	char board[ROW][COL] = { 0 };
	//初始化棋盘为全空格
	InitBoard(board, ROW, COL);
	//打印棋盘
	DisplayBoard(board, ROW, COL);
	while (1)
	{
		//玩家下棋
		player_move(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		//判断输赢
		ret = is_win(board, ROW, COL);
		if (ret != 'C')
		{
			break;
		}
		//电脑下棋
		computer_move(board, ROW, COL);//随机下棋
		DisplayBoard(board, ROW, COL);
		ret = is_win(board, ROW, COL);
		if (ret != 'C')
		{
			break;
		}
	}
	if (ret == '*')
	{
		printf("玩家赢了\n");
	}
	else if (ret == '#')
	{
		printf("电脑赢了\n");
	}
	else
	{
		printf("平局\n");
	}
	//DisplayBoard(board, ROW, COL);
}

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);
}

int main()
{
	test();
	return 0;
}

 ☘️代码解读:注意这里我们规定:

//玩家赢 ----->'*'
//电脑赢 - --->'#'
//平局   - ---->'Q'
//继续   - ---->'C'

⛵⛵四:运行结果

【初始C语言】/*使用C语言简单实现三子棋小游戏*/_第4张图片

 好了,文章最后也是附上了CSDN官方也是推出了毕业季投稿的活动,参加即可获得丰富的礼品,感兴趣的小伙伴快点击链接看看叭!

活动地址:毕业季·进击的技术erhttps://marketing.csdn.net/p/f4a818f6455f3a9a7a20c89f60ad35f7

你可能感兴趣的:(初识C语言,c语言,蓝桥杯,经验分享)