三子棋----C语言实现

Posted KaKaKawhi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了三子棋----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
希望大家一起坚持学习,共同进步。梦想一旦被付诸行动,就会变得神圣。

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

以上是关于三子棋----C语言实现的主要内容,如果未能解决你的问题,请参考以下文章

C语言实现三子棋(井字棋)

三子棋(C语言实现)

用C语言实现三子棋

小时候玩过的三子棋(井字棋),你还记得吗?C语言实现简单的三子棋小游戏

c语言实现三子棋

《C语言入门》三子棋C语言实现(详细版)