C语言—与坤(机)对弈

这篇具有很好参考价值的文章主要介绍了C语言—与坤(机)对弈。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

C语言—与坤(机)对弈

 

目录

设计思路

游戏运行效果 

函数的声明

头文件game.h

游戏主体(源文件)

1.game.c

2.test.c

各文件的阐述

各部分的设计心得

1.打印菜单

2.初始化棋盘

3.打印棋盘

棋盘最终效果

1.打印数据

2.打印分割线

如何扩展为10 x 10 棋盘?

4.玩家下棋、电脑下棋

玩家下棋

电脑下棋

5.游戏对局判断            

①玩家赢 / 电脑赢      

②平局           

       

③继续                        


设计思路

大体可以分为五个部分

1.打印菜单

2.初始化棋盘

3.打印棋盘

4.玩家下棋、电脑下棋

5.游戏对局判断

①玩家赢 / 电脑赢      

②平局                         

③继续                        

游戏运行效果 

C语言—与坤(机)对弈

函数的声明

头文件game.h

#pragma once


//三子棋游戏函数声明文件


#include<stdio.h>


#define COL 3
#define ROW 3

//打印菜单
void menu();

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

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

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

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

//游戏规则
char IsWin(char Board[ROW][COL], int row, int col);

//判断平局
int IsFull(char Board[ROW][COL], int row, int col);

游戏主体(源文件)

1.game.c

#define _CRT_SECURE_NO_WARNINGS 1

//三子棋游戏主体

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




void InitBoard(char Board[ROW][COL], int row, int col)//初始化棋盘为空格
{
	int i = 0;
	int j = 0;
	for (i = 0; i < col; i++)
	{
		for (j = 0; j < col; j++)
		{
			Board[i][j] = ' ';
		}
	}
}




//打印棋盘
//版本1
//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]);
//		}
//			printf("\n");
//		}
//}




//版本2
//void DisPlayBoard(char Board[ROW][COL], int row, int col)                
//{
//	int i = 0;
//	for (i = 0; i < row; i++)
//	{
//		//1. 打印数据
//		printf(" %c | %c | %c \n",Board[i][0], Board[i][1], Board[i][2]);
//	    //2.打印分割线
//		if(i < row - 1)
//		printf("---|---|---\n");
//	}
//}



//版本3
void DisPlayBoard(char Board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		//1. 打印数据
		int j = 0;
		for (j = 0; j < col; j++)
		{
			printf(" %c ", Board[i][j]);
			if (j < col - 1)
			{
				printf("|");
			}
		}
		printf("\n");


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



//玩家下棋
void PlayerMove(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 <= col && y >= 1 && y <= row)
		{
			if (Board[x - 1][y - 1] ==' ')
			{
				Board[x - 1][y - 1] = '*';
				break;
			}
			else
			{
				printf("坐标被占用,请重新输入\n");
			}
		}
		else
		{
			printf("坐标非法,请重新输入\n");
		}
	}
}




//电脑下棋
void ComputerMove(char Board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;

	printf("电脑下棋:>\n");

	while (1)
	{
		x = rand() % row;
		y = rand() % col;
		if (Board[x][y] == ' ')
		{
			Board[x][y] = '#';
			break;
		}
	}
}





int IsFull(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 IsWin(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];
		}
	}

	int j = 0;
	for ( j = 0; j < col; j++)
	{
		//判断列
		if (Board[0][j] == Board[1][j] && Board[1][j] == Board[2][j] && Board[0][j] != ' ')
		{
			return Board[0][j];
		}
	}

	//判断对角线
	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 (IsFull(Board,ROW,COL) == 1)
	{
		return 'Q';
	}




	//继续
	return 'C';




}

2.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 Board[ROW][COL] = { 0 };
	InitBoard(Board, ROW, COL);                     //初始化棋盘
	DisPlayBoard(Board, ROW, COL);                  //打印棋盘
	char flag = 0;
	while (1)
	{
		//玩家下棋
		PlayerMove(Board, ROW, COL);
		DisPlayBoard(Board, ROW, COL);
		//判断输赢
		flag = IsWin(Board, ROW, COL);
		if (flag != 'C')
		{
		break;
		}
	
		//电脑下棋
		ComputerMove(Board, ROW, COL);
		DisPlayBoard(Board, ROW, COL);
		//判断输赢
		flag = IsWin(Board, ROW, COL);
		if (flag != 'C')
		{
			break;
		}
	}
	
	
	//游戏结束
	if (flag == '*')
	{
		printf("玩家赢\n");
	}
	else if (flag == '#')
	{
		printf("电脑赢\n");
	}
	else
	{
		printf("平局\n");
	}


}




int main()
{
	int pick = 1;
	srand((unsigned int)time(NULL));
	while (pick)
	{
		menu();
		printf("请选择:>");
		scanf("%d", &pick);
		switch (pick)
		{
		case 1:
			game();
			break;
		case 0:
			pick = 0;
			break;
		default:
			printf("请重新输入\n");
			break;
		}
	}
	printf("退出游戏\n");
	return 0;
}

各文件的阐述

game.h头文件用来声明函数
game.c游戏功能的实现
test调用game.c的函数,用于运行测试

各部分的设计心得

1.打印菜单

封装一个专门打印菜单的函数,后期想要美化菜单直接在函数修改即可,不用在海量的主体代码寻找菜单部分的代码,提高工作效率

2.初始化棋盘

三子棋需要一个3 x 3 的棋盘

故此我们需要一个三行三列的 二维数组

#define ROW 3

#define COL 3

char Board[ROW][COL] = {0};   

这里的定义在打印棋盘时有妙用 

void InitBoard(char Board[ROW][COL], int row, int col)//初始化棋盘为空格
{
	int i = 0;
	int j = 0;
	for (i = 0; i < col; i++)
	{
		for (j = 0; j < col; j++)
		{
			Board[i][j] = ' ';
		}
	}
}

3.打印棋盘

棋盘最终效果

C语言—与坤(机)对弈

分析上图  可以将棋盘拆分为两部分打印

void DisPlayBoard(char Board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		//1. 打印数据
		int j = 0;
		for (j = 0; j < col; j++)
		{
			printf(" %c ", Board[i][j]);
			if (j < col - 1)
			{
				printf("|");
			}
		}
		printf("\n");


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

1.打印数据

由于分割线为三个字符,故为了美观打印数据可以用空格补齐三个字符

在打印  |  时  需注意 其要比数据少打印一次

2.打印分割线

同理 在打印  |  时  需注意 其要比分割线少打印一次

注:上述打印棋盘操作以打印一行为例   故要嵌套循环 用外层循环来控制打印的行数

如何扩展为10 x 10 棋盘?

这是就体现了定义的好处了

可以通过修改定义来扩展棋盘

#define ROW 10

#define COL 10

char Board[ROW][COL] = {0};   

4.玩家下棋、电脑下棋

玩家下棋

void PlayerMove(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 <= col && y >= 1 && y <= row)
		{
			if (Board[x - 1][y - 1] ==' ')
			{
				Board[x - 1][y - 1] = '*';
				break;
			}
			else
			{
				printf("坐标被占用,请重新输入\n");
			}
		}
		else
		{
			printf("坐标非法,请重新输入\n");
		}
	}
}

以玩家的视角  棋盘坐标x,y的范围是1<x<3   1<y<3

而且数组的下标从0开始    故判断玩家是否可以落子时

将其输入的x,y坐标 横纵坐标均减  1   以此让计算机判断

电脑下棋

void ComputerMove(char Board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;

	printf("电脑下棋:>\n");

	while (1)
	{
		x = rand() % row;
		y = rand() % col;
		if (Board[x][y] == ' ')
		{
			Board[x][y] = '#';
			break;
		}
	}
}

电脑下棋需要生成棋盘范围内的随机数

通过rand()可以生产随机数  需与srand()配合使用 

srand()只需要调用一次  故直接放在主函数即可

srand()与时间戳配合使用即可生成一个随机的生成器起点

srand(unsigned int(time(NULL)))

要将随机生成的数范围固定在棋盘内

通过取余的方法可以完成

x = rand() % row        得        0<x<row - 1

5.游戏对局判断            

①玩家赢 / 电脑赢      

三种情况

1.行

2.列

行列均可通过循环改变一个坐标 遍历所有行或列来判断

3.两条对角线

找出对角线坐标进行判断即可

返回赢家的下的棋子

②平局           

平局的判断在赢之后  即赢的判断无返回值才会进行平局判断

判断棋盘是否满了     满了即平局

return 'Q'

       

③继续                        

   return 'C'

注:返回值是一个巧妙的用法  因为赢的情况三个棋子都一样 

任意返回一个棋子的数据即可

在未来改变棋子的形状时也无影响

  ⠀⠰⢷⢿⠄
⠀⠀⠀⠀⠀⣼⣷⣄
⠀⠀⣤⣿⣇⣿⣿⣧⣿⡄
⢴⠾⠋⠀⠀⠻⣿⣷⣿⣿⡀
🏀 ⠀⢀⣿⣿⡿⢿⠈⣿
⠀⠀⠀⢠⣿⡿⠁⠀⡊⠀⠙
⠀⠀⠀⢿⣿⠀⠀⠹⣿
⠀⠀⠀⠀⠹⣷⡀⠀⣿⡄
⠀⠀⠀⠀⣀⣼⣿⠀⢈⣧                                       爱你们哟么么哒

⠀⠀ 文章来源地址https://www.toymoban.com/news/detail-440601.html

到了这里,关于C语言—与坤(机)对弈的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言入门教程||C语言 头文件||C语言 强制类型转换

    头文件是扩展名为  .h  的文件,包含了 C 函数声明和宏定义,被多个源文件中引用共享。有两种类型的头文件:程序员编写的头文件和编译器自带的头文件。 在程序中要使用头文件,需要使用 C 预处理指令  #include  来引用它。前面我们已经看过  stdio.h  头文件,它是编译

    2024年02月02日
    浏览(45)
  • C语言入门教程||C语言 文件读写||C语言 预处理器

    本章我们将介绍 C 程序员如何创建、打开、关闭文本文件或二进制文件。 一个文件,无论它是文本文件还是二进制文件,都是代表了一系列的字节。C 语言不仅提供了访问顶层的函数,也提供了底层(OS)调用来处理存储设备上的文件。本章将讲解文件管理的重要调用。 您可

    2024年02月02日
    浏览(40)
  • C语言之初识C语言

    想必刚接触C语言的同学们不知道C语言是什么?,有什么用,那么你来对了,本系列就会带你入门C语言,从入门到“入土”,开玩笑的,正如标题所说,本教程首先对C语言有一个初步的认识,能够看懂别人写的是什么,有一个大概的框架,那么,我要开始讲解了。 这一章主要

    2024年02月04日
    浏览(46)
  • 05- c语言函数 (C语言)

    1、在程序设计过程中,为了实现某个功能需要编写多行代码,例如求一个二维数组中的最大值,如果 该功能需要被多次使用 ,我们可以在每次使用时将原来的代码重复编写,但是这样未免有“凑代码”的嫌疑,而且编程效率也不高。为了避免重复劳动,我们可以将这部分代

    2024年02月09日
    浏览(96)
  • 『C语言入门』初识C语言

    在这个数字化时代,计算机编程已经成为连接人类与技术的桥梁。而在编程的世界中,C语言犹如一座承载着无限可能性的基石。作为计算机编程的经典之选,C语言无疑是每个刚刚踏入编程领域的初学者的理想起点。本篇博客将带您踏上一段奇妙的C语言学习之旅,不仅会教您

    2024年02月11日
    浏览(46)
  • 【编程语言 · C语言 · 函数指针】

    由于指针可以指向任何存储器位置中的地址,因此它们也可以指向可执行代码的开头。 函数指针或函数指针指向内存中函数的可执行代码。函数指针可以存储在数组中,也可以作为参数传递给其他函数。 函数指针声明使用 * 就像使用任何指针一样: (*func_name)  周围的括号很

    2024年02月10日
    浏览(55)
  • 介绍一些编程语言—C语言

    C 语言是一门 面向过程 的计算机编程语言,与 C++、C#、Java 等面向对象编程语言有所不同。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、仅产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。 C语言描述问题比汇编语言迅速、工作量小

    2024年02月13日
    浏览(49)
  • 介绍一些编程语言— Perl 语言

    Perl 是一种动态解释型的脚本语言。 最初的设计者为拉里・沃尔,它于 1987 1987 1987 年 12 12 12 月 18 18 18 日发表。Perl 借取了 C、sed、awk、shell scripting 以及很多其他编程语言的特性。其中最重要的特性是他内部集成了正则表达式的功能,以及巨大的第三方代码库 CPAN。 1987 1987

    2024年02月12日
    浏览(53)
  • Go语言和C++语言比较

    介绍 GO : Go语言(又称Golang)是由谷歌公司的技术工程师在2007年开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。其设计初衷是为了解决大规模并发处理和互联网应用开发中的问题。 在2007年的一次技术会议中,谷歌公司的技术工程师讨论了C++语言

    2024年01月19日
    浏览(40)
  • 『C语言从入门到进阶』第 ⓪ 期 - 初识C语言 | C语言知识预览

    🌸作者简介: 花想云 ,在读本科生一枚,C/C++领域新星创作者,新星计划导师,阿里云专家博主,CSDN内容合伙人…致力于 C/C++、Linux 学习。 🌸 专栏简介:本文收录于 C语言从入门到精通专栏 。 本篇文章主要内容为 了解C语言阶段我们将要学习的内容 。在本文中,我们 不

    2023年04月09日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包