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

2022-05-14 11:52:59
目录
前言思路效果图开始的界面棋盘的样子随机打的坐标获得胜利结束程序代码test.cgame.cgame.h

前言

这里就简单发一个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输入错误,未能识别你的选择,请重新输入nn");
    			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字棋的资料请关注易采站长站其它相关文章!