【发布时间】:2015-04-25 09:34:52
【问题描述】:
这将是一款扫雷游戏,但尚未完成。现在,程序应该询问您数组的大小和地雷的数量。然后,它显示隐藏的棋盘(带有数字和“X”作为地雷的棋盘)。就是这样。
问题是程序停止工作并出现此错误
进程返回-1073741819
我认为是内存问题,但我不知道问题出在哪里。
抱歉,因为 cmets 是西班牙语。我将尝试添加一些大写字母以使其易于理解。代码:
main.c
#include <stdio.h>
#include <stdlib.h>
#include "Tablero/tablero.h"
#include <stdbool.h>
int main()
{
int fils, cols, nMinas; //ROWS, COLUMNS, NUMBER OF MINES
printf("Introduzca el número de filas: ");
scanf("%d", &fils);
printf("Introduzca el número de columna: ");
scanf("%d", &cols);
printf("Introduzca el número de minas: ");
scanf("%d", &nMinas);
Tablero tab = crearTablero(fils, cols, nMinas);//CREATE BOARD
mostrarTablero(tab.tabOculto, tab.x, tab.y);//SHOW HIDDEN BOARD
liberarTablero(tab);//FREE THE MEMORY
return 0;
}
tablero.h
#ifndef TABLERO_H_INCLUDED
#define TABLERO_H_INCLUDED
typedef struct{
int x;//ROWS
int y;//COLUMNS
int numMinas;//NUMBER OF MINES
char **tabOculto;//HIDDEN BOARD
char **tabVisible;//VISIBLE BOARD
} Tablero;
Tablero crearTablero(int x, int y, int numMinas);//CREATE BOARD
void mostrarTablero(char **tab, int x, int y);//SHOW BOARD
void liberarTablero(Tablero tab);//FREE BOARD
#endif // TABLERO_H_INCLUDED
tablero.c
#include "tablero.h"
#include <stdio.h>
#include<stdlib.h>
#include<time.h>
//CREATE BOARD
Tablero crearTablero(int x, int y, int numMinas){
Tablero tab;
tab.x = x;//ROWS
tab.y = y;//COLUMNS
tab.numMinas = numMinas;//NUMBER OF MINES
int i, j, k, l;
//Iniciamos y establecemos el contenido del tablero que se va a ver por consola
//INITIATE AND ESTABLISH THE CONTENT OF THE VISIBLE BOARD
tab.tabVisible = (char**) malloc (x * sizeof(char*));
for(i = 0; i < x; i++)
tab.tabVisible[i] = (char*) malloc (y * sizeof(char));
//Rellenamos con asteriscos para marcar la casilla normal
for(i = 0; i < x; i++)
for(j = 0; j < y; j++)
tab.tabVisible[i][j] = '*';
//Iniciamos y establecemos el contenido del tablero oculto, que se irá identificando
//INITIATE AND ESTABLISH THE CONTENT OF THE HIDDEN BOARD
tab.tabOculto = (char**) malloc (x * sizeof(char*));
for(i = 0; i < x; i++)
tab.tabOculto[i] = (char*) malloc (y * sizeof(char));
//Rellenamos con ceros antes de distribuir minas
//FIRST, FILL EVERYTHING WITH '0'
for(i = 0; i < x; i++)
for(j = 0; j < y; j++)
tab.tabOculto[i][j] = '0';
//Introducimos las minas aleatoriamente
//ESTABLISH RANDOM MINE POSITION
srand(time(NULL));
for(i = 0; i < tab.numMinas; i++)
tab.tabOculto[(int)rand() % x][(int)rand() % y] = 'X';
//Ponemos los números según las minas que tengan alrededor
//PUT THE NUMBERS DEPENDING ON THE QUANTITY OF MINES AROUND AND THE POSITION
for(i = 0; i < x; i++)
for(j = 0; j < y; j++)
if(tab.tabOculto[i][j] == 'X'){
//Esquina superior izquierda: de posx, posy a posx+1, posy+1
if(i == 0 && j == 0){
for(k = i; k <= i+1; k++)
for(l = j; l <= j+1; l++)
if(tab.tabOculto[k][l] != 'X')
tab.tabOculto[k][l]++;
}
//Esquina superior derecha: de posx, posy-1 a posx+1, posy
else if(i == 0 && j == y){
for(k = i; k <= i+1; k++)
for(l = j-1; l <= j; l++)
if(tab.tabOculto[k][l] != 'X')
tab.tabOculto[k][l]++;
}
//Esquina inferior izquierda: de posx-1, posy a posx, posy+1
else if(i == x && j == 0){
for(k = i-1; k <= i; k++)
for(l = j; l <= j+1; l++)
if(tab.tabOculto[k][l] != 'X')
tab.tabOculto[k][l]++;
}
//Esquina inferior derecha: de posx-1, posy-1 a posx, posy
else if(i == x && j == y){
for(k = i-1; k <= i; k++)
for(l = j-1; l <= j; l++)
if(tab.tabOculto[k][l] != 'X')
tab.tabOculto[k][l]++;
}
//Borde superior: de posx, posy-1 a posx+1, posy+1
else if(i == 0){
for(k = i; k <= i+1; k++)
for(l = j-1; l <= j+1; l++)
if(tab.tabOculto[k][l] != 'X')
tab.tabOculto[k][l]++;
}
//Borde inferior: de posx-1, posy-1 a posx, posy+1
else if(i == x){
for(k = i-1; k <= i; k++)
for(l = j-1; l <= j+1; l++)
if(tab.tabOculto[k][l] != 'X')
tab.tabOculto[k][l]++;
}
//Borde izquierdo: de posx-1, posy a posx+1, posy+1
else if(j == 0){
for(k = i-1; k <= i+1; k++)
for(l = j; l <= j+1; l++)
if(tab.tabOculto[k][l] != 'X')
tab.tabOculto[k][l]++;
}
//Borde derecho: de posx-1, posy-1 a posx+1, posy
else if(j == y){
for(k = i-1; k <= i+1; k++)
for(l = j-1; l <= j; l++)
if(tab.tabOculto[k][l] != 'X')
tab.tabOculto[k][l]++;
}
//Sin borde: de posx-1, posy-1 a posx+1, posy+1
else{
for(k = i-1; k <= i+1; k++)
for(l = j-1; l <= j+1; l++)
if(tab.tabOculto[k][l] != 'X')
tab.tabOculto[k][l]++;
}
}
return tab;
}
//SHOW BOARD
void mostrarTablero(char **tab, int x, int y){
int i, j;
for(i = 0; i < x; i++){
for(j = 0; j < y; j++)
printf(" %c ", tab[i][j]);
printf("\n");
}
}
//FREE BOARD
void liberarTablero(Tablero tab){
//liberamos la memoria reservada a los arrays
int i;
for(i = 0; i < tab.x; i++){
free(tab.tabOculto[i]);
free(tab.tabVisible[i]);
}
free(tab.tabOculto);
free(tab.tabVisible);
}
【问题讨论】:
-
请避免感谢帮助你的人。也请避免任何“上帝会善待你”的句子。如果您有错误消息,请尝试识别它是从哪个行/函数抛出的。
-
i < x;..k <= i+1..tab.tabOculto[k][l]导致超出数组范围。 -
我会记住这一点。不过,这不是问题。
标签: c memory minesweeper