资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

【三子棋的实现】-创新互联

在红塔等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供成都网站建设、网站制作 网站设计制作定制网站制作,公司网站建设,企业网站建设,成都品牌网站建设,成都全网营销,外贸网站建设,红塔网站建设费用合理。

文章目录

目录

文章目录

前言

一、如何去实现呢?

二、实现步骤

1.游戏菜单实现

​编辑

2.游戏过程实现

  1.下棋:通过坐标形式展示

 2.判断输赢

3.完整代码实现

  game.h

 game.c 

test.c

三、测试阶段

总结


前言

三子棋游戏想必大家都玩过吧,但有没有想过自己来编写一个程序实现三子棋功能呢?下面小编就来带大家一起实现这个小小程序,一起来看看吧!!!


一、如何去实现呢?

  一般一个小工程可以分为多个模块来进行,这样会使得代码逻辑更清晰。因此我们将分为两大模块test.c(测试模块)以及game.c和game.h(游戏模块)。

二、实现步骤 1.游戏菜单实现

main函数代码不要太多,我们主要通过函数来实现相关功能,所以我们选择放入test函数中实现

  1. test()函数实现

希望游戏可以玩多次do while循环

先打印一个菜单menu();

void menu()
{
	printf("---------------------\n");
	printf("-----  1、play  -----\n");
	printf("-----  0、exit  -----\n");
	printf("---------------------\n");
}

用switch case语句决定下一步

1 玩游戏 进入game()函数 0 退出游戏 default 选择错误

int input = 0;
	do
	{
		menu();
		printf("请选择:");
		scanf_s("%d", &input);
		switch (i)

		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏");
			break;
		default:
			printf("选择错误");
		}

	} while (input);//do while循环停止条件为input为0

2.game()函数实现

记录下棋位置的信息9个位置 对应3X3的数组,因此要存储数据需要一个3X3的数组。给出一个数组 char board[3][3]最开始数组中字符都为空格,初始化棋盘为全空格,用init_board()函数来实现

init_board(board,3,3);

但只有打印出来才能看见 设置打印数组 print_board(board,3,3)函数来定义

但是我们可以看到如果用数字3直接表示时就固定化了,因此可以用宏定义#define使得选择更多样

#define ROW 3 行定义为3

#define COL 3 列定义为3

在头文件中声明

void init_board(char board[ROW][COL],int row,int col);
void print_board(char board[ROW][COL],int row,int col);

在函数实现模块game.c中实现函数

//初始化函数
void init_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++)
            board[i][j] = ' ';
    }
}

在实现print_board()函数的时候,如果只是想把9个空格元素打印出来,就看不到效果不利于观察

所以我们想到通过排版打印出方格利于观察。

//打印函数实现
void print_board(char board[ROW][COL], int row, int col)
{
    int i = 0;
    for (i = 0; i< row; i++)
    {
        printf("|---|---|---|\n");
        printf("| %c | %c | %c |\n", board[i][0], board[i][1], board[i][2]);
    }
    printf("|---|---|---|\n");
}

最后效果展示

6ec60844e04a48de88aef00bd810bb71.png

2.游戏过程实现     1.下棋:通过坐标形式展示

  (1)玩家下棋函数player_move();

考虑到一般人不知道数组下标的问题,所以将坐标行列范围都设置为从1开始

代码实现:

void player_move(char board[ROW][COL], int row, int col)
{
    while (1)
    {
        int x = 0, y = 0;
        scanf("%d%d", &x, &y);
        if (x >= 0 && x<= ROW && y >= 0 && y<= COL)
        {
            if (board[x - 1][y - 1] == ' ')
            {
                board[x - 1][y - 1] = '*';
                break;//当玩家下棋了之后跳出循环,只有可以确保玩家下棋了
            }
            else
                printf("坐标占用 重新输入\n");
        }
        else
        {
            printf("坐标非法\n");
        }
    }

(2)电脑下棋computer_move()

可以现通过srand()以及rand()函数来生产随机数,从而生成随机坐标值,得引用头文件#include和#include

void computer_play(char board[ROW][COL],int row,int col)
{
    printf("电脑下棋:\n");
    
    while (1)
    {
        int x = rand() % row;
        int y = rand() % col;
        if (x >= 0 && x< row && y >= 0 && y< col)
        {
            if (board[x][y] == ' ')
            {
                board[x][y] = '#';
                break;
            }
        }
    }
}

需要注意的是ran()函数一定要放在循环里边,因为电脑下棋可能会下到已经下了的位置,因此为了保证下错了可以重新下,就要重新产生新的坐标,因此rand()函数得放在循环里边。(开始的时候放在了while外边运行了好久都没成功!!)

 2.判断输赢

 (1)is_win函数

 设计一个新的函数来判断输赢情况,可以通过返回字符的方式来实现分类讨论。

玩家赢     返回 '*'

电脑赢     返回 '#'

平局         返回 '!'

没有分出胜负继续游戏   返回 '>'

  (2)is_full函数

为了更方便判断平局,我们设计一个if_full()函数

代码实现:

int is_full(char board[ROW][COL], int row, int col)
{
    int i = 0, j = 0;
    for (i = 0; i< row; i++)    //通过遍历整个二维数组判断满没满
    {
        for (j = 0; j< col; j++)
        {
            if (board[i][j] == ' ')
            {
                return -1;  //有空格则说明没满,返回-1
            }
        }
    }
    return 1;//满了返回1
}

接下来就可以完整实现is_win()函数了

代码实现:

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] != ' ') || (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[2][0] != ' '))
        return board[1][1];
    //满了平局
    int x = is_full(board, ROW, COL);
    if (x == 1)
        return '!';
    //没满并且没分出胜负,则继续
    else
        return '>';
}
  • 值得注意的是其中的顺序,首先是判断电脑与玩家是否分出胜负(根据每行,每列,每条对角线是否相等),然后在判断是否为平局(棋满了),如果不是棋满了,则继续

 (3)game函数中判断输赢

首先是看是否继续(是否返回 '>' ),以此作为循环终止条件,然后再根据返回值类型判断输赢或是平局

void game()
{
	char board[ROW][COL];
	char ret;
	init_board(board, ROW, COL);
	print_board(board, ROW, COL);
	srand((unsigned int)time(NULL));
	while (1)
	{
		player_move(board, ROW, COL);
		print_board(board, ROW, COL);
		ret=is_win(board, ROW, COL);
		if (ret != '>')
			break;
		computer_play(board, ROW, COL);
		print_board(board, ROW, COL);
		ret=is_win(board, ROW, COL);
		if (ret != '>')
			break;
	}
	//判断输赢或平局
	if (ret == '*')
	{
		printf("玩家赢了!\n");
	}
	else if (ret == '#')
	{
		printf("电脑赢了!\n");
	}
	else if (ret == '!')
	{
		printf("平局!\n");
	}
3.完整代码实现     game.h
//game.h
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include#include#include#define ROW 3
#define ROWS 11
#define COL 3
#define COLS 11
void init_board(char board[ROW][COL], int row, int col);
void print_board(char board[ROW][COL], int row, int col);
void player_move(char board[ROW][COL], int row, int col);
void computer_play(char board[ROW][COL],int row,int col);
char is_win(char board[ROW][COL], int row, int col);
 game.c 
#include"game.h"
void init_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++)
            board[i][j] = ' ';
    }
}
void print_board(char board[ROW][COL], int row, int col)
{
    int i = 0;
    for (i = 0; i< row; i++)
    {
        printf("|---|---|---|\n");
        printf("| %c | %c | %c |\n", board[i][0], board[i][1], board[i][2]);
    }
    printf("|---|---|---|\n");
}
void player_move(char board[ROW][COL], int row, int col)
{
    while (1)
    {
        int x = 0, y = 0;
        printf("玩家下棋,坐标为->:");
        scanf("%d%d", &x, &y);
        if (x >0 && x<= ROW && y >0 && y<= COL)
        {
            if (board[x - 1][y - 1] == ' ')
            {
                board[x - 1][y - 1] = '*';
                break;//当玩家下棋了之后跳出循环,就可以确保玩家下棋了
            }
            else
                printf("坐标占用 重新输入\n");
        }
        else
        {
            printf("坐标非法\n");
        }
    }

}
void computer_play(char board[ROW][COL],int row,int col)
{
    printf("电脑下棋:\n");
    
    while (1)
    {
        int x = rand() % row;
        int y = rand() % col;
        if (x >= 0 && x< row && y >= 0 && y< col)
        {
            if (board[x][y] == ' ')
            {
                board[x][y] = '#';
                break;
            }
        }
    }
}
int is_full(char board[ROW][COL], int row, int col)
{
    int i = 0, j = 0;
    for (i = 0; i< row; i++)
    {
        for (j = 0; j< col; j++)
        {
            if (board[i][j] == ' ')
            {
                return -1;
            }
        }
    }
    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] != ' ') || (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[2][0] != ' '))
        return board[1][1];
    //满了平局
    int x = is_full(board, ROW, COL);
    if (x == 1)
        return '!';
    //没满并且没分出胜负,则继续
    else
        return '>';
}
test.c
#include"game.h"
void menu()
{
	printf("---------------------\n");
	printf("-----  1、play  -----\n");
	printf("-----  0、exit  -----\n");
	printf("---------------------\n");
}
void game()
{
	char board[ROW][COL];
	char ret;
	init_board(board, ROW, COL);
	print_board(board, ROW, COL);
	srand((unsigned int)time(NULL));
	while (1)
	{
		player_move(board, ROW, COL);
		print_board(board, ROW, COL);
		ret=is_win(board, ROW, COL);
		if (ret != '>')
			break;
		computer_play(board, ROW, COL);
		print_board(board, ROW, COL);
		ret=is_win(board, ROW, COL);
		if (ret != '>')
			break;
	}
	//判断输赢或平局
	if (ret == '*')
	{
		printf("玩家赢了!\n");
	}
	else if (ret == '#')
	{
		printf("电脑赢了!\n");
	}
	else if (ret == '!')
	{
		printf("平局!\n");
	}
}
void test()
{
	int input = 0;
	do
	{
		menu();
		printf("请选择:");
		scanf_s("%d", &input);
		switch (input)

		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏");
			break;
		default:
			printf("选择错误");
		}

	} while (input);
}

int main()
{
	
	test();

	return 0;
}
三、测试阶段

 最后来玩玩三子棋游戏啦!!


总结

今天的三子棋游戏就到这里啦!!喜欢的话记得点赞+收藏哦!!!

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


网站栏目:【三子棋的实现】-创新互联
分享URL:http://cdkjz.cn/article/josje.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

业务热线:400-028-6601 / 大客户专线   成都:13518219792   座机:028-86922220