当前位置:主页 > 软件编程 > C代码 >

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

时间:2022-10-02 12:53:00 | 栏目:C代码 | 点击:

前言

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

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

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

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

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

思路

你看懂了吗?

效果图

这里的自定义的是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);

您可能感兴趣的文章:

相关文章