C语言 VS2019编译器实现简易井字棋小游戏~

本文章将详细说明如何用C语言实现简易的井字棋小游戏,编译器用的是VS2019。

井字棋小游戏

最终效果如图:

在这里插入图片描述

游戏实现

一、创建新项目及游戏文件

1.打开VS创建新的空项目。
2.在解决方案资源管理器选中 源文件 > 右键点击添加 > 新建项 > 选中C++文件并分别创建 game.ctext.c
3.用同样的方法在解决方案资源管理器 创建头文件 game.h
在这里插入图片描述

二、引头文件,定义符号

在game.h引入头文件并定义井字棋的行数和列数。
井字棋是3*3的棋盘,因此定义行数3,列数3。
game.h

#pragma once
#define _CRT_SECURE_NO_WARNINGS
#define ROW 3 //棋盘行数
#define COL 3 //棋盘列数
#include <stdio.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>

然后在game.c 和 text.c 引入头文件 “game.h”
game.c

#include"game.h"

text.c

#include"game.h"

三、主函数

主函数用do while语句和switch语句构成,定义整形 input 来接收玩家输入的数字,输入0则退出游戏,输入1则开始游戏。输入其他数字时则显示输入错误。
text.c

int main()
{
	srand((unsigned int)time(NULL));//设置随机数起点
	int input = 0;//接收玩家输入的数字
	do 
	{
		printmenu();//打印菜单
		scanf("%d", &input);
		switch (input)
		{
		case 0:
			printf("退出成功!\n");
			break;
		case 1:
			system("cls");//清屏
			printf("开始游戏!\n\n\n");
			playgame();//开始游戏
			break;
		default:
			printf("输入错误,请重试!\n");
			break;
		}
	} while (input);//当input为0,相当于假 退出循环
	return 0;
}

打印菜单

在主函数种do while语句中先打印菜单让玩家知道输入什么开始游戏,输入什么退出游戏。定义函数printmenu() 来打印菜单。在game.c实现函数并在game.h声明。
game.c

void printmenu()
{
	printf("■■■■■■■■■■■■■■■\n");
	printf("■■■    1.开始游戏    ■■■\n");
	printf("■■■    0.退出游戏    ■■■\n");
	printf("■■■■■■■■■■■■■■■\n");
	printf("请输入数字‘0’或数字‘1’>>>\n");
}

需要在game.h声明这个函数的存在,不然在text.c用不了。
game.h

void printmenu();

四、开始游戏

当玩家输入数字1,则开始游戏,因此需要在text.c定义一个 playgame() 函数来实现井字棋游戏。playgame()的完整函数将在最后面展示。

void playgame()
{
	
}

1.创建二维数组

在playgame函数内定义一个二维数组,用于存储井字棋的棋子信息。如电脑为 字符‘X’ 玩家为 字符‘O’。
text.c > playgame()函数内

char table[ROW][COL]={0};//创建一个3行3列的二维数组

2.初始化棋盘

定义一个函数 inittable() 初始化棋盘,将来玩完一盘井字棋后需要清空存储的棋子信息,初始化是十分必要的。然后在playgame函数内传table这个二维数组作为参数。

函数实现:
game.c

void inittable(char table[ROW][COL]) //初始化棋盘
{
	for (int i = 0; i < ROW; i++)
	{
		for (int j = 0; j < COL; j++)
		{
			table[i][j] = ' '; //将信息置为空
		}
	}
}

函数声明:
game.h

void printmenu();//打印菜单 

3.打印棋盘

棋盘的展示也是必不可少的,因此定义一个函数printtable() 用于打印棋盘。利用 ‘ - ’ 以及 ‘ | ’ 打印一个简易的棋盘。
在这里插入图片描述
井字棋可看成
第一行: 空格 棋子 空格 | 空格 棋子 空格 | 空格 棋子 空格

第二行: 横杠 横杠 横杠 | 横杠 横杠 横杠 | 横杠 横杠 横杠

第三行: 空格 棋子 空格 | 空格 棋子 空格 | 空格 棋子 空格

第四行: 横杠 横杠 横杠 | 横杠 横杠 横杠 | 横杠 横杠 横杠

第五行: 空格 棋子 空格 | 空格 棋子 空格 | 空格 棋子 空格

棋子则对应棋盘table内存储的棋子信息。
函数实现:
game.c

//打印棋盘
void printtable(char table[ROW][COL])
{
	
	for (int i = 0; i < ROW; i++)
	{
		//打印空格 棋子 空格 | 空格 棋子 空格 | 空格 棋子 空格
		for (int j = 0; j < COL; j++)
		{
			printf(" %c ", table[i][j]);
			if (j < COL - 1)
			{
				printf("|");
			}		
		}
		printf("\n");
		
		//打印 横杠 横杠 横杠 | 横杠 横杠 横杠 | 横杠 横杠 横杠
		if (i < ROW - 1)
		{
			for (int j = 0; j < COL; j++)
			{
				printf("---");
				if (j < COL - 1)
				{
					printf("|");
				}
			}
		}
		printf("\n");
	}
}

函数声明:
game.h

void printtable(char table[ROW][COL]);//打印棋盘

4.玩家下棋

当有了棋盘后,玩家就可以开始下棋了。定义函数 player() 接收玩家输入的想下棋的位置 即第几行,第几列。如果这个位置在棋盘table中对应的下标元素为空,这将这个元素置为字符‘O’。如玩家输入第二行第二列,对应table二维数组下标为[1] [1]。

函数实现:
game.c

//玩家下棋
void player(char table[ROW][COL])
{
	printf("玩家(O)走>>>> (输入: 行 空格 列 ) \n");
	int row = 0;
	int col = 0;
	int k = 0;
	while (1)
	{
		scanf("%d %d", &row,&col);
		if (row > 0 && row <= ROW && col>0 && col<=COL && table[row - 1][col - 1] == ' ')
		{
			table[row-1][col-1] = 'O';
			break;
		}
		else
		{
			printf("输入错误,请重试\n");
			continue;
		}
	}
}

函数声明:
game.h

void computer(char table[ROW][COL]);//电脑下棋

5.电脑下棋

玩家下完棋后,就到电脑下棋了。这里运用随机数代替电脑下棋算法。
首先在主函数设置随机数起点。

int main()
{
	srand((unsigned int)time(NULL));
	return 0;
}

定义computer() 函数,然后使用rand()函数 随机生成第row行,第col列,如果这个位置在棋盘table中对应的下标元素为空,这将这个元素置为字符‘X’。

函数实现:
game.c

//电脑下棋
void computer(char table[ROW][COL])
{
	printf("电脑(X)走>>>>\n");
	while (1)
	{
		int col = rand() % COL;
		int row = rand() % ROW;
		if (table[row][col] != ' ')
		{
			continue;
		}
		else
		{
			table[row][col] = 'X';
			break;
		}
	}
	Sleep(500);
}

函数声明:
game.h

void computer(char table[ROW][COL]);//电脑下棋

6.判断游戏是否结束

当双方有一方下棋时,应该实时检查游戏是否结束,如电脑胜利,玩家胜利还是平局,不然游戏将无止境。因此定义函数check() 检测是否游戏结束,定义iswin() 检测是胜利还是失败还是平局还是继续游戏。

check() 函数如何判断一方的胜利呢?其实只需要分别检测井字棋的三行三列以及两个斜线八条连线 对应的三个元素是否相同,如果相同,返回对应元素的字符,如返回‘O’ 则知道是玩家赢了。如果八条连线对应的元素没有三个都相同,且已经没有空位了,返回字符‘P’表示平局。如果还有空格则返回字符‘C’表示游戏继续。
接着通过iswin() 函数打印游戏结束后是谁赢的信息,并退出游戏循环。游戏结束返回1,没有结束返回0。
函数实现
game.c

//检测是否游戏结束
char check(char table[ROW][COL])
{
	int i = 0;
	int j = 0;

	for (j = 0; j < COL; j++)
	{
		if (table[j][0] == table[j][1] && table[j][1] == table[j][2] && table[j][0] != 0)//判断竖
		{
			return table[j][0];
		}
	}

	for (i = 0; i < ROW; i++)
	{
		if (table[0][i] == table[1][i] && table[1][i] == table[2][i] && table[0][i] != 0)//判断横
		{
			return table[0][i];
		}
	}

	if (table[0][0] == table[1][1] && table[2][2] == table[1][1] && table[1][1] != 0)//判断斜行
	{
		return table[0][0];
	}

	if (table[0][2] == table[1][1] && table[1][1] == table[2][0] && table[1][1] != 0)//判断斜行
	{
		return table[0][2];
	}

	for (i = 0; i < ROW; i++)   //判断是否继续 不是两方胜利也不是平局 
	{
		for (j = 0; j < COL; j++)
		{
			if (table[i][j] == ' ')
			{
				return 'C';
			}
		}
	}
	return 'P'; //判断平局
}

//检测是胜利还是失败还是平局还是继续游戏。
int iswin(char table[ROW][COL])
{
	char ret = check(table);
	if (ret == 'O')
	{
		printf("恭喜你赢了!玩家胜利\n");
		return 1;
	}
	else if (ret == 'X')
	{
		printf("很遗憾你输了!电脑胜利\n");
		return 1;
	}
	else if (ret == 'P')
	{
		printf("平局!!!");
		return 1;
	}
	else
	{
		return 0;
	}
}

函数声明
game.h

//检测是否游戏结束
char check(char table[ROW][COL]);

//检测是胜利还是失败还是平局还是继续游戏
int iswin(char table[ROW][COL]);

7.playgame完整函数

有了以上的函数,就可以将它们放入游戏函数内了。

void playgame()
{
	char table[ROW][COL] = { 0 };
	inittable(table);//初始化棋盘
	printtable(table);//打印棋盘

	//进入游戏循环
	while (1)
	{			
		player(table);//玩家下棋
		system("cls");//清屏
		printtable(table);//打印棋盘
		if (iswin(table))//检测是否游戏结束
		{
			system("pause");
			system("cls");//清屏
			break;
		}

		computer(table);//电脑下棋
		system("cls");//清屏
		printtable(table);//打印棋盘
		if (iswin(table))//检测是否游戏结束
		{
			system("pause");
			system("cls");//清屏
			break;
		}
	}
}

以上就是井字棋的游戏实现的所有内容,可以参考下面的完整代码~

完整代码

game.h

#pragma once
#define _CRT_SECURE_NO_WARNINGS
#define ROW 3 //棋盘行数
#define COL 3 //棋盘列数
#include <stdio.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>

//打印菜单
void printmenu();

//初始化棋盘
void inittable(char table[ROW][COL]);

//打印棋盘
void printtable(char table[ROW][COL]);

//玩家下棋
void player(char table[ROW][COL]);

//电脑下棋
void computer(char table[ROW][COL]);

//检测是否游戏结束
char check(char table[ROW][COL]);

//检测是胜利还是失败还是平局还是继续游戏
int iswin(char table[ROW][COL]);

game.c

#include"game.h"

//打印菜单
void printmenu()
{
	printf("■■■■■■■■■■■■■■■\n");
	printf("■■■    1.开始游戏    ■■■\n");
	printf("■■■    0.退出游戏    ■■■\n");
	printf("■■■■■■■■■■■■■■■\n");
	printf("请输入数字‘0’或数字‘1’>>>\n");
}

//初始化棋盘
void inittable(char table[ROW][COL])
{
	for (int i = 0; i < ROW; i++)
	{
		for (int j = 0; j < COL; j++)
		{
			table[i][j] = ' ';
		}
	}
}

//打印棋盘
void printtable(char table[ROW][COL])
{
	for (int i = 0; i < ROW; i++)
	{
		for (int j = 0; j < COL; j++)
		{
			printf(" %c ", table[i][j]);
			if (j < COL - 1)
			{
				printf("|");
			}		
		}
		printf("\n");
		if (i < ROW - 1)
		{
			for (int j = 0; j < COL; j++)
			{
				printf("---");
				if (j < COL - 1)
				{
					printf("|");
				}
			}
		}
		printf("\n");
	}
}

//玩家下棋
void player(char table[ROW][COL])
{
	printf("玩家(O)走>>>> (输入: 行 空格 列 ) \n");
	int row = 0;
	int col = 0;
	int k = 0;
	while (1)
	{
		scanf("%d %d", &row,&col);
		if (row > 0 && row <= ROW && col>0 && col<=COL && table[row - 1][col - 1] == ' ')
		{
			table[row-1][col-1] = 'O';
			break;
		}
		else
		{
			printf("输入错误,请重试\n");
			continue;
		}
	}
}

//电脑下棋
void computer(char table[ROW][COL])
{
	printf("电脑(X)走>>>>\n");
	while (1)
	{
		int col = rand() % COL;
		int row = rand() % ROW;
		if (table[row][col] != ' ')
		{
			continue;
		}
		else
		{
			table[row][col] = 'X';
			break;
		}
	}
	Sleep(500);
}


char check(char table[ROW][COL])
{
	int i = 0;
	int j = 0;

	for (j = 0; j < COL; j++)
	{
		if (table[j][0] == table[j][1] && table[j][1] == table[j][2] && table[j][0] != 0)//判断竖
		{
			return table[j][0];
		}
	}

	for (i = 0; i < ROW; i++)
	{
		if (table[0][i] == table[1][i] && table[1][i] == table[2][i] && table[0][i] != 0)//判断横
		{
			return table[0][i];
		}
	}

	if (table[0][0] == table[1][1] && table[2][2] == table[1][1] && table[1][1] != 0)//判断斜行
	{
		return table[0][0];
	}

	if (table[0][2] == table[1][1] && table[1][1] == table[2][0] && table[1][1] != 0)//判断斜行
	{
		return table[0][2];
	}

	for (i = 0; i < ROW; i++)   //判断是否继续 不是两方胜利也不是平局 
	{
		for (j = 0; j < COL; j++)
		{
			if (table[i][j] == ' ')
			{
				return 'C';
			}
		}
	}
	return 'P'; //判断平局
}

int iswin(char table[ROW][COL])
{
	char ret = check(table);
	if (ret == 'O')
	{
		printf("恭喜你赢了!玩家胜利\n");
		return 1;
	}
	else if (ret == 'X')
	{
		printf("很遗憾你输了!电脑胜利\n");
		return 1;
	}
	else if (ret == 'P')
	{
		printf("平局!!!");
		return 1;
	}
	else
	{
		return 0;
	}
}

text.c

#include"game.h"

void playgame()
{
	char table[ROW][COL] = { 0 };
	inittable(table);//初始化棋盘
	printtable(table);//打印棋盘

	//进入游戏循环
	while (1)
	{			
		player(table);//玩家下棋
		system("cls");//清屏
		printtable(table);//打印棋盘
		if (iswin(table))//检测是否游戏结束
		{
			system("pause");
			system("cls");//清屏
			break;
		}

		computer(table);//电脑下棋
		system("cls");//清屏
		printtable(table);//打印棋盘
		if (iswin(table))//检测是否游戏结束
		{
			system("pause");
			system("cls");//清屏
			break;
		}
	}
}

int main()
{
	srand((unsigned int)time(NULL));
	int input = 0;
	do 
	{
		printmenu();//打印菜单
		scanf("%d", &input);
		switch (input)
		{
		case 0:
			printf("退出成功!\n");
			break;
		case 1:
			system("cls");
			printf("开始游戏!\n\n\n");
			playgame();
			break;
		default:
			printf("输入错误,请重试!\n");
			break;
		}
	} while (input);
	return 0;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值