三子棋的进阶玩法

Posted 流浪孤儿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了三子棋的进阶玩法相关的知识,希望对你有一定的参考价值。

五子棋

九子棋!

//本程序可以实现3到9字棋的游戏功能比如5字棋,连着的五个棋子便算赢

//首先建立一个工程,工程包含这三个文件

//

//text.c文件中

#include"game.h"

//测试游戏的逻辑
int main()
{
    srand((unsigned int) time(NULL));
    int input = 1;
    do
    {
        menu();
        printf("输入1进入游戏或者输入0退出游戏\\n");
        scanf("%d", &input);
        switch (input)
        {
            case 1:
                game();
                break;
            case 0:
                break;
            default:
                break;
        }
    } while (input);
    
    return 0;
}

 

//game.c文件中

#include"game.h"


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



void player(char arr[][WIDE], int len, int wide)
{
	int x = -1;
	int y = -1;
	do
	{
		printf("请输入你要下子的坐标如11Enter键:\\n");
		scanf("%d", &x);//优化输入
		//清除缓冲区
		char tmp = 0;
		while (tmp != '\\n')
		{
			tmp = getchar();
		}
		y = x % 10;
		x = x / 10;
		if (x > len || x < 1 || y > len || y < 1)
		{
			printf("坐标输入错误请重新输入:\\n");
		}
		if (arr[x-1][y-1] != ' ')
		{
			printf("不可以毁棋!!!请重新输入:");
		}
	} while (x > len || x < 1 || y > len || y < 1|| arr[x-1][y-1] != ' ');
	arr[x - 1][y - 1] = '*';
	printf("玩家落子:\\n");
	initboard(arr, LENGTH, WIDE);
}




void computer(char arr[][WIDE], int len, int wide)
{
	int x = -1;
	int y = -1;
	while (1)
	{
		x = rand() % len;
		y = rand() % wide;
		if (arr[x][y] == ' ')
		{
			arr[x][y] = 'X';
			break;
		}
	}
	printf("电脑落子:\\n");
	initboard(arr, LENGTH, WIDE);
}



char textwin(char arr[][WIDE], int len, int wide)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < len; i++)
	{
		j = 0;
		while (j+1 < wide)
		{
			if ((arr[i][j] == arr[i][j + 1]) && (arr[i][0] != ' '))
			{
				j++;
			}
			else
				break;
		}
		if (j == wide - 1)return arr[i][0];
	}
	for ( j= 0;  j< wide; j++)
	{
		i = 0;
		while (i + 1 < len)
		{
			if ((arr[i][j] == arr[i+1][j]) && (arr[0][j] != ' '))
			{
				i++;
			}
			else
				break;
		}
		if (i == len - 1)return arr[0][j];
	}
	for (i = 0; i+1 < len; )
	{
		if ((arr[i][i] == arr[i+1][i + 1]) && (arr[0][0] != ' '))
		{
			i++;
		}
		else
			break;
	}
	if (i + 1 == len)return arr[0][0];
	for (j = 0; j + 1 < wide; )
	{
		if ((arr[wide-1-j][j] == arr[wide - 1 - j -1][j + 1]) &&( arr[0][wide-1] != ' '))
		{
			j++;
		}
		else
			break;
	}
	if (j + 1 == wide)return arr[0][wide-1];
	for (i = 0; i < len; i++)
	{
		for (j = 0; j < wide; j++)
		{
			if (arr[i][j] == ' ')return 'c';
		}
	}
	return 'o';
}




void initarr(char arr[][WIDE], int len, int wide)
{
	int i = 0;
	int j = 0;
	//初始化数组
	for (i = 0; i < len; i++)
	{
		for (j = 0; j < wide; j++)
		{
			arr[i][j] = ' ';
		}
	}
}




void initboard(char arr[LENGTH][WIDE], int len,int wide)
{
	int i = 0;
	int j = 0;
	//初始化棋盘
	for (i = 0; i <len; i++)
	{
		for (j = 0; j < wide; j++)
		{
			if (j == wide - 1)
			{
				printf(" %c ",arr[i][j]);
			}
			else
			{
				printf(" %c |",arr[i][j]);
			}
		}
		printf("\\n");

		if (i != len - 1)
		{
			for (j = 0; j < wide; j++)
			{
				if (j != wide - 1)
				{
					printf("---|");
				}
				else
					printf("---");
			}
		}
		
		printf("\\n");
	}
}




int result(char arr[LENGTH][WIDE], int len, int wide)
{
	if (textwin(arr, LENGTH, WIDE) == '*')
	{
		printf("恭喜你赢了!");
	}
	else if (textwin(arr, LENGTH, WIDE) == 'X')
	{
		printf("很遗憾你输了了!");
	}
	else if (textwin(arr, LENGTH, WIDE) == 'o')
	{
		printf("这局为平局!");
	}
	else
		return 1;
	return 0;
}



void game()
{
	char arr[LENGTH][WIDE] = { 0 };
	initarr(arr, LENGTH, WIDE);
	initboard(arr, LENGTH, WIDE);
	while (1)
	{
		player(arr,LENGTH,WIDE);
		if (result(arr, LENGTH, WIDE) == 0)break;
		computer(arr, LENGTH, WIDE);
		if (result(arr, LENGTH, WIDE) == 0)break;

	}
}

game.h文件中

#define _CRT_SECURE_NO_WARNINGS 1
//包含的头文件
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>


//定义标识符常量
#define LENGTH	3  //棋盘长度
#define WIDE    3  //棋盘宽度
//因为时间有限目前只适用于3到9字棋

//函数声明
void menu();//开始打印游戏菜单

void player(char arr[LENGTH][WIDE], int len, int  wide);//玩家下棋
void computer(char arr[LENGTH][WIDE], int len, int  wide);//电脑下棋

void initboard(char arr[LENGTH][WIDE], int len, int  wide);//初始化游戏棋盘

void initarr(char arr[][WIDE], int len, int wide);//初始化数组

char textwin(char arr[][WIDE], int len, int wide);//检测游戏进程
//返回 '* '则玩家赢
//返回‘X’则电脑赢
//返回 'c' 则游戏继续
//返回 'o' 则游戏平局


int result(char arr[][WIDE], int len, int wide);//对textwin结果进行处理

void game();//游戏主体

 

以上是关于三子棋的进阶玩法的主要内容,如果未能解决你的问题,请参考以下文章

这个三子棋,输了就要接受惩罚哦!

数组游戏——三子棋

C语言的三子棋

三子棋的实现

三子棋的实现,人工智能与人工智障

(C语言篇)三子棋的实现