调试模式我编完了,但是编游戏模式我就卡住了。
只用帮我编第一个 gamemode 的function就行了。
编完后应该是这样的。
这个4是输入进去的。
‘()’代表 雷。
‘ 01,02 ’ 是代表周围一圈有几个雷,如果一片空白就是周围没有雷。
‘ ## ’就代表不知道是不是雷。
编个大概就行。
我编到这里就不会了。
//这个是要创建的游戏界面的function。
void gamemode(int minefield[][SIZE], Point point[])
{
int i = 0;
while (i < 10)
{
int j = 0;
while (j < 10)
{
if (j == 1 || j == 10) {
printf("-------------------------");
}
if (i > 1 && j == 1) {
printf(" |");
}
if (i > 1 && j == 10) {
printf("| ");
}
if (i == 0) {
printf("0%d",j);
}
if (j == 0) {
printf("0%d",i);
}
}
//这个是主程序
int main(void)
{
int minefield[SIZE][SIZE];
int number;
printf("Welcome to minesweeper!\n");
printf("How many mines? ");
scanf("%d", &number);
Point point[SIZE];
printf("Enter pairs:\n");
int i = 0;
while (number > i)
{
scanf("%d%d", &point[i].y, &point[i].x);
i++;
}
init_field(minefield, point, number);
printf("Game Started\n");
print_minefield(minefield);
int a,b,c,d;
int r = 0;
int z = 0;
while (scanf("%d",&a) != EOF) {
if ((a == 1 || a == 2) && r >= 3) {
scanf("%d%d%d",&b,&c,&d);
printf("Help already used\n");
} else if (a == 1) {
scanf("%d%d%d",&b,&c,&d);
first_is_1(b,c,d,point,number);
r++;
} else if (a == 2) {
scanf("%d%d%d",&b,&c,&d);
first_is_2(b,c,d,point,number);
r++;
}
if (a == 3) {
scanf("%d%d",&b,&c);
first_is_3(b,c,point,number,minefield);
}
if (a == 4){
if (z%2 == 0){
printf("Gameplay mode activated\n");
printf(". .\n");
printf("\/\n");
gamemode(minefield, point);
}
if (z%2 == 1){
printf("Debug mode activated\n");
debugmode();
}
z++;
}
if (a == 1 || a == 2 || (z%2 == 1 && a == 3)) {
print_minefield(minefield);
}
}
return 0;
}
下面是其他代码。
#include <stdio.h>
#include <stdlib.h>
// 格子的定义
#define VISIBLE_SAFE 0
#define HIDDEN_SAFE 1
#define HIDDEN_MINE 2
//地图尺寸
#define SIZE 8
、、下面是其他的function
typedef struct _point
{
int x;
int y;
} Point;
void first_is_1(int b,int c,int d,Point point[],int number);
void first_is_2(int b,int c,int d,Point point[],int number);
void first_is_3(int b,int c,Point point[],int number,int minefield[][SIZE]);
void init_field(int minefield[][SIZE], Point point[], int number);
void print_minefield(int minefield[][SIZE]);
void gamemode(int minefield[][SIZE], Point point[]);
void debugmode(int minefield[][SIZE], Point point[]);
void init_field(int minefield[][SIZE], Point point[], int number)
{
int i = 0;
while (i < SIZE)
{
int j = 0;
while (j < SIZE)
{
minefield[i][j] = HIDDEN_SAFE;
j++;
}
i++;
}
i = 0;
while (i < number)
{
if (point[i].y < SIZE && point[i].x < SIZE && point[i].x >= 0 && point[i].y >= 0) {
minefield[point[i].y][point[i].x] = HIDDEN_MINE;}
i++;
}
}
void print_minefield(int minefield[][SIZE])
{
int i = 0;
while (i < SIZE)
{
int j = 0;
while (j < SIZE)
{
printf("%d ", minefield[i][j]);
j++;
}
i++;
printf("\n");
}
}
使用gamemode_print函数输出,修改的地方比较多,你对照看一下。
//这个是主程序
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// 格子的定义
#define VISIBLE_SAFE 0
#define HIDDEN_SAFE 1
#define HIDDEN_MINE 2
//地图尺寸
#define SIZE 8
//下面是其他的function
typedef struct _point
{
int x;
int y;
} Point;
void first_is_1(int b, int c, int d, Point point[], int number);
void first_is_2(int b, int c, int d, Point point[], int number);
void first_is_3(int b, int c, Point point[], int number, int minefield[][SIZE]);
void init_field(int minefield[][SIZE], Point point[], int number);
void print_minefield(int minefield[][SIZE]);
void gamemode(int minefield[][SIZE], Point point[]);
void debugmode(int minefield[][SIZE], Point point[]);
void gamemode_print(int minefield[][SIZE]); //输出游戏界面
void init_field(int minefield[][SIZE], Point point[], int number)
{
int i = 0;
while (i < SIZE)
{
int j = 0;
while (j < SIZE)
{
minefield[i][j] = HIDDEN_SAFE;
j++;
}
i++;
}
i = 0;
while (i < number)
{
//if (point[i].y < SIZE && point[i].x < SIZE && point[i].x >= 0 && point[i].y >= 0)
//{
minefield[point[i].y][point[i].x] = HIDDEN_MINE;
//}
i++;
}
}
void print_minefield(int minefield[][SIZE])
{
int i = 0;
while (i < SIZE)
{
int j = 0;
while (j < SIZE)
{
printf("%2d ", minefield[i][j]);
j++;
}
i++;
printf("\n");
}
}
//随机生成num个雷,重复则重新生成
void init_mine(Point *p, int num)
{
srand((unsigned int)time(NULL));
int j, i = 0, isHave = 0;
while (i < num)
{
(p + i)->x = rand() % SIZE;
(p + i)->y = rand() % SIZE;
isHave = j = 0;
while (j < i)
{
if ((p + i)->x == (p + j)->x && (p + i)->y == (p + j)->x)
{
isHave = 1;
break;
}
j++;
}
if (!isHave)
{
i++;
}
}
}
int main(void)
{
int minefield[SIZE][SIZE];
int number;
printf("Welcome to minesweeper!\n");
printf("How many mines? ");
scanf("%d", &number);
//根据输入动态生成数组
Point *point = (Point *)calloc(number, sizeof(Point)); //Point point[SIZE];
if (point == NULL)
{
printf("memory wrong!\n");
return -1;
}
/*
printf("Enter pairs:\n");
int i = 0;
while (number > i)
{
scanf("%d%d", &point[i].y, &point[i].x);
i++;
}
*/
init_mine(point, number);
init_field(minefield, point, number);
printf("Game Started\n");
print_minefield(minefield);
int a, b, c, d;
int r = 0;
int z = 0;
while (scanf("%d", &a) != EOF)
{
if ((a == 1 || a == 2) && r >= 3)
{
scanf("%d%d%d", &b, &c, &d);
printf("Help already used\n");
}
else if (a == 1)
{
scanf("%d%d%d", &b, &c, &d);
//first_is_1(b, c, d, point, number);
r++;
}
else if (a == 2)
{
scanf("%d%d%d", &b, &c, &d);
//first_is_2(b, c, d, point, number);
r++;
}
if (a == 3)
{
scanf("%d%d", &b, &c);
//first_is_3(b, c, point, number, minefield);
}
if (a == 4)
{
if (z % 2 == 0)
{
printf("Gameplay mode activated\n");
printf(". .\n");
printf("\\/\n");
gamemode_print(minefield);
//gamemode(minefield, point);
}
if (z % 2 == 1)
{
printf("Debug mode activated\n");
//debugmode();
}
z++;
}
if (a == 1 || a == 2 || (z % 2 == 1 && a == 3))
{
print_minefield(minefield);
}
}
return 0;
}
void gamemode(int minefield[][SIZE], Point point[])
{
printf("\ninput x,y:\n");
printf("\n");
gamemode_print(minefield);
}
enum mineStatu //用来表示当前位置的状态
{
SAFE = 0,
VIEW = -1,
MINE = -2
};
inline int getxyMine(int mineStatu)
{
return mineStatu == HIDDEN_MINE ? 1 : 0;
}
//返回i,j坐标处周围有几个雷
int getstatus(int mine[][SIZE], int i, int j)
{
int sum = 0;
if (mine[i][j] == HIDDEN_MINE)
return MINE;
if (i == 0)//处理四角的特殊情况
{
if (j == 0)
{
sum = getxyMine(mine[i + 1][j]) + getxyMine(mine[i + 1][j + 1]) + getxyMine(mine[i][j + 1]);
}
else if (j == SIZE - 1)
{
sum = getxyMine(mine[i + 1][j]) + getxyMine(mine[i + 1][j - 1]) + getxyMine(mine[i][j - 1]);
}
else
{
sum = getxyMine(mine[i + 1][j]) + getxyMine(mine[i + 1][j - 1]) + getxyMine(mine[i + 1][j + 1]) + getxyMine(mine[i][j + 1]) + getxyMine(mine[i][j - 1]);
}
}
else if (i == SIZE - 1)
{
if (j == 0)
{
sum = getxyMine(mine[i - 1][j]) + getxyMine(mine[i - 1][j + 1]) + getxyMine(mine[i][j + 1]);
}
else if (j == SIZE - 1)
{
sum = getxyMine(mine[i - 1][j]) + getxyMine(mine[i - 1][j - 1]) + getxyMine(mine[i][j - 1]);
}
else
{
sum = getxyMine(mine[i - 1][j]) + getxyMine(mine[i - 1][j - 1]) + getxyMine(mine[i - 1][j + 1]) + getxyMine(mine[i][j + 1]) + getxyMine(mine[i][j - 1]);
}
}
else
{
if (j == 0)
{
sum = getxyMine(mine[i - 1][j]) + getxyMine(mine[i - 1][j + 1]) + getxyMine(mine[i][j + 1]) + getxyMine(mine[i + 1][j]) + getxyMine(mine[i + 1][j + 1]);
}
else if (j == SIZE - 1)
{
sum = getxyMine(mine[i - 1][j]) + getxyMine(mine[i - 1][j - 1]) + getxyMine(mine[i][j - 1]) + getxyMine(mine[i + 1][j]) + getxyMine(mine[i + 1][j - 1]);
}
else
{
sum = getxyMine(mine[i - 1][j]) + getxyMine(mine[i - 1][j - 1]) + getxyMine(mine[i - 1][j + 1]) + getxyMine(mine[i][j + 1]) + getxyMine(mine[i][j - 1]) + getxyMine(mine[i + 1][j]) + getxyMine(mine[i + 1][j - 1]) + getxyMine(mine[i + 1][j + 1]);
}
}
return sum;
}
//这个是要创建的游戏界面的function。
void gamemode_print(int minefield[][SIZE])
{
int i, j, s;
printf(" ");
for (j = 0; j < SIZE; j++)
{
printf("%02d ", j);
}
printf("\n -----------------------\n");
for (i = 0; i < SIZE; i++)
{
printf("%02d |", i);
for (j = 0; j < SIZE; j++)
{
s = getstatus(minefield, i, j);
if (s == MINE)
printf("%s ", "()");
else if (s == SAFE)
printf("%s ", "##");
else
printf("%02d ", s);
}
printf("|\n");
}
printf(" -----------------------\n");
}
真的谢谢你了