我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

利用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字棋的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

怎么利用C语言实现井字棋小游戏

本篇内容主要讲解“怎么利用C语言实现井字棋小游戏”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么利用C语言实现井字棋小游戏”吧!推荐阅读顺序(不建议跳过)先看实现之后的界面 —— 然后看分析程
2023-06-20

C语言怎么实现井字棋游戏

今天就跟大家聊聊有关C语言怎么实现井字棋游戏,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。井字棋游戏要求在3乘3棋盘上,每行都相同或者每列都相同再或者对角线相同,则胜出.因此我们可以
2023-06-25

C语言如何实现井字棋游戏

这篇文章主要介绍了C语言如何实现井字棋游戏,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。C语言是什么C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发,使用
2023-06-14

怎么利用C语言实现AI五子棋游戏

本篇内容介绍了“怎么利用C语言实现AI五子棋游戏”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!目录一.如何实现二.实现代码及分析(1)菜单的
2023-06-20

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录