三子棋代码

//这是main.c里的代码
#define _CRT_SECURE_NO_WARNINGS
//要使用scanf这个输入函数一定要把这个放在第一行
//scanf_s是vs编译器自己提供的函数
#include"game.h"
void game()
{
	    char ret = 0;
		char aa[ROW][COLUMN] = { 0 };
		//初始化棋盘函数
		board(aa,ROW,COLUMN);
		//打印棋盘
		display_board(aa, ROW, COLUMN);
		//下棋
		while (1)
		{
			//玩家下棋
			player(aa, ROW, COLUMN);
			//打印棋盘
			display_board(aa, ROW, COLUMN);
			//输赢逻辑
			ret = logic(aa, ROW, COLUMN);
			if (ret != 'C')
			{
				return;
			}
			//电脑下棋
			computer(aa, ROW, COLUMN);
			//打印棋盘
			display_board(aa, ROW, COLUMN);
			//输赢逻辑
			ret = logic(aa, ROW, COLUMN);
			if (ret != 'C')
			{
				return;
			}
		}
}

int main()
{
		int input = 0;
		srand((unsigned int)time(NULL));
	do
	{
		interface();//界面

		printf("请选择:");
		scanf("%d",&input);
		switch (input)
		{
		case 1:
			printf("进入游戏\n");
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误\n");
			break;
		}


	} while (input);

	return 0;
}


//这是game.c里的代码
#define _CRT_SECURE_NO_WARNINGS
//要使用scanf这个输入函数一定要把这个放在第一行
//scanf_s是vs编译器自己提供的函数
#include"game.h"
//界面
void interface(void)
{
	printf("**************************\n");
	printf("******1.play  0.exit******\n");
	printf("**************************\n");
}
//初始化棋盘函数
void board(char bb[ROW][COLUMN],int row,int column)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < column; j++)
		{
			bb[i][j] = ' ';
		}
	}
}
//打印棋盘
void display_board(char bb[ROW][COLUMN], int row, int column)
{
    system("cls");
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int n = 0;
		for (n = 0; n < column; n++)
		{
			printf(" %c ",bb[i][n]);
			if (n < column - 1)
			{
				printf("|");
			}
		}
		printf("\n");
		if (i < row - 1 )
		{
			int j = 0;
			for (j = 0; j < column; j++)
			{
				printf("---");
				if (j < column - 1)
				{
					printf("|");
				}
			}
			printf("\n");
		}
	}
}

//玩家下棋
void player(char bb[ROW][COLUMN], int row, int column)
{
	printf("玩家下棋\n");

	int x = 0;
	int y = 0;
	while (1)
	{
	printf("请输入坐标:");
	scanf("%d %d", &x,&y);
	//坐标范围判断
	if (x >= 1 && x <= row && y >= 1 && y <= column)
	{
		if (bb[x - 1][y - 1] == ' ')
		{
			bb[x - 1][y - 1] = '*';
			break;
		}
		else
		{
			printf("该坐标已被占用,请重新输入坐标。\n");
		}
	}
	else
		{
			printf("坐标非法,请重新输入。\n");
		}
	}
}

//电脑下棋
void computer(char bb[ROW][COLUMN], int row, int column)
{
	printf("电脑下棋\n");

	int x = 0;
	int y = 0;

	while (1)
	{
		x = rand() % row;//0~2
		y = rand() % column;//0~2
		if (bb[x][y] == ' ')
		{
			bb[x][y] = '#';
			break;
		}
	}
}

// 输赢逻辑
char logic(char bb[ROW][COLUMN], int row, int column)
{
    int i, j;
    bool player_win = false; // 标记玩家是否获胜
    bool computer_win = false; // 标记电脑是否获胜
    bool is_full = true; // 标记棋盘是否已满

    // 行判断
    for (i = 0; i < row; i++) {
        int count_player_row = 0;
        int count_computer_row = 0;
        for (j = 0; j < column; j++) {
            if (bb[i][j] == '*') {
                count_player_row++;
            }
            if (bb[i][j] == '#') {
                count_computer_row++;
            }
            if (bb[i][j] == ' ') {
                is_full = false; // 若有空位,棋盘未满
            }
        }
        if (count_player_row == 3) {
            player_win = true;
        }
        if (count_computer_row == 3) {
            computer_win = true;
        }
    }

    // 列判断
    for (i = 0; i < column; i++) {
        int count_player_col = 0;
        int count_computer_col = 0;
        for (j = 0; j < row; j++) {
            if (bb[j][i] == '*') {
                count_player_col++;
            }
            if (bb[j][i] == '#') {
                count_computer_col++;
            }
        }
        if (count_player_col == 3) {
            player_win = true;
        }
        if (count_computer_col == 3) {
            computer_win = true;
        }
    }

    // 右斜下判断
    int count_player_diag1 = 0;
    int count_computer_diag1 = 0;
    for (i = 0; i < row; i++) {
        if (bb[i][i] == '*') {
            count_player_diag1++;
        }
        if (bb[i][i] == '#') {
            count_computer_diag1++;
        }
    }
    if (count_player_diag1 == 3) {
        player_win = true;
    }
    if (count_computer_diag1 == 3) {
        computer_win = true;
    }

    // 左斜下判断
    int count_player_diag2 = 0;
    int count_computer_diag2 = 0;
    for (i = 0; i < row; i++) {
        if (bb[i][column - 1 - i] == '*') {
            count_player_diag2++;
        }
        if (bb[i][column - 1 - i] == '#') {
            count_computer_diag2++;
        }
    }
    if (count_player_diag2 == 3) {
        player_win = true;
    }
    if (count_computer_diag2 == 3) {
        computer_win = true;
    }

    // 根据标记变量输出结果
    if (player_win) {
        printf("恭喜玩家赢得比赛!\n");
        return '*';
    }
    else if (computer_win) {
        return '#';
        printf("电脑赢了!\n");
    }
    else if (is_full) {
        printf("平局!\n");
        return 'Q';
    }
    else {
        printf("继续游戏\n");
        return 'C';
    }
}



//这是game.h里的代码
#pragma once
#include
#include
#include
#define ROW 3
#define COLUMN 3

//界面
void interface(void);
//初始化棋盘函数
void board(char bb[ROW][COLUMN], int row, int column);
//打印棋盘
void display_board(char bb[ROW][COLUMN], int row, int column); 
//玩家下棋
void player(char bb[ROW][COLUMN], int row, int column);
//电脑下棋
void computer(char bb[ROW][COLUMN], int row, int column);
//输赢逻辑
char logic(char bb[ROW][COLUMN], int row, int column);

总共有main.c,game.c和game.h三个文件的代码组成了这个三子棋

你可能感兴趣的:(算法)