C语言------三子棋

三子棋是一个很简单的游戏,用C语言实现,就是实现以下功能:

1.初始化界面(棋盘);
2.显示界面;
3.玩家和电脑交替走棋;
4.在每次走棋之后判断是否有人胜利;
5.判断棋盘是否已下满棋子。

注:此程序玩家下棋时的坐标,就是棋盘实际上显示的坐标,并不需要再进行计算,判断是从“0”还是“1”开始,即棋盘的横纵坐标的取值范围为[1,3]。

首先是各个函数的实现:
Chess.c

#include"Chess.h"

//初始化棋盘
void Init_board(char board[ROW][COL], int row, int col)
{
	memset(&board[0][0], ' ', sizeof(board[0][0])*row*col);
}

//显示棋盘
void Display_board(char board[ROW][COL], int row, int col)
{
	for (int i = 0; i<row; i++)
	{
		printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
		if (i < row - 1)
		{
			printf("---|---|---\n");

		}
	}
}

//菜单选项
void menu()
{
	printf("***************************\n");
	printf("****   Welcome Chess   ****\n");
	printf("***************************\n");
	printf("****  1.play   0.exit  ****\n");
	printf("***************************\n");
}

//玩家走棋,用'X'表示
void Player_move(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("玩家走棋,");
	while (1)
	{
		printf("请输入坐标:\n");
		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] = 'X';
				break;
			}
			else
			{
				printf("此坐标已有棋子!\n");
			}
		}
		else
		{
			printf("输入的坐标不存在!\n");
		}
	}
}

//电脑走棋,用'0'表示
void Computer_move(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] = '0';
			break;
		}
	}
}

//判断棋盘是否布满
int Check_full(char board[COL][ROW], 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;
}

//判断是否有人胜出
char Check_win(char board[ROW][COL], int row, int col)
{
	for (int i = 0; i < row; i++)
	{
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2] )
			return board[i][0];
	}
	for (int i = 0; i < col; i++)
	{
		if (board[0][i] == board[1][i] && board[1][i] == board[2][i])
			return board[0][i];
	}
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2])
	{
		return board[0][0];
	}
	if (board[2][0] == board[1][1] && board[1][1] == board[0][2])
	{
		return board[2][0];
	}
	if (Check_full(board, row, col))
		return 'f';
	else
		return ' ';
}

//游戏的逻辑
void Game()
{
	char board[ROW][COL] = { 0 };
	char ret = '0';
	Init_board(board, ROW, COL);
	Display_board(board, ROW, COL);
	while (1)
	{
		Player_move(board, ROW, COL);
		Display_board(board, ROW, COL);
		//玩家走棋后判断是否胜出
		ret = Check_win(board, ROW, COL);
		if (ret != ' ')
		{
			break;
		}
		printf("\n");
		Computer_move(board, ROW, COL);
		Display_board(board, ROW, COL);
		//电脑走棋后判断是否胜出
		ret = Check_win(board, ROW, COL);
		if (ret != ' ')
		{
			break;
		}
	}
	if (ret == 'X')
	{
		printf("厉害啊,兄弟,你赢了!\n");
		//当有人胜出时,等一秒后刷新界面
		//Sleep函数,()中是睡眠的时间,单位是ms
		Sleep(1000);
		system("cls");
	}
	else if (ret == '0')
	{
		printf("电脑赢了,再来一把吗?\n");
		Sleep(1000);
		system("cls");
	}
	else if (ret == 'f')
	{
		printf("平局!!!\n");
		Sleep(1000);
		system("cls");
	}
}

void Test()
{
	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);
}

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

然后是头文件的引用以及宏的定义:
Chess.h

#pragma once
#ifndef __Game_H__
#define __Game_H__
//避免scanf函数的警告
#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<Windows.h>

#define ROW 3
#define COL 3

void Init_board(char board[ROW][COL], int row, int col);
void Display_board(char board[ROW][COL], int row, int col);
void Player_move(char board[ROW][COL], int row, int col);
void Computer_move(char board[ROW][COL], int row, int col);
 int Check_full(char board[COL][ROW], int row, int col);
char Check_win(char board[ROW][COL], int row, int col);


#endif //__Game_H__

实现以后,测试如下:
在这里插入图片描述
在这里插入图片描述
最后的光标就是Sleep的时间,目的在于显示胜出的选手。

猜你喜欢

转载自blog.csdn.net/Hb_key/article/details/84403030