小游戏三子棋

目录

1.小游戏万能套用模板

2.游戏菜单

3.游戏实现

(1).创建头文件和源文件

(2).打印棋盘 

(3).玩家下棋

(4).电脑下棋

 (5).判断输赢

4.三子棋代码(全)

(1).主函数

 (2).头文件

(3).源文件


1.小游戏万能套用模板

小游戏三子棋_第1张图片

这里运用了do while循环 、 switch语句。在do中,我们进行了游戏菜单(menu)的创建,并运用switch语句对玩家可能做出的三种选择情况进行反应,case1:进行游戏,case0:推出游戏,default:玩家选择了除0,1以外的数字。这里的0,1不是随意的制定的,在后面的while循环中,如果玩家选择了1,即可重复循环选择,如果玩家选择了0,那么就会退出循环,使程序结束。

2.游戏菜单

小游戏三子棋_第2张图片

3.游戏实现

(1).创建头文件和源文件

首先创建头文件用来声明函数,再创建一个源文件(game.h)用来声明函数

小游戏三子棋_第3张图片

其次创建源文件(game.c)用来定义函数

小游戏三子棋_第4张图片

完成后,便可以在头文件中进行函数的声明,!!注意:运用自己的头文件使用"  "。

(2).打印棋盘 

小游戏三子棋_第5张图片

三子棋是3*3的棋盘,创建一个二维数组即可满足,我们看效果图,里面除了分隔符什么都没有,我们可以利用空格来代替。为了方便以后的修改,我们可以头文件中定义两个常量

若是我们想要修改棋盘,便可以通过修改这里的数字,直接将棋盘变大或缩小。

小游戏三子棋_第6张图片

因为我们棋盘中输入的是符号,所以我们用char类型。开始时,数组内容应全为空格,在头文件(game.h)中声明,对棋盘进行初始化

 然后在源文件(game.c)中进行定义:

小游戏三子棋_第7张图片

 这样便完成了棋盘全为空格。接着便是对棋盘中的分隔符进行打印。老规矩,头文件中声明

源文件中定义:

void DisplayBoard(char board[ROW][COL], int row, int col)
{
	int j = 0;
	int i = 0;
	for (i = 0; i < row; i++)
	{
		//先打印分割行
		for (j = 0; j < col; j++)
		{
			printf(" %c ", board[i][j]);
			if (j < col - 1)
				printf("|");
		}
		printf("\n");
		//再打印分割行
		if (i < row - 1)
		{
			for (j = 0; j < col; j++)
			{
				printf("---");
				if (j < col - 1)
					printf("|");
			}
			printf("\n");
		}
	}
}

 这里一定要注意\n,如果不进行换行,打印出来会达不到预期效果。

(3).玩家下棋

 老规矩,头文件中声明

 源文件中定义

小游戏三子棋_第8张图片

这里有两种情况需注意,玩家下的位置已经被下过了,以及将棋下到棋盘外。完成后将棋盘打印一下,便可以了。

(4).电脑下棋

这里运用到了rand函数生成随机数,这还需用到srand函数进行辅助。

声明

定义

小游戏三子棋_第9张图片

 电脑下完后也需要进行打印。rand( )%行(列),生成随机的二维数组下标落子。这里还需配合srand((unsigned)time(NULL))使用。由于srand只需要使用一次便可,所以我们将他放到主函数中即可。

 (5).判断输赢

这里我们将判断条件设为:(哪种情况就返回哪种特定的值)

老规矩,声明:

 定义:

小游戏三子棋_第10张图片

4.三子棋代码(全)

(1).主函数

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"	

void menu()
{
	printf("**********************\n");
	printf("******  1.play  ******\n");
	printf("******  0.exit  ******\n");
	printf("**********************\n");

}
void game()
{
	//创建二维数组
	char board[ROW][COL];
	//开始时,数组内容应全为空格
	InitBoard(board, ROW, COL);
	DisplayBoard(board, ROW, COL);
	char ret = 0;
	//下棋
	while (1)
	{
		PlayerMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		//判断输赢
		ret = IsWin(board, ROW, COL);
		if (ret != 'C')
		{
			break;
		}
		ComputerMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		//判断输赢
		ret = IsWin(board, ROW, COL);
		if (ret != 'C')
		{
			break;
		}
	}
	if (ret == '*')
	{
		printf("玩家赢\n");
	}
	else if (ret == '#')
	{
		printf("电脑赢\n");
	}
	else
	{
		printf("平局\n");
	}
}
int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,请重新选择\n");
			break;
		}
	} while (input);
	return 0;
}

 (2).头文件

#pragma once
#include 
#include 
#include 
#define ROW 3
#define COL 3

//初始化棋盘
void InitBoard(char board[ROW][COL],int row ,int col);

//打印棋盘
void DisplayBoard(char board[ROW][COL], int row, int col);

//玩家下棋
void PlayerMove(char board[ROW][COL], int row, int col);

//电脑下棋
void ComputerMove(char board[ROW][COL], int row, int col);

//判断输赢
char IsWin(char board[ROW][COL], int row, int col);

(3).源文件

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void InitBoard(char board[ROW][COL], int row, int col)
{
	int j = 0;
	int i = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			board[i][j] = ' ';
		}
	}
}

void DisplayBoard(char board[ROW][COL], int row, int col)
{
	int j = 0;
	int i = 0;
	for (i = 0; i < row; i++)
	{
		//先打印分割行
		for (j = 0; j < col; j++)
		{
			printf(" %c ", board[i][j]);
			if (j < col - 1)
				printf("|");
		}
		printf("\n");
		//再打印分割行
		if (i < row - 1)
		{
			for (j = 0; j < col; j++)
			{
				printf("---");
				if (j < col - 1)
					printf("|");
			}
			printf("\n");
		}
	}
}

void PlayerMove(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("玩家下棋\n");
	
	while (1)
	{
		printf("请玩家输入下棋的坐标\n");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (board[x - 1][y - 1] == ' ')
			{
				board[x - 1][y - 1] = '*';
				break;
			}
			else
			{
				printf("该坐标被占有,请输入其他坐标\n");
			}
		}
		else
		{
			printf("坐标非法,请重新输入\n");
		}
	}
}

void ComputerMove(char board[ROW][COL], int row, int col)
{
	printf("电脑下棋\n");
	int x = 0;
	int y = 0;
	while(1)
	{
		x = rand() % row;
		y = rand() % col;
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}
}

 static int IsFull(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
				return 0;
		}
	}
	return 1;
}
//玩家赢--'*'
//电脑赢--'#'
//平局----'Q'
//游戏继续-'C'
char IsWin(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
		{
			return board[i][0];
		}
	}
	for (i = 0; i < col; i++)
	{
		if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
		{
			return board[0][i];
		}
	}

	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
	{
		return board[1][1];
	}
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
	{
		return board[1][1];
	}
	//判断平局
	if (IsFull(board, row, col))
	{
		return'Q';
	}
	return 'C';
}

感谢品读,希望本文能够让你有所收获! 

你可能感兴趣的:(c语言,算法,数据结构)