【项目实战1】五子棋游戏

发布于:2025-02-10 ⋅ 阅读:(37) ⋅ 点赞:(0)

目录

C语言编程实现五子棋::

game.h

game.c

                        1.打印菜单

                        2.打印棋盘

                        3.玩家下棋

                        4.判断五子连珠

                        5.判断输赢

                        6.游戏运行

game.c完整源代码展示

test.c


C语言编程实现五子棋::

game.h

#pragma once
#include<stdio.h>
#include<stdlib.h>
#define ROW 20
#define COL 20
#define PLAYER1 1
#define PLAYER2 2
#define NEXT 0
#define PLAYER1_WIN 1
#define PLAYER2_WIN 2
#define DRAW 3 
enum Dir
{
	LEFT,
	RIGHT,
	UP,
	DOWN,
	LEFT_UP,
	LEFT_DOWN,
	RIGHT_UP,
	RIGHT_DOWN
};
void Menu();
void Game();

game.c

1.打印菜单

void Menu()
{
	printf("#############################\n");
	printf("#######   五子棋游戏   ######\n");
	printf("#######1.Play    0.Exit######\n");
	printf("#############################\n");
	printf("#############################\n");
	printf("Please Select:");
}

2.打印棋盘

void ShowBoard(int board[ROW][COL], int row, int col)
{
	//清屏
	system("cls");
	printf("  ");
	int i = 1;
	for (i = 1;i <= col;i++)
	{
		printf("%3d", i);
	}
	printf("\n");
	for (i = 0;i < row;i++)
	{
		int j = 0;
		printf("%2d ", i + 1);
		for (j = 0;j < col;j++)
		{
			if (board[i][j] == 0)
			{
				printf(" . ");
			}
			else if (board[i][j] == PLAYER1)
			{
				printf(" # ");
			}
			else
			{
				printf(" o ");

			}
		}
		printf("\n");
	}
}

3.玩家下棋

void PlayerMove(int board[ROW][COL], int row, int col, int who)
{
	
	while (1)
	{
		printf("Player[%d] Please Enter your Pos:", who);
		scanf("%d %d", &x, &y);
		if (x < 1 || x > row || y < 1 || y > col)
		{
			printf("输入坐标不合法!\n");
			continue;
		}
		else if (board[x - 1][y - 1] != 0)
		{
			printf("Pos Is Occupied!\n");
			continue;
		}
		else
		{
			board[x - 1][y - 1] = who;
			break;
		}
	}
}

4.判断五子连珠

int ChessCount(int board[ROW][COL], int row, int col,enum Dir d)
{
	int _x = x - 1;
	int _y = y - 1;
	int count = 0;
	while (1)
	{
		switch (d)
		{
		case LEFT:
			_y--;
			break;
		case RIGHT:
			_y++;
			break;
		case UP:
			_x--;
			break;
		case DOWN:
			_x++;
			break;
		case LEFT_UP:
			_x--;
			_y--;
			break;
		case LEFT_DOWN:
			_x++;
			_y--;
			break;
		case RIGHT_UP:
			_x--;
			_y++;
			break;
		case RIGHT_DOWN:
			_x++;
			_y++;
			break;
		default:
			//Do Nothing
			break;
		}
		//不合法
		if (_x < 0 || _x > row - 1 || _y < 0 || _y > col - 1)
		{
			break;
		}
		//合法
		if (board[x - 1][y - 1] == board[_x][_y])
		{
			count++;
		}
		else
		{
			break;
		}
	}
	return count;
}

5.判断输赢

int IsWin(int board[ROW][COL], int row, int col)
{
	//在当前位置(x,y)处
	int count1 = ChessCount(board, row, col, LEFT) + ChessCount(board, row, col, RIGHT) + 1;
	int count2 = ChessCount(board, row, col, UP) + ChessCount(board, row, col, DOWN) + 1;
	int count3 = ChessCount(board, row, col, LEFT_UP) + ChessCount(board, row, col, RIGHT_DOWN) + 1;
	int count4 = ChessCount(board, row, col, LEFT_DOWN) + ChessCount(board, row, col, RIGHT_UP)+ 1;
	if (count1 >= 5 || count2 >= 5 || count3 >= 5 || count4 >= 5)
	{
		if (board[x - 1][y - 1] == PLAYER1)
		{
			return PLAYER1_WIN;
		}
		else
		{
			return PLAYER2_WIN;
		}
	}
	int i = 0;
	for (i = 0;i < row;i++)
	{
		int j = 0;
		for (j = 0;i < col;j++)
		{
			if (board[i][j] == 0)
			{
				return NEXT;
			}
		}
	}
	return DRAW;
}

6.游戏运行

void Game()
{
	int board[ROW][COL];
	memset(board, 0, sizeof(board));
	int result = NEXT;
	do
	{
		ShowBoard(board, ROW, COL);
		PlayerMove(board, ROW, COL, PLAYER1);
		result = IsWin(board, ROW, COL);
		ShowBoard(board, ROW, COL);
		if (NEXT != result)
		{
			break;
		}
		ShowBoard(board, ROW, COL);
		PlayerMove(board, ROW, COL, PLAYER2);
		result = IsWin(board, ROW, COL);
		if (NEXT != result)
		{
			break;
		}
	} while (1);
	//用户1赢 用户2赢 平局
	switch (result)
	{
	case PLAYER1_WIN:
		printf("恭喜用户1,你已经赢了!\n");
		break;
	case PLAYER2_WIN:
		printf("恭喜用户2,你已经赢了!\n");
		break;
	case DRAW:
		printf("平局,和气生财!\n");
		break;
	default:
		break;
	}
	system("pause");
	ShowBoard(board, ROW, COL);
}

game.c完整源代码展示:

#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
int x = 0;
int y = 0;
void Menu()
{
	printf("#############################\n");
	printf("#######   五子棋游戏   ######\n");
	printf("#######1.Play    0.Exit######\n");
	printf("#############################\n");
	printf("#############################\n");
	printf("Please Select:");
}
//按照(x,y)作为起点,按照特定的方向,求连续相对的最大个数
int ChessCount(int board[ROW][COL], int row, int col,enum Dir d)
{
	int _x = x - 1;
	int _y = y - 1;
	int count = 0;
	while (1)
	{
		switch (d)
		{
		case LEFT:
			_y--;
			break;
		case RIGHT:
			_y++;
			break;
		case UP:
			_x--;
			break;
		case DOWN:
			_x++;
			break;
		case LEFT_UP:
			_x--;
			_y--;
			break;
		case LEFT_DOWN:
			_x++;
			_y--;
			break;
		case RIGHT_UP:
			_x--;
			_y++;
			break;
		case RIGHT_DOWN:
			_x++;
			_y++;
			break;
		default:
			//Do Nothing
			break;
		}
		//不合法
		if (_x < 0 || _x > row - 1 || _y < 0 || _y > col - 1)
		{
			break;
		}
		//合法
		if (board[x - 1][y - 1] == board[_x][_y])
		{
			count++;
		}
		else
		{
			break;
		}
	}
	return count;
}
//4种返回值 NEXT:继续 PLAYER1_WIN:用户1赢 PLAYER2_WIN:用户2赢 DRAW:平局
int IsWin(int board[ROW][COL], int row, int col)
{
	//在当前位置(x,y)处
	int count1 = ChessCount(board, row, col, LEFT) + ChessCount(board, row, col, RIGHT) + 1;
	int count2 = ChessCount(board, row, col, UP) + ChessCount(board, row, col, DOWN) + 1;
	int count3 = ChessCount(board, row, col, LEFT_UP) + ChessCount(board, row, col, RIGHT_DOWN) + 1;
	int count4 = ChessCount(board, row, col, LEFT_DOWN) + ChessCount(board, row, col, RIGHT_UP)+ 1;
	if (count1 >= 5 || count2 >= 5 || count3 >= 5 || count4 >= 5)
	{
		if (board[x - 1][y - 1] == PLAYER1)
		{
			return PLAYER1_WIN;
		}
		else
		{
			return PLAYER2_WIN;
		}
	}
	int i = 0;
	for (i = 0;i < row;i++)
	{
		int j = 0;
		for (j = 0;i < col;j++)
		{
			if (board[i][j] == 0)
			{
				return NEXT;
			}
		}
	}
	return DRAW;
}
void ShowBoard(int board[ROW][COL], int row, int col)
{
	//清屏
	system("cls");
	printf("  ");
	int i = 1;
	for (i = 1;i <= col;i++)
	{
		printf("%3d", i);
	}
	printf("\n");
	for (i = 0;i < row;i++)
	{
		int j = 0;
		printf("%2d ", i + 1);
		for (j = 0;j < col;j++)
		{
			if (board[i][j] == 0)
			{
				printf(" . ");
			}
			else if (board[i][j] == PLAYER1)
			{
				printf(" # ");
			}
			else
			{
				printf(" o ");

			}
		}
		printf("\n");
	}
}
void PlayerMove(int board[ROW][COL], int row, int col, int who)
{
	
	while (1)
	{
		printf("Player[%d] Please Enter your Pos:", who);
		scanf("%d %d", &x, &y);
		if (x < 1 || x > row || y < 1 || y > col)
		{
			printf("输入坐标不合法!\n");
			continue;
		}
		else if (board[x - 1][y - 1] != 0)
		{
			printf("Pos Is Occupied!\n");
			continue;
		}
		else
		{
			board[x - 1][y - 1] = who;
			break;
		}
	}
}
void Game()
{
	int board[ROW][COL];
	memset(board, 0, sizeof(board));
	int result = NEXT;
	do
	{
		ShowBoard(board, ROW, COL);
		PlayerMove(board, ROW, COL, PLAYER1);
		result = IsWin(board, ROW, COL);
		ShowBoard(board, ROW, COL);
		if (NEXT != result)
		{
			break;
		}
		ShowBoard(board, ROW, COL);
		PlayerMove(board, ROW, COL, PLAYER2);
		result = IsWin(board, ROW, COL);
		if (NEXT != result)
		{
			break;
		}
	} while (1);
	//用户1赢 用户2赢 平局
	switch (result)
	{
	case PLAYER1_WIN:
		printf("恭喜用户1,你已经赢了!\n");
		break;
	case PLAYER2_WIN:
		printf("恭喜用户2,你已经赢了!\n");
		break;
	case DRAW:
		printf("平局,和气生财!\n");
		break;
	default:
		break;
	}
	system("pause");
	ShowBoard(board, ROW, COL);
}

test.c

#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
int main()
{
	int select = 0;
	int quit = 0;
	while (quit == 0)
	{
		Menu();
		scanf("%d", &select);
		switch (select)
		{
		case 1:
			Game();
			break;
		case 0:
			quit = 1;
			printf("游戏结束\n");
			break;
		default:
			printf("输入错误,请重新输入!\n");
			break;
		}
	}
	return 0;
}