利用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字棋的資料請關註WalkonNet其它相關文章!

推薦閱讀: