三子棋游戏和扫雷游戏

目录

1、三子棋游戏:

2、扫雷游戏


1、三子棋游戏:

#define _CRT_SECURE_NO_WARNINGS 1

//三子棋小游戏
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

//宏定义棋盘大小
#define ROW 3
#define COL 3

//函数声明
void menu();//菜单函数
void game();//游戏设置函数
void display_board(char board[ROW][COL], int row, int col);//打印棋盘
void init_board(char board[ROW][COL], int row, int col);//初始化棋盘
void player_move(char board[ROW][COL], int row, int col);//玩家下棋
void computer_move(char board[ROW][COL], int row, int col);//电脑下棋
char is_win(char board[ROW][COL], int row, int col);//判断输赢

//菜单
void menu()
{
	printf("****************     欢迎来到三子棋小游戏    **************************\n");
	printf("************************     1.play    ********************************\n");
	printf("************************     0.exit    ********************************\n");
}

//打印棋盘
void display_board(char board[ROW][COL], int row, int col)
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			printf(" %c ", board[i][j]);
			if (j < col - 1)
				printf("|");
		}  
			printf("\n");
			if (i < row - 1)
			{
				for (int j = 0; j < col; j++)
				{
					printf("---");
					if (j < col - 1)
						printf("|");
				}
				printf("\n");
		}
	}
}
//初始化棋盘
void init_board(char board[ROW][COL], int row, int col)
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			board[i][j] = ' ';
		}
	}
}
//玩家下棋
void player_move(char board[ROW][COL], int row, int col)
{
	printf("请玩家下棋:\n");
	while (1)
	{
		printf("请输入你所下棋的坐标");
		int x = 0, y = 0;
		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 computer_move(char board[ROW][COL], int row, int col)
{
	printf("电脑下棋:\n");
	while (1)
	{
		int x = rand() % row;
		int y = rand() % col;
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}

}

//判断棋盘是否满了,满了返回1,否则返回0,用于判断是否平局
int is_full(char board[ROW][COL],int row, int col)
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
				return 0;
		}
	}
	return 1;
}

//判断输赢
char is_win(char board[ROW][COL], int row, int col)
{
	//横着相等
	for (int 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 (int 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[0][0]!=' ')
	{
		return board[0][0];
	}
	//右对角线相等
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
	{
		return board[1][1];
	}
	//平局
	if (is_full(board, row, col) == 1)
	{
		return 'Q';
	}
	//游戏继续
	return 'C';
}


//游戏设置
void game()
{
	//设置一个二维数组
	char board[ROW][COL]={0};
	init_board(board, ROW, COL);
	display_board(board,ROW,COL); 
	char ret=0;
	//开始下棋
	while (1)
	{
		player_move(board, ROW, COL);
		display_board(board, ROW, COL);
		ret = is_win(board, ROW, COL);
		if (ret != 'C')
			break;
		computer_move(board, ROW, COL);
		display_board(board, ROW, COL);
		ret = is_win(board, ROW, COL);
		if (ret != 'C')
			break;
	}
	//判断输赢,*=玩家赢,#=电脑赢,Q=平局,C=游戏继续
	if (ret == '*')
	{
		printf("玩家赢\n");
	}
	else if (ret == '#')
	{
		printf("电脑赢\n");
	}
	else if(ret=='Q')
	{
		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);
}

2、扫雷游戏

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
//下面两个头文件是为了srand随机数需要的
#include<stdlib.h>
#include<time.h>

//宏定义棋盘的规模,多定义两行两列,防止边界情况数组越界
//宏定义规模大小,9*9
#define ROW 9
#define COL 9
//宏定义数组大小,防止越界
#define ROWS ROW+2
#define COLS COL+2
//宏定义雷的个数
#define lei 10
//函数声明
void menu();//菜单函数
void game();//游戏设置
void set_mine(char mine[ROWS][COLS], int row, int col);//埋雷函数
void init_board(char board[ROWS][COLS], int rows, int cols, char set);//初始化数组函数
void display_board(char board[ROWS][COLS], int row, int col);//打印扫雷游戏的界面函数
int get_mine_count(char mine[ROWS][COLS], int x, int y);//寻找输入坐标周围雷的个数的函数
void fine_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);//寻找雷的函数
//函数


//菜单函数
void menu()
{
	printf("-------------------欢迎来到扫雷游戏------------------------------\n");
	printf("-------------------      1.play    ------------------------------\n");
	printf("-------------------      0.exit    ------------------------------\n");
}


//初始化数组函数
void init_board(char board[ROWS][COLS], int rows, int cols, char set)
{
	for (int i = 0; i < rows; i++)
	{
		for (int j = 0; j < cols; j++)
		{
			//将数组内的所有元素初始化为set
			board[i][j] = set;
		}
	}
}

//打印数组函数
void display_board(char board[ROWS][COLS], int row, int col)
{
	//打印列
	for(int j=0;j<=col;j++)
	{
		printf("%d ", j);
	}
	printf("\n");
	for (int i = 1; i <= row; i++)
	{
		//打印行
		printf("%d ", i);
		for (int j = 1; j <= col; j++)
		{
			//打印出游戏界面
			printf("%c ", board[i][j]);
		}
		printf("\n");

	}
	printf("\n");
}


//布雷
void set_mine(char mine[ROWS][COLS], int row, int col)
{
	int count = lei;
	while (count)
	{
		//随机数对row或col取余,如果row是9的话,取余就是0-8,对其+1后,范围就变成了1-9,就是此游戏界面需要的范围
		int x = rand() % row + 1;
		int y = rand() % col + 1;
		if (mine[x][y] == '0')
		{
			//把字符0当作没有雷,字符1当作雷
			mine[x][y] = '1';
			//卖完一个雷就减减
			count--;
		}
	}
}

//寻找坐标周围八个点的雷的个数
int get_mine_count(char mine[ROWS][COLS], int x, int y)
{
	//分别是此坐标周围的八个位置的字符,注意:此处所说的是字符,不是数字。
	//'1'-'0'=1,解释为:字符1-字符0=数字1,这是ascll码值的加减,
	//此处的意思就是八个位置的字符相加,然后减去八个字符0就可以算出八个位置埋雷的个数!
	return (mine[x - 1][y] + mine[x - 1][y - 1] + mine[x][y - 1] + mine[x + 1][y - 1]+
		    mine[x + 1][y] +mine[x + 1][y + 1] + mine[x][y + 1] + mine[x - 1][y + 1]
		)-8*'0';
}
//排雷
void fine_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	//定义win计算是否全部位置都被算完,且没有碰到雷
	int win = 0;
	//加入row和col都是9,lei是10的话,就是输入了71个坐标都没有碰到雷,就会跳出循环
	while (win<row*col-lei)
	{
		printf("请输入你要排查的坐标:\n");
		scanf("%d %d", &x, &y);
		//规定坐标范围,防止乱入的坐标
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			//判断是否这个位置被排查过,没有排查过这个坐标就进if判断
			if(show[x][y]=='*')
			{
				//判断此处坐标是否为雷,是雷就直接跳出循环
				if (mine[x][y] == '1')
				{
					printf("你被炸死了!!\n");
					printf("以下是埋雷的位置\n");
					display_board(mine, ROW, COL);
					break;
				}
				else
				{
					//通过get_mine_count函数寻找此坐标周围雷的个数
					int count = get_mine_count(mine, x, y);
					//同上面get_mine_count函数中原理相似,如果count是1的话,数字1+字符0就是字符1,
					//show数组是字符数组,得用字符1才能输入其中
					show[x][y] = count + '0';
					//打印排雷后的游戏界面
					display_board(show, ROW, COL);
					//输入一个坐标且没碰雷后就win加加
					win++;
				}
			}
			else
			{
				printf("该坐标已被排查过\n");
			}
		}
		else
		{
			printf("坐标非法,请重新输入:\n");
		}
	}
	//判断玩家是否找完所有坐标且没碰到雷
	if (win == row * col - lei)
	{
		printf("恭喜你,成功排完所有雷\n");
		printf("以下是埋雷的位置\n");
		display_board(mine, ROW, COL);
	}
}
//游戏设置
void game()
{
	//创建两个数组,分别存放雷(mine)和排雷(show)的数据
	char mine[ROWS][COLS];
	char show[ROWS][COLS];
	//初始化数组
	init_board(mine, ROWS, COLS, '0');
	init_board(show, ROWS, COLS, '*');
	//打印数组
	//display_board(mine, ROW, COL);
	//display_board(show, ROW, COL);
	//布置雷
	set_mine(mine, ROW, COL);
	//display_board(mine, ROW, COL);
	display_board(show, ROW, COL);
	//排雷
	fine_mine(mine, show, ROW, COL);
	/*display_board(show, ROW, COL);*/

}
int main()
{
	//随机数函数
	srand((unsigned int)time(NULL));
	int input = 0;
	do
	{
		menu();
		printf("请选择选项:\n");
		scanf("%d", &input);
		switch (input)
		{
		case 1:game();
			break;
		case 0:printf("游戏结束\n");
			break;
		default:printf("你输入的序号有误,请重新输入\n");
			break;
		}
	} while (input);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员X.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值