【三子棋—-C语言实现】

请添加图片描述



前言

个人写的三子棋C语言实现,望交流


一、main函数所在源文件:test.c

#define _CRT_SECURE_NO_WARNINGS 1

#include "game.h"

// 三子棋

void Game(void) {

    // 用头文件的宏定义来确定棋盘大小
    char board[ROW][LINE] = {0};

    // 初始化棋盘,放在循环外
    Init(board);

    // 游戏过程放在死循环,用break跳出
    while (1) {

        // 打印棋盘
        //Print(board);
        
        //玩家下棋
        printf("玩家下棋:n");
        Player(board);

        // 打印棋盘
        Print(board);
        
        // 判定棋局
        char ret = Judge(board);
        if ('*' == ret) {
            printf("游戏结束,玩家胜利!n");
            break;
        }
        else if ('#' == ret) {
            printf("游戏结束,电脑胜利!n");
            break;
        }
        else if('=' == ret) {
            printf("游戏结束,平局!n");
            break;
        }
        else {
            printf("游戏继续!n");
        }
        
        printf("n------------------------n");
        // 电脑下棋
        printf("电脑下棋:n");
        Robot(board);

        // 打印棋盘
        Print(board);

        // 判定棋局
        ret = Judge(board);
        if ('*' == ret) {
            printf("游戏结束,玩家胜利!n");
            break;
        }
        else if ('#' == ret) {
            printf("游戏结束,电脑胜利!n");
            break;
        }
        else if ('=' == ret) {
            printf("游戏结束,平局!n");
            break;
        }
        else {
            printf("游戏继续!n");
        }

        printf("n------------------------n");
    }

}

int main() {

    srand(time(NULL));
    // 首先根据用户需要来决定是否要玩游戏或结束,且将用户的输入作为循环条件,0表示结束可以直接退出循环
    int input = 0;
    do {
        printf("请问您是否继续开始游戏(0结束/1开始)n");
        scanf("%d", &input);
        
        // switch分支来根据用户输入判别
        switch (input)
        {
        case 1:
            Game();
            break;
        case 0:
            printf("已退出n");
            break;
        default:
            printf("输入错误,请重新输入n");
            break;
        }

    } while (input);


    return 0;
}

二、游戏相关函数定义源文件:game.c

#define _CRT_SECURE_NO_WARNINGS 1
// game源文件实现函数定义

#include "game.h"

void Init(char board[ROW][LINE]) {

	int i = 0;
	int j = 0;
	for (i = 0; i < ROW; i++) {
		for (j = 0; j < LINE; j++) {
			board[i][j] = ' ';
		}
	}
}


void Print(char board[ROW][LINE]) {

	int i = 0;
	int j = 0;
	for (i = 0; i < ROW; i++) {
		for (j = 0; j < LINE; j++) {
			if (LINE - 1 == j) {
				printf("| %c |", board[i][j]);
			}
			else {
				printf("| %c ", board[i][j]);
			}
		}
		printf("n");
		for (j = 0; j < LINE; j++) {
			printf("——");
		}
		printf("n");
	}
}


void Player(char board[ROW][LINE]) {

	// 不断下棋,直到找到一个合法位置,或者已经判定到棋盘满
	while (1) {
		// 玩家输入想下棋的位置(玩家棋子:*)
		int x = 0;
		int y = 0;
		// 玩家选择坐标直接根据从0开始数
		printf("请选择您要下的位置(x y)n");

		//以%d,%d输入时,小心逗号格式必须也为英文的,对应起来
		scanf("%d %d", &x, &y);

		// 判断该位置是否合法
		if (x > 0 && y > 0 && x <= ROW && y <= LINE && ' ' == board[x - 1][y - 1]) {
			board[x - 1][y - 1] = '*';
			break;
		}
		else if ('=' == Judge(board)) {
			// 已满,退出即可,游戏函数紧接着后面就有判定
			break;
		}
		else {
			printf("该位置不合法,请重新输入n");
		}
	}
	
}


void Robot(char board[ROW][LINE]) {

	// 不断下棋,直到找到一个合法位置,或者已经判定到棋盘满
	while (1) {
		// 电脑确定下棋的位置(电脑棋子:#)
		// x、y分别为0-ROW 和 0-LINE的数字
		int x = rand() % ROW;
		int y = rand() % LINE;

		// 判断该位置是否合法(与玩家判定下标有点区别)
		if (x >= 0 && y >= 0 && x < ROW && y < LINE && ' ' == board[x][y]) {
			board[x][y] = '#';
			break;
		}
		else if('=' == Judge(board)) {
			// 已满,退出即可,游戏函数紧接着后面就有判定
			break;
		}
		else {
			printf("该位置不合法,请重新筛选n");
		}
	}
	
}

int Is_Full(char board[ROW][LINE]) {
	int i = 0;
	int j = 0;
	for (i = 0; i < ROW; i++) {
		for (j = 0; j < LINE; j++) {
			if (' ' == board[i][j]) {
				// 说明未满,直接返回0
				return 0;
			}
		}
	}
	// 否则满了返回1
	return 1;
}

// 判定函数看答案了,自己写的有问题!!!!!!!!!!!!!!!!
// 只要在一行中任意3个连续位置都有同一个棋子,则一方胜利
// 玩家胜利返回*
// 电脑胜利返回#
// 平局(棋盘满)返回=
// 继续返回+(直接在函数最外面return '+')
char Judge(char board[ROW][LINE]) {

	// 判定行
	int i = 0;
	int j = 0;
	for (i = 0; i < ROW; i++) {
		//自己写的:for (j = 0; j < LINE; j++) {
		for (j = 1; j < LINE - 1; j++) {
			// 如果一行内判定出来相邻三个棋子相同,则直接返回该棋子对应字符
			// 自己写的没有判断不为空
			if (board[i][j - 1] == board[i][j] && board[i][j] == board[i][j + 1] && board[i][j] != ' ') {
				return board[i][j];
			}
		}
	}


	// 判定列
	for (j = 0; j < LINE; j++) {
		//自己写的从0开始
		for (i = 1; i < ROW - 1; i++) {
			// 如果一列内判定出来相邻三个棋子相同,则直接返回该棋子对应字符
			// 自己写的没有判断不为空
			if (board[i - 1][j] == board[i][j] && board[i][j] == board[i + 1][j] && board[i][j] != ' ') {
				return board[i][j];
			}
		}
	}

	// 判定主对角线
	for (i = 0; i < ROW; i++) {
		//自己写的从0开始
		for (j = 1; j < LINE - 1; j++) {
			// 如果主对角线内判定出来相邻三个棋子相同,则直接返回该棋子对应字符
			// 自己写的没有判断不为空
			if (board[i - 1][j - 1] == board[i][j] && board[i][j] == board[i + 1][j + 1] && board[i][j] != ' ') {
				return board[i][j];
			}
		}
	}

	// 判定次对角线
	for (i = 0; i < ROW; i++) {
		//自己写的从0开始
		for (j = 1; j < LINE - 1; j++) {
			// 如果次对角线内判定出来相邻三个棋子相同,则直接返回该棋子对应字符
			// 自己写的没有判断不为空
			if (board[i + 1][j - 1] == board[i][j] && board[i][j] == board[i - 1][j + 1] && board[i][j] != ' ') {
				return board[i][j];
			}
		}
	}

	// 当判断是否满的函数返回1时为满,返回0时继续
	// 相当if (1 == Is_full(board))
	if (Is_Full(board)) {
		return '=';
	}
	else {
		// 判断平局
		return '+';
	}
}

三、头文件、宏定义、游戏函数等声明头文件:game.h

#pragma once
// 头文件实现声明

// //易错:宏定义后面不加分号;
#define ROW 3
#define LINE 3

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

extern void Init(char board[ROW][LINE]);

extern void Print(char board[ROW][LINE]);

extern void Player(char board[ROW][LINE]);

extern void Robot(char board[ROW][LINE]);

extern char Judge(char board[ROW][LINE]);

extern int Is_Full(char board[ROW][LINE]);

总结

这里对文章进行总结:
以上就是今天总结的内容,本文包括了所有个人写的三子棋C语言代码,分享给大家。
真💙欢迎各位给予我更好的建议,欢迎访问!!!小编创作不易,觉得有用可以一键三连哦,感谢大家。peace
希望大家一起坚持学习,共同进步。梦想一旦被付诸行动,就会变得神圣。

欢迎各位大佬批评建议,分享更好的方法!!!🙊🙊🙊

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>