C语言小游戏之简易版三子棋(棋盘可自由扩展)

目录
  • 前言
  • step1.初始化棋盘内值为空格
  • step2.打印棋盘
  • step3.玩家下棋
  • step4.电脑下棋 
  • step5.判断棋盘是不是满了
  • step6.判断输赢
  • step7.最终测试三种情况
  • game.h
  • game.c 
  • test.c

前言

test.c  放游戏的测试逻辑——调用game.c game.h

游戏模块:

game.c   放游戏的实现逻辑

game.h  放游戏实现函数的声明

step1.初始化棋盘内值为空格

思路

1.初始化棋盘内的值

2.棋盘中的数组内容应当全部是空格

3.为了可以方便的改变棋盘的大小,用一个宏定义,方便修改棋盘的大小;例如将3*3的棋盘改成5*5的棋盘只需要将宏定义后的数字改变即可

5*5棋盘:

#define ROW 5 //行
#define COL 5 //列
#include<stdio.h>

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

3*3棋盘:

#define ROW 3 //行
#define COL 3 //列
#include<stdio.h>

void InitBoard(char board[ROW][COL],int row, int col);
void InitBoard(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] = ' ';//初始化为一个空格
		}
	}

}

step2.打印棋盘

思路

1.观察棋盘

2.每一行先打印 %c 和 |

printf(" %c | %c | %c\n", board[i][0], board[i][1], board[i][2]);

3.然后打印 --- 和 |

printf("---|---|---\n");

4.得到普通版本:

void DisplayBoard(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; ++i)
	{
		//先打印数据
		printf(" %c | %c | %c\n", board[i][0], board[i][1], board[i][2]);
		//打印分割行
		if(i<row-1)
		printf("---|---|---\n");
	}
}

·可是这样的棋盘打印的好吗?

·不好,只能打印3行3列的棋盘;如果要打印5*5棋盘需要重新写大量代码,不方便扩展! 

·可扩展版

思路

1.我们发现每一个数据行:   %c  |  作为一个单元,最后一列 只打印%c

2. 打印分割行: ---| 作为1个单元 ,最后一列 只打印---

void DisplayBoard(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)//打印数据
		{
			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");

	}
}

step3.玩家下棋

思路

玩家下棋需要考虑3种情况——>(需要使用if语句)

1.棋盘位置没有值,即为空格 ——>输入

2.棋盘位置有值——>该坐标被占用,请重新输入(需要使用循环语句)

3.输入坐标超过了棋盘大小——>坐标非法!请重新输入(需要使用循环语句)

void player_move(char board[ROW][COL], int row, int col)
{
	printf("玩家下棋:>");
	int x = 0;
	int y = 0;
	while (1)
	{
		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");
		}
	}
}

step4.电脑下棋 

思路

1.电脑随机下棋 需要使用一个产生随机值的库函数 rand()

使用rand前必须要先声明一个srand

void game()
{
	srand((unsigned int)time(NULL));
     ....
}

2.电脑下棋的范围是 行号0-2 列号0-2;为了将随机值限定在这个范围,我们需要%3

3.判断随机的坐标位置有没有被占用(if判断)——>如果占用,重新计算随机值(循环)

注意:这里为了丰富一下循环的种类,采用了goto语句!

void computer_move(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("电脑下棋\n");
again:
	x = rand() % ROW;//0-2
	y = rand() % ROW;//0-2
	//判断坐标有没有被占用
	if (board[x][y] == ' ')
	{
		board[x][y] = '#';//生成的数字已经是0-2的范围了,不需要再减1
	}
	else
	{
		goto again;
	}
}

step5.判断棋盘是不是满了

思路

1.遍历二维数组(循环)

2.判断二维数组元素中的值有无‘  ',如果含有空格,说明棋盘没满——>return 0

3.如果遍历完没有空格‘  ' ——>return1 

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

step6.判断输赢

·普通版

思路

1.四种结局

  • 一行相同元素赢
  • 一列相同元素赢
  • 对角线相同元素赢
  • 平局——调用step5中的函数

2.函数的返回值设置

  • 玩家赢——return ‘*'
  • 电脑赢——return ‘#'
  • 平局——return ‘Q'
  • 游戏继续——return ‘C'
char is_win(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; ++i)//3行的判断
	{
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
		{
			return board[i][0];
		}
	}
	for (i = 0; i < col; ++i)//3列的判断
	{
		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 (is_full(board, row, col))//在函数内部传递的实参
	{
		return 'Q';
	}

	//游戏继续
	return 'C';
}

step7.最终测试三种情况

 

game.h

#define _CRT_SECURE_NO_WARNINGS 1
#define ROW 3 //行
#define COL 3 //列
#include<stdio.h>
#include<time.h>
#include<stdlib.h>

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);//电脑下棋

//判断输赢的代码
//玩家赢 ---- '*'
//电脑赢 ---- '#'
//平局 ---- 'Q'
//继续 ---- 'C'
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;
	int j = 0;
	for (i = 0; i < row; ++i)
	{
		for (j = 0; j < col; ++j)
		{
			board[i][j] = ' ';//初始化为一个空格
		}
	}

}

void DisplayBoard(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)//打印数据
		{
			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)
{
	printf("玩家下棋:>");
	int x = 0;
	int y = 0;
	while (1)
	{
		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");
again:
	x = rand() % ROW;//0-2
	y = rand() % ROW;//0-2
	//判断坐标有没有被占用
	if (board[x][y] == ' ')
	{
		board[x][y] = '#';//生成的数字已经是0-2的范围了,不需要再减1
	}
	else
	{
		goto again;
	}
}

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)//3行的判断
	{
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
		{
			return board[i][0];
		}
	}
	for (i = 0; i < col; ++i)//3列的判断
	{
		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 (is_full(board, row, col))//在函数内部传递的实参
	{
		return 'Q';
	}

	//游戏继续
	return 'C';
}

test.c

#include"game.h"

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

void game()
{
	srand((unsigned int)time(NULL));
	//数据存储到一个二维数组中,玩家下棋是'*' ,电脑下棋是'#'
	char board[ROW][COL] = { 0 };
	InitBoard(board, ROW, COL);//初始化棋盘
	//打印棋盘
	DisplayBoard(board, ROW, COL);
	//下棋
	char ret='0';
	while (1)
	{
		player_move(board,ROW,COL);//下到这个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("玩家赢");
	}
	else if (ret == '#')
	{
		printf("电脑赢");
	}
	else
	{
		printf("平局");
	}
}

void test()
{
	int input = 0;
	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;
}

以上就是C语言小游戏之简易版三子棋的详细内容,更多关于C语言 三子棋的资料请关注我们其它相关文章!

(0)

相关推荐

  • C语言实现三子棋游戏(棋盘可变)

    本文实例为大家分享了C语言实现三子棋游戏的具体代码,供大家参考,具体内容如下 思路: main函数结构部署 game函数功能的实现 ①创建存储空间 ②初始化存储空间为空格 ③打印棋盘 ④实现玩家下棋 ⑤实现电脑下棋 ⑥实现玩家和电脑下棋后的输赢判断 所使用的文件: test.c-----用于测试游戏 game.c----用于实现游戏中的一些函数 game.h-----头文件 test.c #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #

  • C语言实现三子棋简单小游戏

    三子棋 ,也叫井字棋,是一款大家都玩过的经典小游戏,也是一个适合初学c语言的小伙伴练练手的小项目. 1.整个棋盘采用二维数组存储,下棋时只要获取到x,y两个方向的坐标访问二维数组中的元素改变存储的字符串样式. 2.判断输赢或平局,直接穷举就行了,判断每行.每列.和对角线是否有三个棋子相连.可设置一个带返回值的检查函数,根据不一样的返回值进行不同操作. 3.其余的页面菜单,和棋盘打印.只需要合理利用循环和判断来打印相关内容,很容易就能实现了. 效果展示 附上全部源码,大家可以在自己的编译器上跑一下

  • C语言实现的一个三子棋游戏详解流程

    目录 前言 一.三子棋完成程序运行结果 二.三子棋代码实现 1.创建源文件与头文件 2.整体页面的制作 3.制作并打印棋盘 1.在test.c文件中,定义函数game(); 2.在game.h 头文件中 3.在game.c源文件中 4.人机互动下棋 1.在test.c源文件中 2.在game.h头文件中 3.在game.c源文件中 4.此时打印效果 5.判断输赢 1.在test.c源文件中 2.在game.h头文件中 3.在game.c源文件中 4.最终实现结果 最后 前言 三子棋是我们先前所学

  • 详解用C语言实现三子棋游戏流程

    目录 三子棋游戏简介 一.分析及实现 1.棋盘 2.落子 3.判断输赢 二.程序演示 三.完整代码 1.main.c 2.game.c 3.game.h 总结 三子棋游戏简介 这是一个简单的三子棋小游戏,估计大家小时候都玩儿过,只要能连成三个,无论是行,列还是对角线,就可以胜利了.是不是很简单呢,那我们来尝试一下用C语言来写一个简单的三子棋游戏. 一.分析及实现 1.棋盘 想要玩游戏,那首先应该有一个棋盘吧.因为我们玩儿的是三子棋,所以来说一个3X3的棋盘应该可以满足要求.这里使用了一个三行三列

  • 基于C语言实现三子棋小游戏

    在写三子棋之前,我们要先了解三子棋的一个大概的图形,以便于我们整理思路. 首先我们要分模块写代码,不要全部写在主函数里面,模块化的代码便于理解,而且给人一种赏心悦目的感觉,如: game.h game.c test.c game.h---头文件的包含,定义宏变量以及函数声明 #pragma once //头文件的包含 #include<stdio.h> #include<stdlib.h> #include<time.h> //函数的声明 #define ROW 3 #

  • C语言小游戏之简易版三子棋(棋盘可自由扩展)

    目录 前言 step1.初始化棋盘内值为空格 step2.打印棋盘 step3.玩家下棋 step4.电脑下棋  step5.判断棋盘是不是满了 step6.判断输赢 step7.最终测试三种情况 game.h game.c  test.c 前言 test.c  放游戏的测试逻辑--调用game.c game.h 游戏模块: game.c   放游戏的实现逻辑 game.h  放游戏实现函数的声明 step1.初始化棋盘内值为空格 思路 1.初始化棋盘内的值 2.棋盘中的数组内容应当全部是空格

  • c语言实现简易版三子棋(附完整代码)

    目录 一.菜单栏 二.初始化棋盘 三.打印棋盘 四.玩家下棋 五.电脑下棋 六.判断输赢 七.调用玩家.电脑下棋函数和判断输赢函数 八.全部代码 总结 一.菜单栏 1.制作一个简易版的菜单,并附上选项提示 2.因为该程序想至少运行一次,所有选择用do while循环,而选择玩与不玩游戏时,则采用switch case语句比较合适,然后调用相应的函数即可 二.初始化棋盘 1.先创建一个棋盘 为了便于更改棋盘大小,所有采用宏定义的方式来定义其行与列 2.对棋盘进行初始化 起初未下棋时,棋盘应该是空白

  • c语言实现简易版三子棋(附完整代码)

    目录 一.菜单栏 二.初始化棋盘 三.打印棋盘 四.玩家下棋 五.电脑下棋 六.判断输赢 七.调用玩家.电脑下棋函数和判断输赢函数 八.全部代码 总结 一.菜单栏 1.制作一个简易版的菜单,并附上选项提示 2.因为该程序想至少运行一次,所有选择用do while循环,而选择玩与不玩游戏时,则采用switch case语句比较合适,然后调用相应的函数即可 二.初始化棋盘 1.先创建一个棋盘 为了便于更改棋盘大小,所有采用宏定义的方式来定义其行与列 2.对棋盘进行初始化 起初未下棋时,棋盘应该是空白

  • C语言实现简易版三子棋游戏

    本文实例为大家分享了C语言实现三子棋游戏的具体代码,供大家参考,具体内容如下 什么是多文件? 多数大型的工程的头文件和源文件非常多,我们也不可能把所有的代码都写在同一个文件里,这样也不方便代码的阅读与维护,通常都会根据不同的功能将代码分别书写到多个源文件与头文件中. 游戏介绍 三子棋是个简单的双人游戏,双方在3X3的棋盘上轮流落子,当一条直线上出现三颗连续且相同的棋子时即获胜.此程序让玩家先落子,电脑在棋盘上随机落子.游戏结束时显示胜负,玩家可以选择是否继续玩游戏. 代码实现 chess.h 通

  • C语言版三子棋小游戏

    本文实例为大家分享了C语言版三子棋小游戏的具体代码,供大家参考,具体内容如下 ①游戏效果 有一个3*3的棋盘 每次下棋后(电脑和玩家),棋盘会更新数据 会有菜单提示相关命令进行相关操作 下棋方法是输入坐标 每一局游戏结束后,会询问是否继续. ②主函数逻辑搭建 任何一个项目的实现,最重要的就是逻辑结构搭建,而各个功能的实现就是采取函数(模块化)进行细分. 所以我们需要搭建逻辑,那么逻辑结构是啥呢? 首先会跳出提示菜单,内容为 0退出游戏,1开始/继续游戏,其他键提示错误,并重新输入 按0后提示 "

  • C语言版三子棋游戏实现代码

    本文实例为大家分享了C语言版三子棋游戏的具体代码,供大家参考,具体内容如下 实现一个三子棋小游戏 下面是实现步骤: 总共有需要三个文件 第一,test.c 我们要在这个文件里面实现游戏的主体流程 第二,game.c 在这个文件里我们可以实现各个游戏函数的分装 第三,game.h 在这个文件里我们实现的是各个函数的声明 test.c 1.首先要有一个菜单 让玩家可以做出选择 2.接着对玩家做出的不同选择进行实现 选1就是开始游戏,所以我们进入到game函数里就好了 选0就是退出游戏, 其他选择的话

  • C语言实现简单版三子棋

    本文实例为大家分享了C语言实现简单版三子棋的具体代码,供大家参考,具体内容如下 游戏的主函数设计: 1.打印出可以让玩家选择游戏开始和退出的菜单. 2.如果玩家选择1,则游戏开始,并开始执行game()函数. 3.如果玩家选择0,则游戏退出. 4.如果玩家选择了其他数,提醒玩家选择正确的功能. 主函数的实现: int main() { int input = 0; srand((unsigned int)time(NULL)); do { menu(); printf("请输入-->&qu

  • 用C语言实现圣诞树(简易版+进阶版)

    目录 前言 初学者版: 初学者版2 以下是进阶版,更炫: 总结 前言 圣诞节快到了,这是我到CSDN度过的第一个圣诞节,也是我学习计算机的第一个圣诞节,为了让它更有意义,我呕心沥血,自己打了两版初学者版,再在网上找了一版进阶版,都十分精美,废话少说,代码奉上: 初学者版: #include<stdio.h> #include<windows.h> #include<string.h> void color(int x) { if(x>=0 && x

  • c语言小游戏程序之弹跳小球的实现代码

    现在说一下其中一个最简单的小程序:弹跳小球 ---------------LINE---------------- 首先我们知道,在窗口的坐标系原点是在窗口左上角的,如图所示 然后我们如果想在这个坐标系里面的某个点上画出一个小球,那么它的坐标系应该就是这样的 转换到c语言的思维的话:X0既是打印出X0个"\n",Y0既是打印出Y0个空格!!!! SO 代码如下 #include <stdio.h> #include <stdlib.h> int main() {

  • C语言小游戏之小熊跳板功能的实现

    上篇文章给大家介绍了C语言实现桌面贪吃蛇小游戏,感兴趣的朋友可以点击查看,今天给大家介绍c语言实现小熊跳板功能. C语言代码,有点简陋,还有许多可以优化的地方,注释也没写全,后期会补充,后期也可能添加更多功能,我会去尽量的完善代码. 测试工具:VS2019,语言:C语言 #include<stdio.h> #include<stdlib.h> #include<Windows.h> #include<conio.h> #include<time.h&g

随机推荐