N字棋(c语言版(井字棋plus版))

 最后判断是否胜利的那个函数为了可以判断4,5.....字棋而写的有点冗余(毕竟实力不允许)。

 游戏中所有使用到的头文件和函数的声明

#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

//注:行必须等于列
#define ROW 3
#define LOW 3


void Menu(void);	//目录
void Game(void);	//游戏主程序
void PrintChess(char(*chess)[LOW], int row, int low);	//打印游戏棋盘
void Init(char(*chess)[LOW], int row, int low);		//初始化棋盘
void PutChess(char(*chess)[LOW], int x, int y, int est);	//est为1表示玩家行动,为0表示电脑行动
void PeoChess(char(*chess)[LOW]);//玩家行动
void CompuChess(char(*chess)[LOW]);//电脑行动
//'*'玩家胜
//'#'电脑胜
//'c'继续游戏
//'s'平局
char WinChess(char(*chess)[LOW]);//判断是否胜利

 游戏主程序

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"

int main()
{
	int a = 0;
	srand(time(NULL));	//随机数种子
	do					//游戏主循环
	{
		Menu();			//打印一个简易的菜单
		printf("请选择-> ");
		scanf("%d", &a);
		switch (a)
		{
		case 1:
			Game();		//游戏主程序
			break;
		case 0:
			printf("成功退出!\n");
			break;
		default:
			printf("非法输入!请重新输入:\n");
			break;
		}
	} while (a != 0);
	

	return 0;
}

void Game(void)
{
	char result = 0;
	char chess[ROW][LOW] = { 0 };	//存储玩家和电脑的行动记录
	Init(chess, ROW, LOW);			//初始化棋盘
	PrintChess(chess, ROW, LOW);	//打印游戏棋盘
	while (1)		//游戏主循环
	{
		PeoChess(chess);	//玩家行动
		PrintChess(chess, ROW, LOW);
		result = WinChess(chess);
		if (result != 'c')
		{
			break;
		}
		CompuChess(chess);	//电脑行动
		PrintChess(chess, ROW, LOW);
		result = WinChess(chess);
		if (result != 'c')
		{
			break;
		}
	}
	switch (result)
	{
	case '*':
		printf("玩家胜利!\n");
		break;
	case '#':
		printf("电脑胜利!\n");
		break;
	case 's':
		printf("平局!\n");
		break;
	}
}

 游戏中所有的函数实现:

#include "game.h"

void Menu(void)
{
	printf("****************************\n");
	printf("******** 1.开始游戏 ********\n");
	printf("******** 0.退出游戏 ********\n");
	printf("****************************\n");
}

void PrintChess(char(*chess)[LOW], int row, int low)
{
	for (int i = 0; i < row; i++)
	{
		//打印棋盘格子
		for (int j = 0; j < low; j++)
		{
			printf(" %c ", chess[i][j]);
			if (j < low - 1)
			{
				printf("|");
			}
		}
		printf("\n");
		//行与行之间的分割线
		if (i < row - 1)
		{
			for (int j = 0; j < low; j++)
			{
				printf("---");
				if (j < low - 1)
				{
					printf("|");
				}
			}
			printf("\n");
		}
		
	}
}

void Init(char(*chess)[LOW], int row, int low)
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < low; j++)
		{
			chess[i][j] = ' ';
		}
	}
}

void PutChess(char(*chess)[LOW], int x, int y, int est)
{
	if (est == 1)
	{
		chess[x][y] = '*';
	}
	else
	{
		chess[x][y] = '#';
	}
}

void PeoChess(char(*chess)[LOW])
{
	int x = 0;		//玩家行动输入的坐标
	int y = 0;
	printf("玩家行动:\n请输入坐标(用空格分隔):");
	while (1)
	{
		scanf("%d%d", &x, &y);
		if ((x >= 1 && x <= ROW && chess[x-1][y-1] == ' ') && (y >= 1 && y <= LOW))
		{
			PutChess(chess, x-1, y-1, 1);
			break;
		}
		else
		{
			printf("非法输入!请重新输入:");
		}
	}
}

void CompuChess(char(*chess)[LOW])
{
	printf("电脑行动:\n");
	
	int x = 0;
	int y = 0;
	while (1)
	{
		x = rand() % 3;
		y = rand() % 3;
		if ((x >= 0 && x <= ROW-1 && chess[x][y] == ' ') && (y >= 0 && y <= LOW-1))
		{
			PutChess(chess, x, y, 0);
			break;
		}
	}
}

char WinChess(char(*chess)[LOW])
{
	int comp = 0;//判断电脑胜利
	int peop = 0;//判断玩家胜利
	for (int j = 0; j < ROW; j++)//判断行胜利
	{
		comp = 0;
		peop = 0;
		for (int i = 0; i < LOW; i++)
		{
			
			if (chess[j][i] == '#')
			{
				comp++;
			}
			if (chess[j][i] == '*')
			{
				peop++;
			}
			if (comp == ROW)
			{
				return '#';
			}
			if (peop == ROW)
			{
				return '*';
			}
		}
	}
	for (int j = 0; j < LOW; j++)//判断列胜利
	{
		comp = 0;
		peop = 0;
		for (int i = 0; i < ROW; i++)
		{
			
			if (chess[i][j] == '#')
			{
				comp++;
			}
			if (chess[i][j] == '*')
			{
				peop++;
			}
			if (comp == ROW)
			{
				return '#';
			}
			if (peop == ROW)
			{
				return '*';
			}
		}
	}
	comp = 0;
	peop = 0;
	for (int j = 0; j < ROW; j++)//判断对角线胜利
	{
		if (chess[j][j] == '#')
		{
			comp++;
		}
		if (chess[j][j] == '*')
		{
			peop++;
		}
		if (comp == ROW)
		{
			return '#';
		}
		if (peop == ROW)
		{
			return '*';
		}
		
	}
	comp = 0;
	peop = 0;
	for (int j = 0, i = LOW-1; j < ROW && i >= 0; j++, i--)//判断对角线胜利
	{

		if (chess[j][i] == '#')
		{
			comp++;
		}
		if (chess[j][i] == '*')
		{
			peop++;
		}
		if (comp == ROW)
		{
			return '#';
		}
		if (peop == ROW)
		{
			return '*';
		}

	}
	for (int j = 0; j < LOW; j++)//判断是否继续游戏
	{
		for (int i = 0; i < ROW; i++)
		{
			if (chess[i][j] == ' ')
			{
				return 'c';
			}
		}
	}
	return 's';
}
//'*'玩家胜
//'#'电脑胜
//'c'继续游戏
//'s'平局

猜你喜欢

转载自blog.csdn.net/2302_76339343/article/details/130630024