利用C语言实现n字棋游戏

 更新时间:2022年05月14日 08:56:43   作者:爱弹吉他的小奔同学  
本文将利用C语言编写一个n字棋游戏,和井字棋一样,不过这个游戏你可以自定义棋盘的大小。文中的示例代码讲解详细,感兴趣的小伙伴可以尝试一下

前言

这里就简单发一个n字棋游戏,和井字棋一样,不过这个游戏你可以自定义棋盘的大小。

井字棋是3×3大小,满足三个平齐就获得胜利。

小奔写的这个游戏,你可以自定义为10×10大小,满足6个平齐就获得胜利,都是可以随便定义的。

如果感兴趣的话就可以来尝试一下,或许你可以找到一些bug

(至于为什么说它是“人工智障”呢?因为它是随机下的,并不会去针对你,它很有自己的想法,不过有一次小奔测试的时候,没有注意到,就被它反杀了……)

思路

  • 用#define定义的标识符常量来确定n字棋的大小和n字棋获胜的条件
  • 打印一个开始面板
  • 选择是否开始游戏
  • 开始游戏
  • 根据#define定义的标识符常量来创建二维数组
  • 把二维数组初始化为空格
  • 打印一个n字棋的面板
  • 游戏者输入坐标
  • 判断游戏者输入的坐标是否已输入,已输入就重新输入
  • 未输入的话,把O记录到数组里选择的坐标上
  • 判断游戏者是否获得胜利,胜利结束游戏
  • 判断是否填满了表格,填满就平局
  • 电脑根据随机值输入坐标
  • 判断电脑输入的坐标是否已输入,已输入就重新输入
  • 未输入的话,把X记录到数组里选择的坐标上
  • 判断电脑是否获得胜利,胜利结束游戏
  • 判断是否填满了表格,填满就平局
  • 回到步骤7,不断循环,直到某方获胜或者平局
  • 结束后输入1重新开始游戏,输入0结束游戏

你看懂了吗?

效果图

这里的自定义的是10×10大小的,胜利条件是大于等于5,游戏方使用的是大写O

开始的界面

棋盘的样子

随机打的坐标

获得胜利

结束程序

怎么样,感觉还不错吧,还不快去支持一下小奔

代码

创建了两个.c文件test.c和game.c,一个头文件game.h

test.c

#define _CRT_SECURE_NO_WARNINGS
#include"game.h"

int main()
{
	int num = 1;
	
	srand((unsigned int)time(NULL));
	
  do
  {
		if (num == 1)
		{
			//打印一个开始面板
			playboard();
		}

		printf("输入1则进行游戏,输入0则结束程序\n");

		//输入选择
		num = choose();

		//通过输入的选择来判断是否进行游戏
	switch (num)
	{
		case 1://开始游戏
		{

			do
			{
				playgame();
				num = 0;

				printf("是否重新开始游戏,重新开始输入1,结束游戏输入0:>");
				scanf("%d", &num);
				if (num == 1)
					;
				else if (num == 0)
					break;
				else
					printf("输入错误,");
			} while (1);
			break;
		}
		case 0:
		{
			printf("结束程序\n");
			break;
		}
		default:
		{
			printf("\n输入错误,未能识别你的选择,请重新输入\n\n");
			break;
		}
	}
		//判断是否跳出循环
		if (num == 0)
			break;

  } while (1);

	return 0;
}

game.c

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>

#define WID 10
#define NID 10
#define SIC 5

void playboard()
{
	printf("**********************************\n");
	printf("**********************************\n");
	printf("************ 1.play **************\n");
	printf("************ 0.exit **************\n");
	printf("**********************************\n");
	printf("**********************************\n");

}

int choose()
{
	int num = 0;

	printf("请输入你的选择:>");
	scanf("%d", &num);

	return num;

}

void space(char arr[WID][NID], int x, int y)
{
	int i = 0;
	for (i = 0; i < x; i++)
	{
		int j = 0;
		for (j = 0; j < y; j++)
		{
			arr[i][j] = ' ';

		}
	}
}

board(char arr[WID][NID],int x,int y)
{
	int i = 0;
	int j = 0;
	printf("\n-");

	for (i = 0; i < x; i++)
	{
		printf("----");
	}
	printf("-\n");

	printf("0");
	for (i = 1; i <= x; i++)
	{
		printf("  %d ", i);

	}
	printf("\n");

	printf("-");

	for (i = 0; i < x; i++)
	{
		printf("----");
	}
	printf("-\n");

	for (i = 0; i < x; i++)
	{
		int k = 0;
		printf("%d", i+1);
		for (j = 0; j < y; j++)
		{
			printf("|");
			printf(" %c ", arr[i][j]);
		}
		printf("|\n");

		printf("-");

		for (k = 0; k < x; k++)
		{
			printf("----");
		}
		printf("-\n");


	}

}

void axis(int* x,int* y)
{
	scanf("%d %d", &*x, &*y);
	*x=(*x) - 1;
	*y=(*y) - 1;
}

void sure(char arr[WID][NID],int x,int y,char c)
{
	arr[x][y] = c;

}

void human_machine(int* x, int* y)
{
	*x = rand() % WID;
	*y = rand() % NID;
}

int judge(char arr[WID][NID],int x,int y)
{
	if (arr[x][y] == ' ')
		return 0;
	else
		return 1;

}

int judgesure(char arr[WID][NID], int x, int y,char siz)
{
	int count = 0;
	
		int i = 0;
		for (i = 1; i <= y; i++)
		{
				if (arr[x][y - i] == siz)
					count++;
				else
					break;
		}
		for (i = 1; i <= NID-y-1; i++)
		{
			if (arr[x][y + i] == siz)
				count++;
			else
				break;
		}
		if (count >= SIC - 1)
			return 1;

		count = 0;

		for (i = 1; i <= x; i++)
		{
			if (arr[x-i][y] == siz)
				count++;
			else
				break;
		}
		for (i = 1; i <= NID - x-1; i++)
		{
			if (arr[x+i][y ] == siz)
				count++;
			else
				break;
		}

		if (count >= SIC - 1)
			return 1;

		count = 0;

		if (WID >= NID)
		{

		
			for (i = 1; i <= y; i++)
			{
				if (arr[x - i][y - i] == siz)
					count++;
				else
					break;
			}
		
			for (i = 1; i <= NID - y - 1; i++)
			{
				if (arr[x + i][y + i] == siz)
					count++;
				else
					break;
			}


			if (count >= SIC - 1)
				return 1;

			count = 0;

			for (i = 1; i <= y; i++)
			{
				if (arr[x + i][y - i] == siz)
					count++;
				else
					break;
			}

			for (i = 1; i <= NID - y - 1; i++)
			{
				if (arr[x - i][y + i] == siz)
					count++;
				else
					break;
			}

			if (count >= SIC - 1)
				return 1;

			count = 0;
		}

		if (WID <= NID)
		{
			for (i = 1; i <= x; i++)
			{
				if (arr[x - i][y - i] == siz)
					count++;
				else
					break;
			}
	
			for (i = 1; i <= NID - x; i++)
			{
				if (arr[x + i][y + i] == siz)
					count++;
				else
					break;
			}
			//}

			if (count >= SIC - 1)
				return 1;

			count = 0;

			for (i = 1; i <= x; i++)
			{
				if (arr[x + i][y - i] == siz)
					count++;
				else
					break;
			}

			for (i = 1; i <= NID - x; i++)
			{
				if (arr[x - i][y + i] == siz)
					count++;
				else
					break;
			}

			if (count >= SIC - 1)
				return 1;

		}
			return 0;
}

int judgefill(char arr[WID][NID])
{
	int count = 0;
	int i = 0;
	int j = 0;
	for (i = 0; i < WID; i++)
	{
		int j = 0;
		for (j = 0; j < NID; j++)
		{
			if (arr[i][j] != ' ')
				count++;
		}

	}
	return WID*NID-count;
}


void playgame()
{
	//建立一个二维数组
	char arr[WID][NID];

	//把数组初始化为空格 
	space(arr,WID,NID);

	int over = 0;
	int i = 0;
	int count = 0;

	int X = 0;
	int Y = 0;
	int* P1 = &X;
	int* P2 = &Y;

	do
	{
		//打印一个n字棋的面板
		board(arr, WID, NID);

		do
		{
			printf("输入你选择的坐标:>");

			//游戏者输入坐标
			axis(P1, P2);

			//判断游戏者输入的坐标是否已输入,已输入返回1,未输入返回0
			int z = judge(arr, X, Y);

			if (z == 1)
				printf("此位置已输入,请重新");
			else
				break;
			//printf("%d %d", X, Y);
		} while (1);

		//把O记录坐标到数组上
		sure(arr, X, Y, 'O');

		//判断是否获得胜利,胜利就返回1,没有胜利就返回0
		over = judgesure(arr, X, Y, 'O');

		if (over == 1)
		{
			printf("你获得胜利\n");
			board(arr, WID, NID);

			break;
		}

		//判断是否填满了表格
		if (judgefill(arr) == 0)
		{
			printf("平局");
			break;
		}
		
		do
		{
			//电脑输入坐标
			human_machine(P1, P2);

			//判断电脑输入的坐标是否已输入,已输入返回1,未输入返回0
			int z = judge(arr, X, Y);

			if (z == 0)
			{
				//把X记录坐标到数组上
				sure(arr, X, Y, 'X');
				//结束循环
				break;
			}

		} while (1);

		//判断电脑是否获得胜利,胜利就返回1,没有胜利就返回0
		over = judgesure(arr, X, Y, 'X');

		if (over == 1)
		{
			printf("电脑获得胜利\n");
			board(arr, WID, NID);

			break;
		}

		//判断是否填满了表格
		if (judgefill(arr) == 0)
		{
			printf("平局\n");
			break;
		}

	} while (1);

}

game.h

#pragma once

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

//打印一个开始面板
playboard();

//输入选择
choose();

//游戏主体
playgame();

//把数组初始化为空格 
space(arr, WID, NID);

//打印一个三子棋的面板
board(arr, WID, NID);

//游戏者输入坐标
axis(P1, P2);

//记录坐标到数组上
sure(X, Y);

以上就是利用C语言实现n字棋游戏的详细内容,更多关于C语言n字棋的资料请关注脚本之家其它相关文章!

相关文章

  • VC自定义消息响应函数postmessage用法示例

    VC自定义消息响应函数postmessage用法示例

    这篇文章主要介绍了VC自定义消息响应函数postmessage用法示例,并对比说明了postmessage与sendmessage的用法区别,需要的朋友可以参考下
    2014-10-10
  • c语言float类型小数点后位数

    c语言float类型小数点后位数

    在本篇文章里小编给大家整理了关于c语言float类型小数点后面有几位的相关知识点,需要的朋友们可以学习下。
    2020-02-02
  • C++ list-map链表与映射表的简单使用

    C++ list-map链表与映射表的简单使用

    本文主要介绍了C++ list-map链表与映射表的简单使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • C语言实现简单学生成绩管理系统项目

    C语言实现简单学生成绩管理系统项目

    这篇文章主要为大家详细介绍了C语言实现简单学生成绩管理系统项目,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • C语言 sizeof 函数详情

    C语言 sizeof 函数详情

    这篇文章主要介绍了C语言 sizeof 函数,在 C 语言中,char 字符串也是一种非常重要的数据类型,我们除了使用 sizeof 函数获取字符串长度之外,使用 sizeof 函数同样也可以完成字符串长度的获取,下面文章内容具体描述该内容,需要的朋友可以参考以下
    2021-10-10
  • C++实例讲解四种类型转换的使用

    C++实例讲解四种类型转换的使用

    在C++语言中新增了四个关键字static_cast、const_cast、reinterpret_cast和dynamic_cast。这四个关键字都是用于类型转换的,类型转换(type cast),是高级语言的一个基本语法。它被实现为一个特殊的运算符,以小括号内加上类型名来表示,接下来让我们一起来详细了解
    2022-06-06
  • C++基于EasyX框架实现飞机大战小游戏

    C++基于EasyX框架实现飞机大战小游戏

    EasyX是针对C/C++的图形库,可以帮助使用C/C++语言的程序员快速上手图形和游戏编程。本文将利用EasyX框架实现飞机大战小游戏,需要的可以参考一下
    2023-01-01
  • C语言常见的文件操作函数

    C语言常见的文件操作函数

    这篇文章主要为大家介绍了C语言文件操作函数,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • 在Visual Studio中配置C++最新版netCDF库的方法

    在Visual Studio中配置C++最新版netCDF库的方法

    本文介绍在Windows电脑的Visual Studio软件中,配置C++ 语言最新版netCDF库的方法,文中通过图文结合的形式介绍的非常详细,具有一定的参考价值,需要的朋友可以参考下
    2024-03-03
  • C语言实现打印数组以及打印注意事项说明

    C语言实现打印数组以及打印注意事项说明

    这篇文章主要介绍了C语言实现打印数组以及打印注意事项说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01

最新评论