想过七夕?->女朋友陪你玩游戏(C)


在这里插入图片描述

想在七夕这天有一个可以陪你玩游戏的甜甜的对象吗?
学会以下三个代码,超甜女友陪你过七夕啦!

> 博主水平有限,如果发现错误,一定要及时告知作者哦 o( ̄︶ ̄)o!感谢感谢!
> 博主的码云 gitee,平常博主写的程序代码都在里面。

三子棋

七夕到了,没有女朋友怎么办?没事~ 写一个小游戏,让女朋友陪你玩三子棋~

1.展示棋盘

这部分我折腾了很久,因为展示出来的效果是实现能通过更改ROW和COL的值来展示不同大小的棋盘
只能不断的调整–观察发现最后一行不打印横线,最后一列不打印竖杠

void Displayboard(char board[ROW][COL], int row, int col)
{
	int i, j,k;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if(j<col-1)
			printf(" %c |", board[i][j]);
				if (j == col-1 )
			{
				printf(" %c \n", board[i][j]);
			}
		}
		
		for (j = 0;j<col; j++)
		{

			if (j <col-1 && i!=row-1)
			{
				printf("---|");
			}
				
		}
		if (i != row - 1)
		{
				printf("---");
			    printf("\n");
		}
				
		
	}
}

效果如下:
在这里插入图片描述
通过更改ROW和COL的值来展示不同大小的棋盘:
三子棋:
在这里插入图片描述

五子棋:
在这里插入图片描述

七子棋:
在这里插入图片描述

2. 玩家落子

注意:每次落子完要重新打印一次棋盘
当输入坐标错误或者已经有棋子的时候要进行相应的提示

void PlayerMove(char board[ROW][COL], int row, int col)//玩家落子
{
	int x, y;
	while (1)
	{
		printf("请玩家落子>");
		printf("请输入棋子行列坐标:\n");
		scanf("%d%d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (board[x - 1][y - 1] == ' ')//数组的真实下标从0开始
			{
				board[x - 1][y - 1] = '*';

			}
			else
			{
				printf("坐标被占用,请重新输入");
			}
		}
		else
			printf("输入坐标非法,请重新输入\n");
		Displayboard(board, ROW, COL);
	}
}

在这里插入图片描述

3.女朋友落子

注意:这里需要生成随机数,并且引用相应的头文件

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

	Displayboard(board, ROW, COL);	
}

生成随机数:
在这里插入图片描述
头文件:
在这里插入图片描述
效果如下
在这里插入图片描述

4.判断游戏输赢

结局共有三个:女朋友赢,你赢,平局

根据四种返回值来判段
你赢-- ‘*’
女朋友赢–’#’
平局–‘Q’
继续–‘C’

char isWin(char board[ROW][COL], int row, int col)
{
	//1.判断输赢
	int i;
	for (i = 0; i < row; i++)//判断行是否相等
	{
		if (board[i][0] == board[i][1] && board[i][0] == board[i][2] && board[i][0] != ' ')
		{
			return board[i][0];
		}
	}
	for (i = 0; i < row; i++)//判断列是否相等
	{
		if (board[0][i] == board[1][i] && board[0][i] == board[2][i] && board[0][i] != ' ')
		{
			return board[0][i];
		}
	}
	if (board[2][0] == board[1][1] && board[0][2] == board[2][0] && board[2][0]!=' ')//判断对角线
	{
		return board[2][0];
	}
	if (board[0][0] == board[1][1] && board[0][0] == board[2][2] && board[0][0] != ' ')
	{
		return board[0][0];
	}
	//2.判断平局
	if (isFull(board, row, col) == 1)
	{
		return 'Q';
	}
	else return 'C';
}

5.最终效果

平局:
在这里插入图片描述

女朋友赢:
在这里插入图片描述
玩家赢:
在这里插入图片描述
最终的所有的代码如下:
我的gitee–和女朋友玩的三子棋小游戏

猜数字

七夕到了,没有女朋友怎么办?没事~ 写一个小游戏,让女朋友陪你玩猜数字~

在一定数值范围内,游戏随机生成一个数字,玩家输入比随机数大的数字时,程序会提醒,数值大于目标数,反之亦然。通过不断试错,最终找出目标数字。此游戏可以重复玩。

1.设立菜单

设立一个menu(),菜单函数

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

因为游戏可以重复玩,所以需要执行一次,再进行循环。因此选择do…while()语句

#include<stdio.h>
#include<math.h>
void menu()
{
    printf("***********");
    printf("**1.play***");
    printf("**0.exit***");
    printf("***********");
}
int main()
{
    int t;
    do 
    {
        menu();
        printf("请选择:》");
        scanf("%d", &t);
        switch (t)
        {
        case 1:
            game();
            break;
        case 0:
            printf("退出游戏");
            break;
        default:
            printf("选择错误");
            break;

        }

    }while(input);
    return 0;
}

菜单如图:
在这里插入图片描述

2.生成随机数

💡int rand(void) :返回一个范围在 0 到 RAND_MAX 之间的伪随机数。

💡RAND_MAX :是一个常量,它的默认值在不同的实现中会有所不同,但是值 ≥ 32767。
使用该函数,需要引头文件 #include<stdib.h>

💡 srand 函数是随机数发生器的初始化函数。
它初始化随机种子,会提供一个种子,这个种子会对应一个随机数,如果使用相同的种子后面的 rand() 函数会出现一样的随机数,如: srand(1); 直接使用 1 来初始化种子。不过为了防止随机数每次重复,常常使用系统时间来初始化,即使用 time函数来获得系统时间,它的返回值为从 00:00:00 GMT, January 1, 1970 到现在所持续的秒数,然后将time_t型数据转化为(unsigned)型再传给srand函数,即: srand((unsigned) time(&t)); 还有一个经常用法,不需要定义time_t型t变量,即: srand((unsigned) time(NULL)); 直接传入一个空指针,因为程序中往往并不需要经过参数获得的数据。
💡需要引用头文件 #include<time.h>

在这里插入图片描述
💡此时生成了随机数,但是如果输入数字的时间过快,可能会输出相同的数字,而且是递增的。
所以srand((unsigned int)time(NULL))位置需要调整到主函数内。即:

int main()
{   
	int input = 0;
	srand((unsigned int)time(NULL));
	.....

在这里插入图片描述

💡解决了生成随机数的问题,但是rand()函数生成的数字是0到32767,对于猜数字游戏来说,范围太大。将范围调整成1~100。
想要输出给定范围之内的随机数,需要使用 rand() % (b - a + 1)+ a,显然,rand()% (b - a + 1)的范围是[0,b - a],再加上a之后的范围就是[a,b]下面的代码是生成[0,100]]范围内的随机数。
在这里插入图片描述

3.进行数字判断

void game()
{
      int ret = 0;
      ret = rand()%100+1;
      int guess = 0;
      printf("%d\n", ret);
      printf("猜数字游戏\n");
      while (1)
      {
          scanf("%d", &guess);
          if (guess > ret)
          {
              printf("女朋友:猜测过大,请重新猜");
          }
          else if (guess < ret)
          {
              printf("女朋友:猜测过小,请重新猜");
          }
          else
          {
              printf("恭喜你,猜对啦!╰(*°▽°*)╯"):
          }

      }
}

4.最终效果

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
    printf("***********\n");
    printf("**1.play***\n");
    printf("**0.exit***\n");
    printf("***********\n");
    
}
void game()
{
      int ret = 0;
      ret = rand()%100+1;
      int guess = 0;
      printf("猜数字游戏\n");
      while (1)
      {
          printf("女朋友:请猜数字>");
          scanf("%d", &guess);
          if (guess > ret)
          {
              printf("女朋友:猜测过大,请重新猜\n");
          }
          else if (guess < ret)
          {
              printf("女朋友:猜测过小,请重新猜\n");
          }
          else
          {
              printf("女朋友:恭喜你,猜对啦!╰(*°▽°*)╯\n"); break;
          }

      }
}
int main()
{
   int input;
    srand((unsigned int)time(NULL));
    do 
    {
        menu();
        printf("请选择:》\n");
        printf("\n");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            printf("女朋友:准备开始游戏拉!\n");
            game();
            break;
        case 0:
            printf("退出游戏\n");
            break;
        default:
            printf("选择错误\n");
            break;

        }

    } while (input);
    return 0;
}

在这里插入图片描述
最终的所有的代码如下:
我的gitee–和女朋友玩的猜数字小游戏

是不是感觉超级甜的鸭!!!!!
在这里插入图片描述

扫雷

七夕到了,没有女朋友怎么办?没事~ 写一个小游戏,让女朋友陪你玩扫雷~
在这里插入图片描述

首先创建:
game.c的源文件–>游戏函数的实现
test.c的源文件–>测试使用
game.h的头文件–>游戏函数的声明
在这里插入图片描述
一共需要创建两个二维数组:
在这里插入图片描述
如果要实现9*9的数组雷区,则实际要创建11 *11的数组雷区,为了防止数组越界。

在这里插入图片描述

1.初始化棋盘

void InitBoard(char board[ROWS][COLS], int rows, int cols,char set)
{
	int i, j;
	for (i = 0; i < ROWS; i++)
	{
		for (j = 0; j < COLS; j++)
		{
			board[i][j] = set;
		}
	}
}
void game()
{
	char mine[ROWS][COLS] = { 0 };//存放雷的信息
	char show[ROWS][COLS] = { 0 };//存放排查雷的信息
	//初始化棋盘
	InitBoard(mine, ROWS, COLS ,'0');
	InitBoard(show, ROWS, COLS,'*');
	//展示棋盘
	DisplayBoard(mine, ROWS, COLS);
	DisplayBoard(show, ROWS, COLS);
	
}

2.展示棋盘

void DisplayBoard(char board[ROWS][COLS], int rows, int cols)
{
	int i, j;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", i);
	}
	printf("\n");
	for (i = 1; i < ROWS-1; i++)
	{
		printf("%d ", i);
		for (j = 1; j < COLS-1; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
	printf("\n");
}

在这里插入图片描述
最外层的行列可以让玩家容易分清楚是在第几行第几列

3.布置雷

void SetMine(char board[ROWS][COLS], int row, int col)
{
	int count = EAST_COUNT;
	while (count)
	{   //1.生成随机下标
		int x = rand() % row + 1;
		int y = rand() % col + 1;
		if (board[x][y] != '1')
		{
			board[x][y] = '1';
			count--;
		}
	}
}

在这里插入图片描述

0 1 2 3 4 5 6 7 8 9
1 1 0 0 0 0 0 0 1 0
2 0 0 0 0 0 0 0 0 0
3 0 0 0 1 0 0 0 0 0
4 1 0 0 0 1 1 0 0 0
5 0 0 0 0 0 1 0 0 0
6 0 0 0 0 0 0 0 0 0
7 0 0 0 0 0 0 0 0 0
8 0 0 0 0 0 0 0 0 0
9 0 1 0 1 0 0 0 0 0

4.排除雷

void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)//排查雷
{
	int x, y;
	printf("输入要排查雷的坐标:>");
	scanf("%d%d", &x, &y);
	while (1)
	{
		if (x >= 1 && x <= 9 && y >= 1 && y <= 9)
		{
			if (mine[x][y] == '1')
			{
				printf("很遗憾,你被炸死了,女朋友很伤心๐·°(৹˃̵﹏˂̵৹)°·๐");
				DisplayBoard(show, ROWS, COLS);
				break;
			}
			else
			{
				int count = GetMineCount(mine, x, y);
				show[x][y] = count+'0';
				DisplayBoard(show, ROWS, COLS);
				break;
			}

		}
		else
			printf("输入坐标非法,请重新输入");
	}
	

下图说明在2 5坐标的周围8个格子中一共有一个雷
在这里插入图片描述

5.优化展示效果

(1)展开一片
如何实现这种可以展开一大片的效果呢?
规则:满足该坐标不是雷,并且周围8个位置也不是雷,就会展开一片
在这里插入图片描述
声明:以下代码来自点击到空白格子时自动展开

//连续展开
void blankOpen(int r,int c)
{
//打开格子
	map[r][c] -= 20;
	count++;
	//点开后遍历九宫格
	for (int m=r-1;m<=r+1;m++)
	{
		for (int n=c-1;n<=c+1;n++)
		{
			if (m >= 1 && m <= ROW && n >= 1 && n <= COL)			//保证是游戏区
			{
				if (map[m][n] >= 19 && map[m][n] <= 28)				//必须为空白格
				{
					if (map[m][n]!=20)
					{
						map[m][n] -= 20;
						count++;
					}
					else
					{
						blankOpen(m,n);
					}
				}
			}
		}
	}
}

此时就需要用到递归了

(2)显示剩余的雷数
在这里插入图片描述
声明:以下代码来自关于显示剩余的雷数

int print()
{
	char num[MINE_NUM];
	int n = 0;
	for (int r = 1; r <= ROW; r++)
	{
		for (int c = 1; c <= COL; c++)
		{
			if (map[r][c] == 19 || map[r][c] == -1)
			{
				n++;
			}
		}
	}
	outtextxy(770, 200, "剩余的雷:");
	sprintf(num, "%02d", n);
	outtextxy(790, 230, num);
	printf("\n\n\n");
	printf("%02d",n);
}

6.最终展示结果

1.排雷失败:(1代表雷,0代表非雷)
在这里插入图片描述

2.排雷成功
在这里插入图片描述
最终的所有的代码如下:
我的gitee–和女朋友玩的扫雷小游戏

在这里插入图片描述

当然啦!祝愿所有点赞的小朋友在七夕这天都能收获幸福与快乐!
在这里插入图片描述

  • 18
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 17
    评论
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

温欣2030

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

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

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

打赏作者

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

抵扣说明:

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

余额充值