打卡第十三天(井字棋游戏)

用C语言编写的“井”字游戏。

遇到的一个报错:

具体原因well_border数组本质是指针类型,指向的是首元素的地址,如果用int或char 来接收显然不合适,以至于在引用下列定义的int类型的变量时候产生错误——表达式必须包含指向对象的指针类型,但他具有类型"int",解决的办法也很简单,在传参时用数组well_border[row][line]接收。

#include "game.h"

//游戏
void game(void)
{
	char well_border[row][line] = { 0 };
	//棋盘
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < line; j++)
		{
			well_border[i][j] = ' ';
		}
	}
	printf("********************\n");
	printf("**人vs电脑输入:>1**\n");
	printf("**人vs  人输入:>2**\n");
	printf("********************\n");
	int k = 0;
	scanf_s("%d", &k);
	printf("游戏开始\n");
	//清空屏幕
	system("cls");
	border(well_border);
	//开始下棋
	if (k == 2)
	{
		int count = 0;
		while (1)
		{
			player1(well_border);
			border(well_border);
			count++;
			if (count >= 5)
			{
				if (!verdict(well_border))
				{
					break;
				}
			}
			player2(well_border);
			border(well_border);
			count++;
			if (count >= 5)
			{
				if (!verdict(well_border))
				{
					break;
				}
			}
		} 
		printf("游戏结束");
	}
	else
	{
		int count = 0;
		while (1)
		{
			player1(well_border);
			border(well_border);
			count++;
			if (count >= 5)
			{ 
				if (!verdict(well_border))
				{
					break;
				}
			}
			computer(well_border);
			border(well_border);
			count++;
			if (count >= 5)
			{
				if (!verdict(well_border))
				{
					break;
				}
			}
		} 
		printf("游戏结束");
	}
}

//棋盘
void border(char well_border[row][line])
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		for (int j = 0; j < line; j++)
		{
			printf(" %c ", well_border[i][j]);
			if (j != line - 1)
			{
				printf("|");
			}
		}
		printf("\n");
		if (i != row - 1)
		{
			for (int j = 0; j < line; j++)
			{
				printf("---");
				if (j != line - 1)
				{
					printf("+");
				}
			}
		}
		printf("\n");
	}
}

//玩家1
void player1(char well_border[row][line])
{
	while (1)
	{
		printf("玩家1请输入坐标x y\n");
		int x = 0;
		int y = 0;
		scanf_s("%d %d", &x, &y);
		if ((x >= 1 && x <= row + 1) && (y >= 1 && y <= line + 1))
		{
			if (well_border[x - 1][y - 1] == ' ')
			{
				well_border[x - 1][y - 1] = '*';
				break;
			}
			else
			{
				printf("坐标已经被占用,请重新输入\n");
			}
		}
		else
		{
			printf("输入错误");
		}
	}
}

//玩家2
void player2(char well_border[row][line])
{
	while (1)
	{
		printf("玩家2请输入坐标x y\n");
		int x = 0;
		int y = 0;
		scanf_s("%d %d", &x, &y);
		if ((x >= 1 && x <= row + 1) && (y >= 1 && y <= line + 1))
		{
			if (well_border[x - 1][y - 1] == ' ')
			{
				well_border[x - 1][y - 1] = '#';
				break;
			}
			else
			{
				printf("坐标已经被占用,请重新输入\n");
			}
		}
	}
}

//电脑
void computer(char well_border[row][line])
{
	printf("电脑正在输入坐标x y\n");
	while (1)
	{
		int x = rand() % row;
		int y = rand() % line;
		if ((x >= 0 && x <= row ) && (y >= 0 && y <= line ))
		{
			if (well_border[x][y] == ' ')
			{
				well_border[x][y] = '#';
				break;
			}
		}
	}
}

//判断输赢
int verdict(char well_border[row][line])
{
	//判断行
	for (int i = 0; i < row; i++)
	{
		if ((i + 2) < row )
		{
			if ((well_border[i][i] == well_border[i][i + 1]) && (well_border[i][i] == well_border[i][i + 2]))
			{
				return 0;
			}
		}
	}
	//判断列
	for (int i = 0; i < row; i++)
	{
		if ((i + 2) < line )
		{
			if ((well_border[i][i] == well_border[i + 1][i]) && (well_border[i][i] == well_border[i + 2][i]))
			{
				return 0;
			}
		}
	}
	//判断主斜线
	for (int i = 0; i < row; i++)
	{
		if ((i + 2) <= (line - 1))
		{
			if ((well_border[i][i] == well_border[i + 1][i + 1]) && (well_border[i][i] == well_border[i + 2][i + 2]))
			{
				return 0;
			}
		}
	}
	//判断副斜线
	if ((well_border[2][0] == well_border[1][1]) && (well_border[3][1] == well_border[0][3]))
	{
		return 0;
	}
	return 1;
}
#include "game.h"

int main()
{	
	srand((unsigned int)time(NULL));
begain:
	printf("***********************\n");
	printf("***开始游戏请输入:>1***\n");
	printf("***退出游戏请输入:>2***\n");
	printf("***********************\n");
	int start = 0;
	scanf_s("%d", &start);
	switch (start)
	{
	case 1:
	{
		game();
		break;
	}
	case 2:
	{
		printf("即将退出游戏\n");
		break;
	}
	default:
	{
		printf("输入错误,请重新输入\n");
		goto begain;
	}
	}
	return 0;
}
#pragma once

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>

#define row 3
#define line 3

void game(void);

void border(char well_border[row][line]);

void player1(char well_border[row][line]);

void player2(char well_border[row][line]);

int verdict(char well_border[row][line]);

void computer(char well_border[row][line]);
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值