一个三子棋小游戏

test.c

main函数的内容:

int main()
{
	test();
	return 0;
}

test函数为该游戏主函数,其内容为:

void test()
{      int in = 0;
srand((unsigned int)time(NULL));
	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &in);
		switch (in)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,请重新选择\n");
			break;
		}
	} while (in);
	
}

变量in为输入值;
test主体为一循环,menu函数为菜单选项。

void menu() 
{
	printf("*********************************\n");
	printf("********1.Play   0.Exit**********\n");
	printf("*********************************\n");
}

game函数为正式开始游戏。

void game()
{   
	char ret = ' ';
	//棋盘数组
	char board[ROW][COL] = { 0 };
	//初始化棋盘
	initboard(board,ROW,COL);
	//打印棋盘
	display(board, ROW, COL);
	//下棋
	while (1)
	{
		//玩家下棋
		player(board, ROW, COL);
		display(board, ROW, COL);
		ret=iswin(board, ROW, COL);
		if (ret != 'c')
			break;
		
		//电脑下棋
		computer(board, ROW, COL);
		display(board, ROW, COL);
		ret=iswin(board, ROW, COL);
		if (ret != 'c')
			break;
	}if (ret == '*')
			printf("玩家赢\n");
	else if (ret == '#')
		printf("电脑赢\n");
	else 
		printf("平局\n");
}

board数组为棋盘数据,ROW,COL为行列数。

#define ROW 3
#define COL 3

initboard为对棋盘的初始化函数,将所有位置初始化为空格。

void initboard(char b[ROW][COL], int row, int col)
{
	for (int i = 0; i < row; i++)
	{ for (int j = 0; j < col; j++)
			b[i][j] =' ';
	}
		
}

display函数完成对棋盘的打印,下为初代display函数,此时打印的棋盘并不规范。

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

以下为对display函数的优化:其输出结果为一个三子棋小游戏

void display(char b[ROW][COL], int row, int col)
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			//1.打印数据
			printf(" %c ", b[i][j]);
			if (j < col - 1)
				printf("|");

		}//2.打印分割行
		printf("\n");
		if (i < row - 1)
			for (int j = 0; j < col; j++)
			{
				//1.打印数据
				printf("---");
				if (j < col - 1)
					printf("|");

			}printf("\n");
			
	}
}

iswin函数是对游戏结果的判定函数

char iswin(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (; i < row; i++)
	{
		//三行
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
			return board[i][1];
	}
	//三列
	for (; j < row; j++)
	{
		if (board[0][j] == board[1][j] && board[0][j] == board[2][j] && board[0][j] != ' ')
			return board[0][j];
	}
	//对角线
	 if(board[0][0]== board[1][1]&& board[0][0]== board[2][2]&& board[0][0]!=' ')
		 return board[0][0];
	//平局
	/*if (1==isfull( board[ROW][COL], row,col  ) )
		return '=' ;*/
	//继续
	return 'c';
	
}

player函数为玩家落子

void player(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 > 0 && x <= row && y > 0 && y <= col)
		{
			if (board[x - 1][y - 1] == ' ')
			{
               board[x - 1][y - 1] = '*';
			   break;
			}
				
			else
				printf("该坐标被占用\n");
		}
		else
		{
			printf("坐标非法,请重新输入!\n");
		}
	}

}

computer为电脑落子

void computer(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("电脑走 >\n");
	while (1)
	{
		x = rand() % row;
		y = rand() % col;
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}
}
``
其实应该还有一个判断棋盘是否已满的函数isfull,但是编译以后会报错,暂时还未找出原因。

```c
int isfull(char board[ROW][COL], int row, int col)
{
	
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
			{return 0; }		
		}
	}
	return 1;
}

希望有大神可以告诉我bug在哪 5555.

上一篇:(转)ashx 使用Session


下一篇:378. 有序矩阵中第 K 小的元素