Flood it 游戏,尝试几次后崩溃
Flood it game, crash after some tries
任务是在 20x60 游戏中创建一个 flood-it 游戏,从左上角开始。为方便起见,使用数字代替颜色。
因此,代码似乎在某一点上运行良好。
但是经过一定数量的回合后,播放器播放然后它只是崩溃(“...停止工作”)消息。
这是代码:
#include <stdio.h>
#include <stdlib.h>
int k=0,l=0;
void BoardMaking(int A[20][60]){
int i,j;
srand(time(0));
for(i=0;i<20;i++){
for(j=0;j<60;j++){
A[i][j]=rand()%5 +1;
}
}
}
void Print_Board(int A[20][60]){
int i,j;
for(i=0;i<20;i++){
for(j=0;j<60;j++){
printf("%d",A[i][j]);
}
printf("\n");
}
}
int Player(){
int x;
printf("\ngive a number between 1-5\n");
scanf("%d",&x);
return x;
}
void Change(int A[20][60],int y,int x){
A[k][l]=x;
if(A[k][l+1]==y){
A[k][l+1]=x;
l++;
Change(A,y,x);
}
if(A[k][l-1]==y){
A[k][l-1]=x;
l--;
Change(A,y,x);
}
if(A[k-1][l]==y){
A[k-1][l]=x;
k--;
Change(A,y,x);
}
if(A[k+1][l]==y){
A[k+1][l]=x;
k++;
Change(A,y,x);
}
k=0;l=0;
}
int main(){
int y,x;
int A[20][60];
BoardMaking(A);
while(1){
Print_Board(A);
x=Player();
if (x==A[0][0]){
printf("give another number \n");
}
else if (x!=A[0][0])
{
y=A[0][0];
Change(A,y,x);
}
}
return 0;
}
您的 Change
函数中没有绑定检查。
当 k = 0
和 l = 0
这种情况(第 50 行)if(A[k-1][l]==y){
访问 A[-1][0]
时,它在分配的内存之外。
这是检查 k
和 l
的非法值的方法。 (我不完全确定你的代码是否正常工作,但它不会因以下更改而崩溃。)
void Change(int A[20][60],int y,int x){
A[k][l]=x;
if(l < 59 && A[k][l+1]==y){
A[k][l+1]=x;
l++;
Change(A,y,x);
}
if(l > 0 && A[k][l-1]==y){
A[k][l-1]=x;
l--;
Change(A,y,x);
}
if(k > 0 && A[k-1][l]==y){
A[k-1][l]=x;
k--;
Change(A,y,x);
}
if(k < 19 && A[k+1][l]==y){
A[k+1][l]=x;
k++;
Change(A,y,x);
}
k=0;l=0;
}
谢谢@RuudHelderman 建议对右边框和底边框进行绑定检查。
任务是在 20x60 游戏中创建一个 flood-it 游戏,从左上角开始。为方便起见,使用数字代替颜色。 因此,代码似乎在某一点上运行良好。 但是经过一定数量的回合后,播放器播放然后它只是崩溃(“...停止工作”)消息。 这是代码:
#include <stdio.h>
#include <stdlib.h>
int k=0,l=0;
void BoardMaking(int A[20][60]){
int i,j;
srand(time(0));
for(i=0;i<20;i++){
for(j=0;j<60;j++){
A[i][j]=rand()%5 +1;
}
}
}
void Print_Board(int A[20][60]){
int i,j;
for(i=0;i<20;i++){
for(j=0;j<60;j++){
printf("%d",A[i][j]);
}
printf("\n");
}
}
int Player(){
int x;
printf("\ngive a number between 1-5\n");
scanf("%d",&x);
return x;
}
void Change(int A[20][60],int y,int x){
A[k][l]=x;
if(A[k][l+1]==y){
A[k][l+1]=x;
l++;
Change(A,y,x);
}
if(A[k][l-1]==y){
A[k][l-1]=x;
l--;
Change(A,y,x);
}
if(A[k-1][l]==y){
A[k-1][l]=x;
k--;
Change(A,y,x);
}
if(A[k+1][l]==y){
A[k+1][l]=x;
k++;
Change(A,y,x);
}
k=0;l=0;
}
int main(){
int y,x;
int A[20][60];
BoardMaking(A);
while(1){
Print_Board(A);
x=Player();
if (x==A[0][0]){
printf("give another number \n");
}
else if (x!=A[0][0])
{
y=A[0][0];
Change(A,y,x);
}
}
return 0;
}
您的 Change
函数中没有绑定检查。
当 k = 0
和 l = 0
这种情况(第 50 行)if(A[k-1][l]==y){
访问 A[-1][0]
时,它在分配的内存之外。
这是检查 k
和 l
的非法值的方法。 (我不完全确定你的代码是否正常工作,但它不会因以下更改而崩溃。)
void Change(int A[20][60],int y,int x){
A[k][l]=x;
if(l < 59 && A[k][l+1]==y){
A[k][l+1]=x;
l++;
Change(A,y,x);
}
if(l > 0 && A[k][l-1]==y){
A[k][l-1]=x;
l--;
Change(A,y,x);
}
if(k > 0 && A[k-1][l]==y){
A[k-1][l]=x;
k--;
Change(A,y,x);
}
if(k < 19 && A[k+1][l]==y){
A[k+1][l]=x;
k++;
Change(A,y,x);
}
k=0;l=0;
}
谢谢@RuudHelderman 建议对右边框和底边框进行绑定检查。