- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
<分区>
我目前正在开始学习 C 语言。作为我的家庭作业,我正在尝试用 C 语言制作扫雷器的控制台版本。但是,它以某种方式不起作用,我不知道为什么。问题是,我不允许修改其中的一些函数和变量。他们是
(初始化板、显示板、显示界面)这些是我不允许修改的内容。
对于10*10的扫雷艇,我的第一个想法是制作一个 12*12 的板和一个函数来计算我在第一次用户输入之前需要的一切。
当用户扫过已挖方 block 时,程序终止,这正是我想要的,所以它运行良好。然而,当用户扫过未开采的方 block 时,函数 reveal() 似乎无法正常工作。
这是我有缺陷的代码....有人可以帮助我吗??
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#pragma warning(disable: 4996)
#define BOARD_SIZE 10
#define SQUARE_NUM (BOARD_SIZE*BOARD_SIZE)
#define MINE_NUM 17
#define SHUFFLE_NUM 100000
int left_square;
int mines; // only for debugging
int end; // only 1 when player lose
int mine_board[BOARD_SIZE][BOARD_SIZE];
/* 0 : non-mined, 1 : mined */
int display_board[BOARD_SIZE][BOARD_SIZE];
/* -1 : no mines around, 0 : unknown, 1~8 : number of mines */
int board_revealed[BOARD_SIZE + 2][BOARD_SIZE + 2];
int calculate_board[BOARD_SIZE + 2][BOARD_SIZE + 2][2];
// 0 : non-mined, 1 : mined
// layer 0 : current mine state
// layer 1 : how many mines are nearby
void board_oracle();
void store_board(); // store mine_board to calculate_board
void init_board(); // initialize mine_board by randomly planting fixed number of mines
void show_interface(); // print display_board
void reveal(int x, int y);
int sweep(int x, int y);
/*
* return : 1 if player sweeps mined square, else 0
*/
int check_game();
/*
* check if the player swept all non-mined squares
* return : 1 if player swept all non-mined squares, else 0
*/
int main(void) //Todo
{
init_board();
show_interface();
store_board();
printf("%d unmined square remaining, %d mines here\n", left_square, mines); // debugging
while (check_game() == 0)
{
int x, y;
printf("input coordinate : ");
scanf("%d %d", &x, &y);
if (sweep(x, y) == 0)
{
reveal(x, y);
}
else
{
display_board[x - 1][y - 1] = -1;
end = 1;
show_interface();
printf("player lost");
return 0;
}
show_interface();
}
}
void init_board()
{
int i;
int shuffle[BOARD_SIZE * BOARD_SIZE];
int temp;
int r1, r2;
srand(time(NULL)); // set seed
// initialize shuffle array
for (i = 0; i<SQUARE_NUM; i++)
shuffle[i] = i;
// shuffling
for (i = 0; i<SHUFFLE_NUM; i++)
{
r1 = rand() % SQUARE_NUM;
r2 = rand() % SQUARE_NUM;
temp = shuffle[r1];
shuffle[r1] = shuffle[r2];
shuffle[r2] = temp;
}
// get mine coordinates from shuffled array
for (i = 0; i<MINE_NUM; i++)
mine_board[shuffle[i] / BOARD_SIZE][shuffle[i] % BOARD_SIZE] = 1;
}
//given
void show_interface()
{
int i, j;
system("cls"); // clear the screen
// rest of this function just prints out display_board
printf(" ");
for (i = 0; i<BOARD_SIZE; i++)
printf(" %2d ", i + 1);
for (i = 0; i<BOARD_SIZE; i++)
{
printf("\n %2d ", i + 1);
for (j = 0; j<BOARD_SIZE; j++)
{
if (display_board[i][j] == -1)
{
if (mine_board[i][j] == 1)
printf(" * ");
else
printf(" X ");
}
else if (display_board[i][j] == 0)
printf(" - ");
else
printf(" %d ", display_board[i][j]);
}
printf("\n");
}
printf("\n |\n v\n\n Y\n\n");
}
//given
int sweep(int x, int y) // TODo
{
if (calculate_board[x][y][0] == 0)
{
return 0;
}
else
{
return 1;
}
}
//done
int check_game()
{
if (end == 1)
{
return 1;
}
else if (left_square == 0)
{
printf("You win");
return 2; // indicates win
}
else
{
return 0;
}
}
void store_board()
{
for (int i = 0; i < 100; i++)
{
int x = i / 10;
int y = i % 10;
calculate_board[x + 1][y + 1][0] = mine_board[x][y];
if (calculate_board[x + 1][y + 1][0] == 0)
{
left_square++;
}
else
{
mines++;
}
}
}
// properly working.
void board_oracle()
{
int i = 1, j = 1;
for (; i < 11; i++)
{
for (; j < 11; j++)
{
calculate_board[i][j][1] = calculate_board[i - 1][j - 1][0] + calculate_board[i][j - 1][0] + calculate_board[i - 1][j][0] + calculate_board[i][j + 1][0] + calculate_board[i - 1][j + 1][0] + calculate_board[i + 1][j - 1][0] + calculate_board[i + 1][j][0] + calculate_board[i + 1][j + 1][0];
}
}
}
void reveal(int x, int y)
{
if (x >= 1 && y >= 1 && x<= 11 && y <= 11)
{
if (board_revealed[x][y] == 1)
{
return;
}
else
{
if (calculate_board[x][y][1] == 0)
{
reveal(x - 1, y - 1);
reveal(x - 1, y);
reveal(x - 1, y + 1);
reveal(x, y - 1);
reveal(x, y + 1);
reveal(x + 1, y - 1);
reveal(x + 1, y);
reveal(x + 1, y + 1);
}
else
{
display_board[x - 1][y - 1] = calculate_board[x][y][1];
board_revealed[x][y] = 1;
}
}
}
else
{
return;
}
}
正如一些评论所说,准确地陈述问题当我运行程序并输入 2 3 时,程序崩溃并提示“段错误(核心已转储)”当它是方 block 时,错误不会发生(它打印“玩家丢失”并完成)该错误仅在我扫描未开采的方 block 时发生。
正如一些帮助所说,我添加了一行以确保 reveal() 在边缘停止...但它不会让它变得更好...
1)扫雷 简介 扫雷 是一种经典的单人电脑游戏,最初由微软公司在 1990 年代开发并内置在 Windows 操作系统中。游戏的目标是在一个由方块组成的网格上揭开所有非地雷的方块,而不触发地雷。每个
我正在制作 MineSweeper 的 Angular 版本,但我遇到了事件问题。我的意思是,我有这样的字段组件: import {Component, Input, OnInit} from '@a
我正在尝试制作一个简单的扫雷器,在 n*n 板上埋下 n*n/3 个地雷。地雷用*标记,空格用0标记。(它还不能作为游戏运行:我正在尝试制作扫雷的“答卷”)请注意,我还没有使用过任何有目的的方法。 我
我必须制作一个扫雷 GUI,但我不知道如何使每个按钮都有自己的 mouseAdapter。当我单击某个按钮时,它会更改屏幕上的每个按钮,而不仅仅是我单击的按钮。我可以提供一些关于如何执行此操作的指示吗
我想制作一款扫雷游戏。首先,这适用于按钮。我想我将研究二维数组,并且会有类似 boolean 数组来显示炸弹在哪里,例如,如果 booleanArray[0][4] 为 true,则有炸弹。 现在,我
我遇到了这个奇怪的问题,但我似乎无法弄清楚。我有一个按钮,上面写着“新游戏”。在我玩一次游戏后,然后按“新游戏”返回到 initGame() ,我遇到一个问题,因为我无法右键单击前一个游戏的地雷单元格
我现在面临一个问题,我认为我的 main 正在一遍又一遍地执行一个方法,而不是一次。如果我根据一个例子来解释一下就更好了。我已经能够编写扫雷游戏了。但我把这一切都写在一个 MAIN 类中。这次我尝试再
几个月来我一直在尝试创建自己的扫雷游戏(为了好玩)。唯一让我真正困惑的是如何使用递归函数(flood-fill)来填充游戏中的空白区域。 洪水填充仅部分起作用。它不会从任何单击的节点延伸到右侧或底部节
我正在尝试在 C++11 中使用 Qt 编写扫雷程序。 如果我按下一个带有 0 个炸弹的按钮,我想检查这个按钮周围的按钮以及它们是否也有 0 个炸弹。如果他们有 0 颗炸弹,我想检查按钮。 (图:红色
我想做的是能够“转动”每个相邻的 0,就像普通的扫雷游戏一样。 #include #include #include #include #include int buscamina(); u
有没有办法让某些事件 Action 特定于鼠标左键和右键单击? 我正在创建一个扫雷器图形用户界面,所以当左键单击一个方 block 时,它会被发现,而当它被右键单击时,它会被标记。 我不确定如何从语法
我正在尝试制作一个控制台版本的扫雷。 尽管我目前很努力,但我无法弄清楚扫雷的“洪水填充”部分,如果所选方格的周围邻居不包含炸弹,我们现在必须检查这些相邻方格以找到相邻方格炸弹。 下面的代码适用于所选方
我是论坛新手,因此如果这不符合该网站的标准,我想表示歉意,但是我对 2D 阵列扫雷程序有疑问。 我试图在棋盘上随机放置地雷,棋盘是通过数组构建的。不幸的是,地雷被随机放置在对角线上,而不是整个棋盘上。
我是 Java 编程新手,想寻求您的帮助。我正在尝试使用 Java 开发一个简单的扫雷游戏。但是,我不断收到错误“线程“main”java.lang.ArrayIndexOutOfBoundsExce
我在这段代码上工作了几个小时,终于接近完成了。一旦我弄清楚如何添加通过右键单击标记地雷的功能,我将添加一个地雷计数器和一个计时器。我了解到 JButton 无法识别右键单击,因此我必须使用 Mouse
for (var i = 0; i < 10; i++) { bommen[i] = [ Math.floor(Math.random() * 10), Math.floor(
我正在完成大学的一项作业,我们获得了扫雷游戏的源代码,并且我们有一定的实现要求。其中之一是,所有游戏都是在用户登录后从磁盘读取的,用户可以随时保存游戏进度。我一直在阅读序列化来保存/加载游戏进度,但我
我正在尝试用 Java 制作类似扫雷的游戏,并且我已经完成了其中的大部分工作。我需要帮助的是 FloodFill - http://en.wikipedia.org/wiki/Flood_fill .
我正在尝试为我正在制作的扫雷游戏制作一个函数。该函数的目的是根据给定的 x 和 y(它所在的位置)显示一个元素。这可能不是实现它的最优雅的方法,但我正在为每个标题为 newField 的图 block
这款游戏是扫雷。我试图实现的人工智能将采用已经在计算机上运行的扫雷游戏实例(本例为 Windows 7),获取窗口的矩形尺寸,计算窗口的位置,将其推送到前台在屏幕上,单击左上角的方 block ,然后
我是一名优秀的程序员,十分优秀!