简单三子棋(C语言)

界面设置

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

棋盘设置

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

判断是否连成一条线
四个方向

整体代码
game.h

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define Row 3
#define Col 3
void Initboard(char board[Row][Col],int row,int col);
void Displayboard(char board[Row][Col], int row, int col);
void Computermove(char board[Row][Col],int row,int col);
void Playermove(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);

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] = ' ';
  }
 }
// memset(&board[0][0], ' ', row*col*sizeof(board[0][0]));//方法同样可行
}
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 Computermove(char board[Row][Col], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("电脑走>\n");
	while (1)
	{
		int x = rand() % row;
		int y = rand() % col;

		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}

	}
}
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 <= row&&y >= 1 && y <= col)
	{
		if (board[x - 1][y - 1] == ' ')
		{
			board[x - 1][y - 1] = '*';
			break;
		}
		else
		{
			printf("坐标被占用,请重新输入。\n");
		}
	}
	else
		printf("输入错误,请重新输入!\n");
	}	
}
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];
		}
	}
	for (i = 0; i < col; i++)
	{
		if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
		{
			return board[0][i];
		}
	}
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')
	{
		return board[0][0];
	}
	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))
	{
		return 'Q';
	}
	return 'C';
}
int Isfull(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;
}

text.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()
{
	int choice = 0;
	char ret = 0;
	char board[Row][Col] = { 0 };
	Initboard(board, Row, Col);
	Displayboard(board, Row, Col);
	do
	{
		printf("选择1.玩家先手 2.电脑先手 >");
		scanf("%d", &choice);
		if (choice == 1 || choice == 2)
			break;
		else
			printf("输入错误,请重新输入选择!");
	} while (1);
	while (choice==1)
	{
        Playermove(board,Row,Col);
		ret = Iswin(board, Row, Col);
		if (ret != 'C')
			break;
		Displayboard(board, Row, Col);
		Computermove(board,Row,Col);
		ret=Iswin(board,Row,Col);
		if (ret != 'C')
			break;
		Displayboard(board, Row, Col);
		
	}
	while (choice == 2)
	{
		Computermove(board, Row, Col);
		ret = Iswin(board, Row, Col);
		if (ret != 'C')
			break;
		Displayboard(board, Row, Col);
		Playermove(board, Row, Col);
		ret = Iswin(board, Row, Col);
		if (ret != 'C')
			break;
		Displayboard(board, Row, Col);
	}

	if (ret == '#')
	{
		printf("电脑赢\n");
	}
	else if (ret == '*')
	{
		printf("玩家赢\n");
	}
	else if (ret == 'Q')
	{
		printf("平局\n");
	}
	Displayboard(board, Row, Col);
}
int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误,请重新输入!\n");
			break;
		}
	} while (input);
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在MATLAB中,NURBS(非均匀有理B样条)是一种强大的数学工具,用于表示和处理复杂的曲线和曲面。NURBS在计算机图形学、CAD(计算机辅助设计)、CAM(计算机辅助制造)等领域有着广泛的应用。下面将详细探讨MATLAB中NURBS的绘制方法以及相关知识点。 我们需要理解NURBS的基本概念。NURBS是B样条(B-Spline)的一种扩展,其特殊之处在于引入了权重因子,使得曲线和曲面可以在不均匀的参数空间中进行平滑插值。这种灵活性使得NURBS在处理非均匀数据时尤为有效。 在MATLAB中,可以使用`nurbs`函数创建NURBS对象,它接受控制点、权值、 knot向量等参数。控制点定义了NURBS曲线的基本形状,而knot向量决定了曲线的平滑度和分布。权值则影响曲线通过控制点的方式,大的权值会使曲线更靠近该点。 例如,我们可以使用以下代码创建一个简单的NURBS曲线: ```matlab % 定义控制点 controlPoints = [1 1; 2 2; 3 1; 4 2]; % 定义knot向量 knotVector = [0 0 0 1 1 1]; % 定义权值(默认为1,如果未指定) weights = ones(size(controlPoints,1),1); % 创建NURBS对象 nurbsObj = nurbs(controlPoints, weights, knotVector); ``` 然后,我们可以用`plot`函数来绘制NURBS曲线: ```matlab plot(nurbsObj); grid on; ``` `data_example.mat`可能包含了一个示例的NURBS数据集,其中可能包含了控制点坐标、权值和knot向量。我们可以通过加载这个数据文件来进一步研究NURBS的绘制: ```matlab load('data_example.mat'); % 加载数据 nurbsData = struct2cell(data_example); % 转换为cell数组 % 解析数据 controlPoints = nurbsData{1}; weights = nurbsData{2}; knotVector = nurbsData{3}; % 创建并绘制NURBS曲线 nurbsObj = nurbs(controlPoints, weights, knotVector); plot(nurbsObj); grid on; ``` MATLAB还提供了其他与NURBS相关的函数,如`evalnurbs`用于评估NURBS曲线上的点,`isoparm`用于生成NURBS曲面上的等参线,以及`isocurve`用于在NURBS曲面上提取特定参数值的曲线。这些工具对于分析和操作NURBS对象非常有用。 MATLAB中的NURBS功能允许用户方便地创建、编辑和可视化复杂的曲线和曲面。通过对控制点、knot向量和权值的调整,可以精确地控制NURBS的形状和行为,从而满足各种工程和设计需求。通过深入理解和熟练掌握这些工具,可以在MATLAB环境中实现高效的NURBS建模和分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值