C语言--单机三子棋

本文介绍了如何使用C语言编写一个单机版三子棋游戏,玩家可以与内置的人工智障进行对战。在Linux环境下进行了测试,涵盖了玩家胜利、人工智障胜利和平局三种可能的结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

玩家通过键盘输入坐标 与 人工智障进行三子棋对战

#include "stdio.h"
#include "stdlib.h"
#include "time.h"
#include "unistd.h"
#define ROW 3
#define COL 3
//数组初始化函数
void initarr(char arr[ROW][COL], int row, int col)
{
	for(int i=0; i<row; i++)
	{
		for(int j=0; j<col; j++)
		{
			arr[i][j] = ' ';
		}
	}
}
//显示函数
void display(char arr[ROW][COL], int row, int col)
{
	for(int j=0; j<col; j++)
	{
		for(int i=0; i<row; i++)
		{
			printf(" %c ",arr[j][i]);
			if(i < row-1)
				printf("|");	
		}	
		printf("\n");
		if(j < col-1)
		{
			for(int i=0; i<row; i++)
			{
				printf("---");
				if(i < row-1)
					printf("|");	
			}
		}
		printf("\n");
	}
	
	
}
//玩家落子函数
void player(char arr[ROW][COL], int row, int col)
{
	int x,y;
	while(1)
	{
		printf("请输入X和Y坐标:\n");
		scanf("%d%d", &x, &y);
//判断坐标是否超出数组大小
		if(x>row || y>col)
			printf("输入错误,请重新输入\n");
//判断坐标位置是否为空,为空则落子	
		else if(arr[x-1][y-1] == ' ')
		{
			arr[x-1][y-1] = 'X';
			break;
		}	
//否则
		else
			printf("输入错误,请重新输入\n");
	}
	
}
//电脑落子函数
void compute(char arr[ROW][COL], int row, int col)
{
	int x,y;
	while(1)
	{
//随机创建X和Y坐标
		x=rand() % row;
		sleep(1);
		y=rand() % col;
//判断坐标是否为空,为空则落子
		if(arr[x][y] == ' ')
		{
			arr[x][y] = 'O';
			break;
		}
	}
}
//胜利判断函数
char win(char arr[ROW][COL], int row, int col)
{
//行3连 且不为空
	for(int i=0; i<ROW; i++)
	{
		if(arr[i][0]==arr[i][1] && arr[i][1]==arr[i][2] && arr[i][1]!=' ')
			return arr[i][1];
	}
//列3连 且不为空
	for(int i=0; i<COL; i++)
	{
		if(arr[0][i]==arr[1][i] && arr[1][i]==arr[2][i] && arr[1][i]!=' ')
			return arr[1][i];
	}
//左上斜往右下3连 且不为空
	if(arr[0][0]==arr[1][1] && arr[1][1]==arr[2][2] && arr[1][1]!=' ')
		return arr[1][1];
//左下斜往右上3连 且不为空
	if(arr[2][0]==arr[1][1] && arr[1][1]==arr[0][2] && arr[1][1]!=' ')
		return arr[1][1];
//否则判断是否为平局
	else
	{
//遍历棋盘,还有空则不平局
		for(int i=0; i<row; i++)
		{
			for(int j=0; j<col; j++)
			{
//判断是否还有空
				if(arr[i][j] == ' ')
				return 'N';
			}
		}
//没有空 则为平局
		return 'P';
	}
		
}
void game()
{
//创建数组
	char arr[ROW][COL] = {0};
	char ret;
//数组初始化
	initarr(arr, ROW, COL);
//清屏
	system("clear");
//显示棋盘
	display(arr, ROW, COL);
	while(1)
	{
//玩家落子
		player(arr, ROW, COL);
		system("clear");
		display(arr, ROW, COL);
//判断棋局
		ret = win(arr, ROW, COL);
		if(ret == 'X')
		{
			printf("玩家胜利!!!\n");
			break;
		}
		if(ret == 'P')
		{
			printf("平局!!!\n");
			break;
		}
//电脑落子
		compute(arr, ROW, COL);
		system("clear");
		display(arr, ROW, COL);
//判断棋局
		ret = win(arr, ROW, COL);
		if(ret == 'O')
		{
			printf("电脑胜利!!!\n");
			break;
		}
		if(ret == 'P')
		{
			printf("平局!!!\n");
			break;
		}
	}
}
//主函数
int main()
{
	int n;
	srand((unsigned int)time(NULL));
	do
	{
		printf("请输入 1 或者 0\n");
		printf("***1.开始  0.退出***\n");
		scanf("%d", &n);
		switch(n)
		{
			case 0: printf("退出游戏\n");
				break;
			case 1: printf("游戏开始\n");
				game();	
				break;
			default: break;	
		}
	}while(n);
	return 0;
}

Linux下测试
情况一:玩家胜利
在这里插入图片描述
情况二:人工智障胜利
在这里插入图片描述
情况三:平局
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值