C语言--扫雷小游戏
Posted 小鹿可可乐
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言--扫雷小游戏相关的知识,希望对你有一定的参考价值。
1.思路分析
在一定区域中,进行显示,用字符框做
步骤:
- 在所有区域中显示“@”符号。
- 当输入具体行(r)和列(c)时候 值0为没雷,显示空格
- r c #(为有雷)
- r c @(取消选择,继续显示@)
如何在一个方框(字节)中显示不同符号:
理想实现图示:
2.代码实现
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#define INIT_VIEW 0x80 //1000 0000
#define MEIN_VIEW 0x40 // 0100 0000 #
#define MAKE_MEIN 0x20 // 0010 0000 地雷标
#define NUM_TAG 0x10 // 0001 0000 num;
#define MINE_0 0x00 // 0000 0000 0
#define MINE_1 0x01 // 0000 0001 1
#define MINE_2 0x02 // 0000 0010 2
#define MINE_3 0x03 // 0000 0011 3
#define MINE_4 0x04 // 0000 0100 4
#define MINE_5 0x05 // 0000 0101 5
#define MINE_6 0x06 // 0000 0110 6
#define MINE_7 0x07 // 0000 0111 7
#define MINE_8 0x08 // 0000 1000 8
#define CLE_TAG 0x0f // 0000 1111 清除标记
#define ROWSIZE 15
#define COLSIZE 15
#define MINENUM 64
typedef unsigned char Grid[ROWSIZE + 2][COLSIZE + 2];
void Init_Ar(Grid ar, int row, int col)
{
assert(ar != nullptr);
for (int i = 1; i <= row; ++i)
{
for (int j = 1; j <= col; ++j)
{
ar[i][j] |= INIT_VIEW;
}
}
int i = 0;
while (i < MINENUM)
{
int r = rand() % ROWSIZE + 1;
int c = rand() % COLSIZE + 1;
if (!(ar[r][c] & MAKE_MEIN))
{
ar[r][c] |= MAKE_MEIN; // ar[r][c] = ar[r][c] | MAKE_MEIN;
++i;
}
}
}
void Test_Print_Ar(Grid ar, int row, int col)
{
printf(" ");// 3 行先空3个
for (int j = 1; j <= col; ++j)
{
printf("%3d", j);
}
printf("\\n");
for (int i = 1; i <= row; ++i)
{
printf("%3d", i);
for (int j = 1; j <= col; ++j)
{
if (ar[i][j] & MAKE_MEIN)
{
printf("%3c", '#');
}
else if (ar[i][j] & INIT_VIEW)
{
printf("%3c", '@');
}
}
printf("\\n");
}
printf("\\n");
}
void Test_Print_Ar2(Grid ar, int row, int col)
{
printf(" ");// 3
for (int j = 1; j <= col; ++j)
{
printf("%3d", j);
}
printf("\\n");
for (int i = 1; i <= row; ++i)
{
printf("%3d", i);
for (int j = 1; j <= col; ++j)
{
if (ar[i][j] & MAKE_MEIN)
{
printf("%3c", '#');
}
else
{
printf("%3d", ar[i][j] & 0x0f);
}
}
printf("\\n");
}
printf("\\n");
}
void SetMineNum(Grid ar, int row, int col)
{
for (int r = 1; r <= row; ++r)
{
for (int c = 1; c <= col; ++c)
{
if (!(ar[r][c] & MAKE_MEIN))
{
unsigned char sum = 0;
for (int i = r - 1; i < r + 2; ++i)
{
for (int j = c - 1; j < c + 2; ++j)
{
if (ar[i][j] & MAKE_MEIN)
{
sum += 1;
}
}
}
ar[r][c] |= NUM_TAG;
ar[r][c] |= (0x0f & sum); //ar[r][c]|=sum;
}
}
}
}
void Show_Ar(Grid ar, int row, int col)
{
system("cls");
printf(" ");// 3
for (int j = 1; j <= col; ++j)
{
printf("%3d", j);
}
printf("\\n");
for (int i = 1; i <= row; ++i)
{
printf("%3d", i);
for (int j = 1; j <= col; ++j)
{
if (ar[i][j] & INIT_VIEW)
{
printf("%3c", '@');
}
else if (ar[i][j] & MEIN_VIEW)
{
printf("%3c", '#');
}
else if (ar[i][j] & NUM_TAG)
{
printf("%3d", ar[i][j] & 0x0f);
}
}
printf("\\n");
}
printf("\\n");
}
int main()
{
Grid ar = {};
Init_Ar(ar, ROWSIZE, COLSIZE);
//Test_Print_Ar(ar, ROWSIZE, COLSIZE);
SetMineNum(ar, ROWSIZE, COLSIZE);
//Test_Print_Ar2(ar, ROWSIZE, COLSIZE);
int sum = 0;
while (sum < MINENUM)
{
Show_Ar(ar, ROWSIZE, COLSIZE);
int r, c;
char ch;// 0 # @
scanf_s("%d %d %c", &r, &c, &ch);
// r c 0
// r c #
// r c @
if (r >= 1 && r <= ROWSIZE && c >= 1 && c <= COLSIZE)
{
if (ch == '0')
{
if (ar[r][c] & MAKE_MEIN)
{
printf("爆炸了 !");
exit(1);
}
else
{
ar[r][c] &= CLE_TAG;
ar[r][c] |= NUM_TAG;
}
}
if (ch == '#')
{
ar[r][c] &= 0x7f;// 0111 1111
ar[r][c] |= MEIN_VIEW;// #
}
if (ch == '@')
{
}
}
}
return 0;
}
3.结果展示:
今天也要好好学习呀~
以上是关于C语言--扫雷小游戏的主要内容,如果未能解决你的问题,请参考以下文章
C语言实现小游戏篇我接触的第一款电脑游戏,你可以永远相信 “ 扫雷 ” 。[ C语言实现 ] [ 超详细,超清楚 ] [ 有代码 ]