C语言200行代码实现简易三子棋

这篇具有很好参考价值的文章主要介绍了C语言200行代码实现简易三子棋。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

C语言200行代码实现简易三子棋

前言

三子棋应该是是我们最早接触到的棋类游戏,用C语言实现三子棋对初学者来说是一种不错的锻炼
编写三子棋只需要用到数组、函数和生成随机数的知识,所以比较适合成为编程学习者编写的第一个小游戏。

一.代码实现

第一部分是源码复制就可以使用,每一个自定义函数在第二部分设计思路中都有详细解释,结合代码实现设计思路理解会有一个更好的效果

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<time.h>
#include<stdlib.h>
#define ROW 3
#define COL 3
void reset(char arr[ROW][COL])//将棋盘arr[ROW][COL]数据赋值为空格
{
	for (int i = 0; i < ROW; i++)
	{
		for (int j = 0; j < COL; j++)
		{
			arr[i][j] = ' ';
		}
	}
}
void dis_play(char arr[ROW][COL])//打印棋盘
{
	for (int i = 0; i < ROW; i++)//for每一次进去,打印一行数组和一条分割线
	{	                         //数组行为:(空格)元素(空格)|(空格)元素(空格)|(空格)元素(空格)
		                         //分割线为: -      -      -   |   -      -     -   |   -     -      -
  		for (int j = 0; j < COL; j++)//一行数组
		{
			printf(" %c ", arr[i][j]);
			if (j < COL - 1)//为了美观,最后的“|”不打印
			{
				printf("|");
			}

		}
		printf("\n");
		for (int k = 0; k < COL; k++)//一行分割线
		{
			printf("---");
			if (k < COL - 1)//为了美观,最后的“|”不打印
			{
				printf("|");
			}

		}
		printf("\n");
	}

}

void player_move(char arr[ROW][COL])//玩家下棋
{
	int row = 0, col = 0;

	while (1)
	{
		printf("玩家下棋,请输入坐标>:");
		scanf("%d %d", &row, &col);
		if (arr[row - 1][col - 1] == ' ')//判断是否可以下棋
		{
			arr[row - 1][col - 1] = '*';
			break;
		}
		printf("输入错误,请再次输入\n");

	}
}



void computer_move(char arr[ROW][COL])//电脑下棋
{
	int row = rand() % ROW;//生成行号
	int col = rand() % COL;//生成列标
	printf("电脑下棋:>\n");
	while (1)
	{

		if (arr[row][col] == ' ')//判断是否可以下棋
		{
			arr[row][col] = '#';
			break;
		}
		row = rand() % ROW;
		col = rand() % COL;

	}
}
int is_full(char arr[ROW][COL])//用于在is_win()中判断是否为平局
{
	for (int i = 0; i < ROW; i++)
	{
		for (int j = 0; j < COL; j++)
		{
			if (arr[i][j] == ' ')
				return 0;
		}

	}
	return 1;
}

char is_win(char arr[ROW][COL])//三子棋胜利无非就三种情况:行相同、列相同和对角线相同。除开胜利还有平局
{
	for (int i = 0; i < ROW; i++)//判断行
	{
		if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][0] != ' ')
			return arr[i][0];
	}
	for (int i = 0; i < COL; i++)//判断列
	{
		if (arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i] && arr[0][i] != ' ')
			return arr[0][i];
	}
	//判断对角线
	if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[0][0] != ' ')
		return arr[0][0];
	if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[0][2] != ' ')
		return arr[0][2];

	//判断平局
	if (is_full(arr))
	{
		return 'q';
	}

	//都不满足游戏继续运行 return ‘c’
	return 'c';
}


void meau()
{
	printf("------------------\n");
	printf("|     1.play     |\n");
	printf("|----------------|\n");
	printf("|     0.exit     |\n");
	printf("------------------\n");
}

void game()
{
	char arr[ROW][COL];//初始化棋盘
	char ch;
	reset(arr);//将棋盘里每一个元素赋值为空格
	dis_play(arr);
	do
	{
		
		player_move(arr);
		dis_play(arr);
		ch=is_win(arr);
		if (ch != 'c')
		{
			break;
		}

		computer_move(arr);
		dis_play(arr);
		ch=is_win(arr);
		if (ch != 'c')
		{
			break;
		}
		
	} while (1);
	switch (ch)//根据返回字符判断结果
	{
	case '#':
		printf("电脑胜利\n"); break;
	case '*':
		printf("玩家胜利\n"); break;
	case 'q':
		printf("平局\n"); break;
	}
}

int main()
{
	srand((unsigned)time(NULL));
	int input = 0;
	do 
	{
		meau();
		scanf("%d", &input);
		switch (input)
		{
		case 1 :
			game(); break;
		case 0 :
			break;
		default :
			printf("输入错误\n");
		}
	} while (input);
	
	return 0;
}

二.设计思路

main()函数搭建框架

1.main()函数搭建框架:像所有的电脑游戏一样,我们需要一个菜单,通过菜单选择进入游戏和退出游戏,当一盘游戏结束时可以再次选择进入或者退出,菜单用printf()打印就可以解决,循环的进入游戏用do while()循环就可以解决

实现代码如下

 void meau()
    {
	  printf("------------------\n");
	  printf("|     1.play     |\n");
	  printf("|----------------|\n");
	  printf("|     0.exit     |\n");
	  printf("------------------\n");
    } 
    void game()
{
	·········
}
int main()
{
    

	int input = 0;
	do 
	{
		meau();
		scanf("%d", &input);
		switch (input)
		{
		case 1 :
			game(); break;
		case 0 :
			break;
		default :
			printf("输入错误\n");
		}
	} while (input);
	
	return 0;
}

2.当我们进入case 1,运行game()函数;首先我们需要一个容器来存放我们的游戏数据,此时创建字符二维数组arr[3][3]作为容器,玩家下的棋用“*”表示电脑用”#“表示。因为行和列都为3,后面经常要使用,我们对他进行宏定义一下
#define ROW 3
#define COL 3

dis_play( )函数

》.dis_play( ):我们下棋肯定需要棋盘来显示我们的数据,我们通过构造一个函数dis_play()将数组打印出来来实现这一功能

dis_play()的功能其实就是把arr[ROW][COL]以棋盘形式打印显示出来,需要借助一些特殊字符”|“和”_“辅助打印

#define ROW 3 / 行:3
#define COL 3 / 列:3
void dis_play(char arr[ROW][COL])
{
	for (int i=0;i<ROW;i++) /for每一次进去,打印一行数组和一条分割线
	{
		for (int j = 0; j < COL; j++)//打印数组
		{
			printf(" %c ", arr[i][j]);
			if (j < COL - 1)
			{
				printf("|");
			}
			
		}
		printf("\n");
		for (int k = 0; k < COL; k++)//打印分割线
		{
			printf("---");
			if (k < COL - 1)
			{
				printf("|");
			}
			
		}
		printf("\n");
	}
	
}

初步运行代码,打印棋盘:
C语言200行代码实现简易三子棋

reset ( )函数

reset ( ) :我们下完一盘棋,还想下该怎么办?这时候我们构造一个函数reset(),将棋盘数组的每一个元素重置为空格

reset()函数,遍历数组,赋值为空格

void reset( char arr[ROW][COL])
{
	for (int i = 0; i < ROW; i++)
	{
		for (int j = 0; j < COL; j++)
		{
			arr[i][j] = ' ';//赋值空格
		}
	}
}

player_move( )函数

player_move( ):玩家下棋,不能随便下,下过的地方不能下,我们构造一个player_move()函数完成这一功能

player_move( )函数功能其实就是为数组arr[ROW][COL]赋值,数组元素为空格的地方就是可以下棋的地方
输入坐标时,和我们程序员思维不同,正常人认为行是从1开始而不是从0开始,玩家输入的数据需要减1才能正常赋值

void player_move(char arr[ROW][COL])
{
	int row = 0, col = 0;
	
	while (1)
	{
		printf("玩家下棋,请输入坐标>:");
		scanf("%d %d", &row, &col);
		if (arr[row-1][col-1] == ' ')
		{
			arr[row-1][col-1] = '*';
			break;
		}
		printf("输入错误,请再次输入\n");
			
	}
}

玩家下棋
C语言200行代码实现简易三子棋

computer_move()函数

computre_move()电脑下棋,为了更容易实现我们这里让他再棋盘上随机下,需要生成随机数的知识,我们需要构造一个函数

使用头文件#include<stdlib.h>中的rand()函数可以生成一个0~32767的伪随机数,但使用rand()前先要使用srand()设置伪随机数起点
起点只要写一次,我们将srand((unsigned)time(NULL))定义在主函数,此处是一种固定的写法,time()函数需要引<time.h>头文件

将rand()%3即%ROW可以生产0、1、2这三个随机数,可以用来做数组的行号和列标

int main()
{
	srand((unsigned)time(NULL));/设置起点的固定写法
	int input = 0;
	do 
	{
		meau();
		scanf("%d", &input);
		switch (input)
		{
		case 1 :
			game(); break;
		case 0 :
			break;
		default :
			printf("输入错误\n");
		}
	} while (input);
	
	return 0;
}
void computer_move(char arr[ROW][COL])
{
	int row = rand() % ROW ;//利用随机数生成行号列标
	int col = rand() % COL ;
	printf("电脑下棋:>\n");
	while (1)
	{
		
		if (arr[row][col] == ' ')//判断是否为空格
		{
			arr[row][col] = '#';
			break;
		}
		row = rand() % ROW;
		col = rand() % COL;

	}
}

电脑下棋
C语言200行代码实现简易三子棋

is_win()函数

is_win()光下棋也不行,每当玩家或电脑下一步棋必须有东西来判断到底是玩家赢了还是电脑赢了还是平局还是继续,我们构造is_win()函数完成这一功能

is_win()函数功能最后是返回一个字符,电脑赢返回"#",玩家赢返回”*“,平局返回”q“,以上情况都不符合就返回”c“(continue)
三子棋胜利无非就三种情况:行相同、列相同和对角线相同我们用for和if语句就可以判断
平局的情况其实就是棋盘满了,我们构造一个is_fuii()函数,棋盘满了,该函数返回1否则返回0;

int is_full(char arr[ROW][COL])
{
	for (int i = 0; i < ROW; i++)
	{
		for (int j = 0; j < COL; j++)
		{
			if (arr[i][j] == ' ')/棋盘还有空格则return 0
				return 0;
		}

	}
	return 1;
}

char is_win(char arr[ROW][COL])  /is_win()函数
{
	for (int i = 0; i < ROW; i++)/判断是否有行相同
	{
		if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][0] != ' ')
			return arr[i][0];
	}
	for (int i = 0; i <COL; i++)/判断是否有列相同
	{
		if (arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i] && arr[0][i] != ' ')
			return arr[0][i];
	}
	  /判断对角线是否相同
	if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[0][0] != ' ')
		return arr[0][0];
	if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[0][2] != ' ')
		return arr[0][2];


	if (1==is_full(arr))/is_full()返回1return ‘q’
	{
		return 'q';
	}
		
		return 'c';/都不满足,return ‘c’
}

总结
整理不易,如果有帮助就来个三联吧,后续有时间我会改进这个代码文章来源地址https://www.toymoban.com/news/detail-439774.html

到了这里,关于C语言200行代码实现简易三子棋的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 震惊!有人使用C语言实现三子棋游戏~

    大家好,欢迎观看Mr.kanglong的CSDN博客,今天和大家讨论的是如何使用C语言来实现三子棋游戏。相信大家儿时或多或少玩过三子棋游戏,那么怎么用C语言实现这样一个游戏呢?且听亢龙娓娓道来~ 目录 三子棋介绍  游戏效果  实现代码 game.h game.c test.c 三子棋是一种民间传统游

    2024年02月13日
    浏览(33)
  • 用C语言实现简单的三子棋游戏

    目录 1 - 模块简介 2 - test.c 3 - game.c 4 - game.h test.c:测试游戏逻辑 game.c: 函数的实现 game.h:函数的声明 好久没写博客啦,以后会花更多时间写博客的,感谢各位大佬支持啦!!!

    2024年01月21日
    浏览(28)
  • 【初阶C语言】实现三子棋(详解+全部源码)

    大家好,我是你们熟悉的恒川 今天我们用C语言来实现三子棋 实现的过程很难,但我们一定要不放弃 本游戏用到了三个文件 两个源文件:三子棋做法.c ,game.c 一个头文件:game.h 想要做好游戏,首要任务就是要把模块想好。 先打印一个游戏菜单 玩家选择是否(1\\0)是否进入

    2023年04月16日
    浏览(39)
  • 【C】C语言实现三子棋小游戏

    今天带大家用C语言来实现我们的一个小游戏—— 三子棋 也是用我们之前所学的知识学实现一些有价值的东西。 在开始之前要跟大家声明一下我们这个项目需要三个文件: game.h —— 主要来声明和游戏相关的函数 game.c —— 主要来实现和游戏相关的函数 test.c —— 主函数所在

    2024年02月11日
    浏览(52)
  • 华为OD机试真题 Java 实现【简易内存池】【2023 B卷 200分 考生抽中题】

    华为OD机试 2023B卷题库疯狂收录中,刷题 点这里 请实现一个简易内存池,根据请求命令完成内存分配和释放。 内存池支持两种操作命令,REQUEST和RELEASE,其格式为: 1、REQUEST 请求的内存大小表示请求分配指定大小内存,如果分配成功,返回分配到的内存首地址;如果内存不足

    2024年02月12日
    浏览(54)
  • 龙芯1b(LS1B200)使用LVGL7.0.1组件 按钮矩阵 实现简易计算器

    需求:通过按钮点击实现加减乘除的简易计算器。 1.我们使用矩阵按钮(lv_ btnmatrix )快速创建布局,文本框( lv_textarea)显示结果 。 2.在按钮回调中将点击结果加入文本框上显示。 矩阵按钮相对于普通按钮: • 对于基于网格的按钮布局,按钮矩阵更易于使用。 • 每个按钮矩阵

    2024年02月05日
    浏览(43)
  • C语言:写一个代码,使用 试除法 打印100~200之间的素数(质数)

    使用 试除法 打印100~200之间 的 素数 。                素数(质数) : 一个数 只能被写成 一和本身的积 。 如: 7 只能写成 1*7 ,那就是素数(质数)了。                       =========================================================================                         (一)

    2024年02月08日
    浏览(74)
  • C语言生成随机数【简易抽卡代码为例】

    本文将详细解释如何在C语言中生成随机数,并介绍应用的小技巧 c语言生成一个真正的随机数需要用到三个函数: rand()、srand()和time()。 函数介绍 头文件 : #includestdlib.h 函数声明 : int rand(void) 作用 ; 生成一个伪随机数序列,随机数取值范围是0~RAND_MAX PS - RAND_MAX其实是一个宏

    2024年02月04日
    浏览(53)
  • c语言200例 051 使用指针实现逆序存放数组元素

    关键技术: 1.自定义创建了个函数 inverte()用来实现对数组元素的逆序存放 2.自定义函数的形参为个指向数组的指针变量x,初始值指向数组 a 的首元素的地址,x+n是 a[n]元素的地址 3.声明指针变量i、j和 p,i初始值为x,即指向数组首元素地址,j的初始值为 x+n-1,即指向数组最

    2024年02月03日
    浏览(50)
  • C语言实现简易扫雷

    设定一个9x9的棋盘其中包含十个地雷,每次玩家选了一个位置之后那个坐标会返回一个整型数字,代表周围八个坐标内地雷的数量;如果选的为地雷则游戏失败;如果选完了除了地雷所在的坐标,则玩家获胜 首先,需要三个文件 1.game.h 实现大部分函数的声明以及引用的其他

    2023年04月08日
    浏览(39)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包