C语言之小游戏集合

Posted Suk_god

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言之小游戏集合相关的知识,希望对你有一定的参考价值。

说明
此篇博客将会不定期更新,不断添加C编写的小游戏

三子棋实现

这个游戏我单独写了一篇博客,具体详细思路与完整代码见

链接: https://editor.csdn.net/md/?articleId=117386293.

在这里就不做详细介绍了,但在文末会附上三子棋的代码

扫雷游戏

相信各位读者对于扫雷都不陌生,这里就不再详细介绍。
主要分析一下实现思路:

1、如何存储

既然是一款游戏,那必然少不了数据的存储,扫雷给我们的第一感觉就是用二维数组来存储了。
但是存储之后我们要进行判断时就会发现,这张表格(棋盘)的中间格子周围有8个其他格子,而边角位置就不一样了。这样对于我们编写函数得到某一格子周围有几颗雷就显得有些困难了。
所以我们应该定义一个二维数组没错,但是要定义一个比预留要用的棋盘更大的二维数组,这样上面所说的函数就会适用于每一个格子。
在这里插入图片描述
还有一个问题:
扫雷时用户看到的是自己输入坐标后对应的二维表,表中的数据都是周围未选择的STYLE已经选择了的对应周围雷的个数,这样一来,我们布置雷的棋盘就不能在对应的位置显示了,因为会产生冲突。
所以:我们应该选用一张与对用户显示表完全相同的表来布置雷的位置
综上所述
第一:选择比预期更大一点的二维数组存储数据
例如:10*10的扫雷区域

#define ROW1 12
#define COL1 12
char Show_board[ROW1][COL1];

第二:雷的布置用同样规格的另一张表存储

char Mine_board[ROW1][COL1];

2、对于用户棋盘和布雷棋盘的初始化

#define STYLE '*'
memset(Show_board, STYLE, sizeof(Show_board));
memset(Mine_board, '0', sizeof(Mine_board));

注意:memset为C语言内置的库函数,在头文件string.h下。
在这里插入图片描述
具体作用:将规定字节长度的数据按照传入的value值替换(按字节操作)

3、布雷

此操作在二维数组Mines_board[ROW1][COL1]下进行

#define NUM 20
static void SetMines(char Mine_board[][COL1], int row, int col)
{
	int count = NUM;
	while (count)
	{
		int x = rand() % (ROW1 - 2) + 1;
		int y = rand() % (COL1 - 2) + 1;
		if (Mine_board[x][y] == '0')
		{
			Mine_board[x][y] = '1';
			count--;
		}
	}
}

4、格式化输出检测

static void showline(int col)
{
	for (int i = 0; i <= col - 2; i++)
	{
		printf("----");
	}
	printf("\\n");
}
static void ShowBoard(char Show_board[][COL1], int row, int col)
{
	printf("   ");
	for (int i = 1; i <= col - 2; i++)
	{
		printf("%3d ", i);
	}
	printf("\\n");
	showline(col);
	for (int i = 1; i <= row - 2; i++)
	{
		printf("%-2d |", i);
		for (int j = 1; j <= col - 2; j++)
		{
			printf(" %c |", Show_board[i][j]);
		}
		printf("\\n");
		showline(col);
	}
}

5、用户开始扫雷

void FindMines()
{
	srand((unsigned long)time(NULL));
	char Show_board[ROW1][COL1];
	char Mine_board[ROW1][COL1];
	memset(Show_board, STYLE, sizeof(Show_board));
	memset(Mine_board, '0', sizeof(Mine_board));

	SetMines(Mine_board, ROW1, COL1);
	//count表示用户需要扫雷成功的次数
	//只有完成规定的次数用户才能赢
	int count = (ROW1 - 2)*(COL1 - 2) - NUM;
	while (count)
	{
		system("cls");
		ShowBoard(Show_board, ROW1, COL1);
		int x = 0;
		int y = 0;
		printf("Please Enter Your Choose<x,y>#");
		scanf("%d %d", &x, &y);
		if (x<1 || x>(ROW1 - 1) || y<1 || y>(COL1 - 1))
		{
			printf("Your Choose Is Error! Please Try Again\\n");
			continue;
		}
		if (Show_board[x][y] != STYLE)
		{
			printf("Your Choose Is Error! Please Try Again\\n");
			continue;
		}
		if (Mine_board[x][y] == '1')
		{
			printf("Game over!\\n");
			break;
		}
		//此条语句表示相对应的位置写入周围的雷数
		Show_board[x][y] = CountMines(Mine_board, x, y);
		
		count--;
	}
	ShowBoard(Mine_board, ROW1, COL1);
}

== CountMines(Mine_board, x, y)==求<x,y>周围的雷的个数

static char CountMines(char Mine_board[][COL1], int x, int y)
{
	//求出周围雷的个数,转换成字符表示
	//例如有6颗雷就返回字符‘6’
	char count = Mine_board[x - 1][y - 1] + Mine_board[x - 1][y] + Mine_board[x - 1][y + 1] + Mine_board[x][y + 1] \\
		+ Mine_board[x + 1][y + 1] + Mine_board[x + 1][y] + Mine_board[x + 1][y - 1] + Mine_board[x][y - 1] - 7 * '0';
	return count;
}

扫雷完整代码如下:
FindMines.h

#pragma once

#include <stdio.h>
#include <windows.h>
#include <time.h>
#include <stdlib.h>

#define ROW1 12
#define COL1 12
#pragma warning(disable:4996)
#define STYLE '*'
#define NUM 20
extern void FindMines();

FindMines.c

#include "FindMines.h"

static void SetMines(char Mine_board[][COL1], int row, int col)
{
	int count = NUM;
	while (count)
	{
		int x = rand() % (ROW1 - 2) + 1;
		int y = rand() % (COL1 - 2) + 1;
		if (Mine_board[x][y] == '0')
		{
			Mine_board[x][y] = '1';
			count--;
		}
	}
}

static void showline(int col)
{
	for (int i = 0; i <= col - 2; i++)
	{
		printf("----");
	}
	printf("\\n");
}
static void ShowBoard(char Show_board[][COL1], int row, int col)
{
	printf("   ");
	for (int i = 1; i <= col - 2; i++)
	{
		printf("%3d ", i);
	}
	printf("\\n");
	showline(col);
	for (int i = 1; i <= row - 2; i++)
	{
		printf("%-2d |", i);
		for (int j = 1; j <= col - 2; j++)
		{
			printf(" %c |", Show_board[i][j]);
		}
		printf("\\n");
		showline(col);
	}
}
static char CountMines(char Mine_board[][COL1], int x, int y)
{
	char count = Mine_board[x - 1][y - 1] + Mine_board[x - 1][y] + Mine_board[x - 1][y + 1] + Mine_board[x][y + 1] \\
		+ Mine_board[x + 1][y + 1] + Mine_board[x + 1][y] + Mine_board[x + 1][y - 1] + Mine_board[x][y - 1] - 7 * '0';
	return count;
}

void FindMines()
{
	srand((unsigned long)time(NULL));
	char Show_board[ROW1][COL1];
	char Mine_board[ROW1][COL1];
	memset(Show_board, STYLE, sizeof(Show_board));
	memset(Mine_board, '0', sizeof(Mine_board));

	SetMines(Mine_board, ROW1, COL1);

	int count = (ROW1 - 2)*(COL1 - 2) - NUM;
	while (count)
	{
		system("cls");
		ShowBoard(Show_board, ROW1, COL1);
		int x = 0;
		int y = 0;
		printf("Please Enter Your Choose<x,y>#");
		scanf("%d %d", &x, &y);
		if (x<1 || x>(ROW1 - 1) || y<1 || y>(COL1 - 1))
		{
			printf("Your Choose Is Error! Please Try Again\\n");
			continue;
		}
		if (Show_board[x][y] != STYLE)
		{
			printf("Your Choose Is Error! Please Try Again\\n");
			continue;
		}
		if (Mine_board[x][y] == '1')
		{
			printf("Game over!\\n");
			break;
		}
		Show_board[x][y] = CountMines(Mine_board, x, y);
		
		count--;
	}
	ShowBoard(Mine_board, ROW1, COL1);
}

三子棋完整代码
ThreeGmae.h

# pragma once
#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include <windows.h>
#include <time.h>
#include <stdlib.h>

#define ROW 3
#define COL 3
#define INIT ' '
#define WHITE 'X'
#define BLACK 'O'
#define NEXT 'D'
#define DRAW 0

extern void ThreeGame();

ThreeGame.c

#include "ThreeGame.h"


//初始化棋盘
static void Init(char board[][COL], int row, int col)
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			board[i][j] = INIT;
		}
	}
}
static void Showbard(char board[][COL], int row, int col)
{
	system("cls");
	printf(" ");
	for (int i = 0; i <col; i++)
	{
		printf("%4d", i + 1);
	}
	printf("\\n----------------\\n");
	for (int i = 0; i < row; i++)
	{
		printf("%-2d", i + 1);
		for (int j = 0; j < col; j++)
		{
			printf("| %c ", board[i][j]);
		}
		printf("\\n----------------\\n");
	}
}
static void PlayerMove(char board[][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	while (1)
	{
		printf("Please Enter Your  Position<x,y>#\\n");
		scanf("%d %d", &x, &y);
		if (x<1 || x>3 || y<1 || y>3)
		{
			printf("Enter Error! Try Again\\n");
			continue;
		}
		if (board[x - 1][y - 1] == INIT)
		{
			board[x - 1][y - 1] = WHITE;
			break;
		}
		else
		{
			printf("This position is not empty,please enter again!\\n");
		}
	}
}

static char IsEnd(char board[][COL], int row, int col)
{
	C语言——简单的走迷宫小游戏(无指针,无链表,无......!!!)

简单的走迷宫小游戏(C语言编写,无指针,无链表)

简单的走迷宫小游戏(C语言编写,无指针,无链表)

C语言游戏入门小程序之简单而有趣的猜数字游戏!!

c语言初学者如何代码实现 扫雷 游戏

C语言之迷宫小游戏2.0版(随机生成地图,可变颜色,优化游戏体验)