当前位置:主页 > c/c++教程 > C语言三子棋游戏

C语言实现三子棋小游戏的示例代码

发布:2023-03-06 20:00:01 59


给网友们整理相关的编程文章,网友訾乐湛根据主题投稿了本篇教程内容,涉及到C语言三子棋游戏、C语言三子棋、C语言、游戏、C语言三子棋游戏相关内容,已被630网友关注,内容中涉及的知识点可以在下方直接下载获取。

C语言三子棋游戏

一、三子棋

三子棋小游戏的实现主要依赖于循环语句、函数和数组。

主要思路:设计棋盘、初始化棋盘、玩家下棋、电脑下棋及判断输赢。

判断输赢条件:当任一方连续三个棋子成一条直线,即为获胜。

1.演示效果

2.完整代码

#include 
#include 
#include 
#define ROW 3//行
#define COL 3//列
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 Print_board(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_board(char board[ROW][COL], int row, int col)//玩家下棋
{
	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 Computer_board(char board[ROW][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 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 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][0] != ' ')//判断一行中是否相等
		{
			return board[i][0];
		}
	}
	for (i = 0; i < col; i++)
	{
		if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')//判断一列中是否相等
		{
			return board[0][i];
		}
	}
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')//判断对角线是否相等
	{
		return board[0][0];
	}
	if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[0][2] != ' ')//判断对角线是否相等
	{
		return board[1][1];
	}
	if (1 == Is_full(board, row, col))//Is_full的返回值等于1,说明棋盘已经满了,没有空格了
		return 'P';
	return 'C';
}
void menu()
{
	printf("*******************\n");
	printf("***  1.开始游戏  **\n");
	printf("***  0.结束游戏  **\n");
	printf("*******************\n");
}
void game()
{
	printf("****  游戏开始  ***\n");
	char ret = 0;
	char board[ROW][COL] = { 0 };
	Init_board(board, ROW, COL);
	Print_board(board, ROW, COL);
	while(1)
	{
		Player_board(board, ROW, COL);
		Print_board(board, ROW, COL);
		ret = Is_win(board, ROW, COL);
		if (ret != 'C')
			break;

		Computer_board(board, ROW, COL);
		Print_board(board, ROW, COL);
		ret = Is_win(board, ROW, COL);
		if (ret != 'C')
			break;
	}
	if (ret == '*')
		printf("玩家赢!\n");
	if (ret == '#')
		printf("电脑赢!\n");
	if (ret == 'P')
		printf("平局!\n");
}
int main()
{
	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);
}

二、代码解析

1.初始化棋盘

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] = ' ';
        }
    }
}

刚开始定义的数组中初始值为0,但是打印的时候会发生错误,所以要先将数组中的值改为空格,以确保在打印棋盘的时候能够得到想要的结果。

2.打印棋盘

void Print_board(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");
        }
    }
}

打印出来为:

3.玩家下棋

void Player_board(char board[ROW][COL], int row, int col)//玩家下棋
{
    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");
        }
    }
}

玩家下棋要判断输入的下标是否符合要求,是否为空格,当输入的坐标不在范围内时,输入坐标非法,重新输入。当输入的坐标不是空格,已被占用时也需要重新输入,这里注意玩家输入的坐标是从1开始的,并非从0。

4.电脑下棋

void Computer_board(char board[ROW][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;
        }
    }
}

电脑下棋时,需要用rand函数让其产生在0 ~ row-1和0 ~ col-1之间,并且每次程序开始时产生的数都不相同,所以rand函数要和srand函数配合使用。具体使用方法可参考猜数字小游戏中游戏主题函数的介绍。

5.判断输赢

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 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][0] != ' ')
        {
            return board[i][0];
        }
    }
    for (i = 0; i < row; i++)
    {
        if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
        {
            return board[0][i];
        }
    }
    if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')
    {
        return board[0][0];
    }
    if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[0][2] != ' ')
    {
        return board[1][1];
    }
    if (1 == Is_full(board, row, col))//Is_full的返回值等于1,说明棋盘已经满了,没有空格了
        return 'P';
    return 'C';
}

假设用P表示平局,用C表示游戏继续,用*表示玩家获胜,用#表示电脑获胜,我们需要判断行、列和对角线上是否有三个连续符号组成的直线,并且可以根据符号判断出是谁赢谁输。当没有三个连续的符号组成的直线,且没有空格时为平局。其中Is_full函数是用来判断数组中是否还有空格。

6.游戏主体函数

通过调用具体的实现函数,完成界面的布局。

void game()
{
	printf("****  游戏开始  ***\n");
	char ret = 0;
	char board[ROW][COL] = { 0 };
	Init_board(board, ROW, COL);
	Print_board(board, ROW, COL);
	while(1)
	{
		Player_board(board, ROW, COL);
		Print_board(board, ROW, COL);
		ret = Is_win(board, ROW, COL);
		if (ret != 'C')
			break;

		Computer_board(board, ROW, COL);
		Print_board(board, ROW, COL);
		ret = Is_win(board, ROW, COL);
		if (ret != 'C')
			break;
	}
	if (ret == '*')
		printf("玩家赢!\n");
	if (ret == '#')
		printf("电脑赢!\n");
	if (ret == 'P')
		printf("平局!\n");
}

7.菜单函数

void menu()
{
    printf("*******************\n");
    printf("***  1.开始游戏  **\n");
    printf("***  0.结束游戏  **\n");
    printf("*******************\n");
}

8.头文件及主函数

#include 
#include 
#include 
#define ROW 3//行
#define COL 3//列
int main()
{
	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);
}

到此这篇关于C语言实现三子棋小游戏的示例代码的文章就介绍到这了,更多相关C语言三子棋游戏内容请搜索码农之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持码农之家!


参考资料

相关文章

  • C语言多线程服务器的实现实例

    C语言多线程服务器的实现实例

    发布:2022-07-12

    给网友们整理关于C语言的教程,这篇文章主要介绍了C语言多线程服务器的实现实例,文章用实例讲解的很清楚,有对这方面不太懂的同学可以参考下


  • C语言驱动开发之内核通过PEB获取进程参数

    发布:2023-03-04

    PEB结构(Process Envirorment Block Structure)其中文名是进程环境块信息。本文将通过PEB实现获取进程参数,感兴趣的小伙伴可以了解一下


  • C语言数据在内存中的存储流程深入分析

    发布:2023-03-05

    使用编程语言进行编程时,需要用到各种变量来存储各种信息。变量保留的是它所存储的值的内存位置。这意味着,当您创建一个变量时,就会在内存中保留一些空间。您可能需要存储各种数据类型的信息,操作系统会根据变量的数据类型,来分配内存和决定在保留内存中存储什么


  • C语言汇编分析传递结构体指针比传递结构体变量高效的深层原因

    发布:2023-03-05

    本文章使用的工具是vs2010,本篇文章主要讲解结构体指针作为参数传递与结构体变量作为参数传递的对比,不谈值传递与址传递的概念


  • C语言中顺序栈和链栈的定义和使用详解

    发布:2023-03-06

    这篇文章主要为大家详细介绍了C语言中顺序栈和链栈的定义和使用,文中的示例代码讲解详细,对我们学习C语言有一定的帮助,感兴趣的小伙伴可以了解一下


  • C语言数据结构不挂科指南之线性表详解

    发布:2023-03-02

    线性表是由 n(n≥0)个数据元素组成的有穷序列,这篇文章主要来和大家来了C语言数据结构中的线性表,感兴趣的小伙伴可以跟随小编一起了解一下


  • C语言学习之指针的使用详解

    发布:2023-03-06

    想突破C语言的学习,对指针的掌握是非常重要的,本文为大家总结了C语言中指针的相关知识点,文中的示例代码讲解详细,感兴趣的小伙伴可以学习一下


  • 详解C语言内核中的链表与结构体

    发布:2023-03-03

    Windows内核中是无法使用vector容器等数据结构的,当我们需要保存一个结构体数组时,就需要使用内核中提供的专用链表结构。本文分享了几个内核中使用链表存储多个结构体的通用案例,希望对你有所帮助


网友讨论