问题描述
- c语言,为什么我定义了一个全局变量,总是会自动变为零?
-
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<time.h> #include<conio.h> int score=0,move=0,a[4][4]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},temp[5],highest_score=0; void print(void) { int i,j; system("cls"); printf(" ___________________2048________________n"); printf(" ------------how to play?----------n"); printf(" A---left,D-right,W---up,S---down,0---exitn"); printf(" ----------------------------------n"); printf(" highest score:%dn",highest_score); printf(" ----------------------------------n"); printf(" score:%d move:%d n",score,move); for(i=0;i<4;i++) { printf(" |-------------------|n"); printf(" "); for(j=0;j<4;j++) { if(a[i][j]==0) printf("| "); else printf("|%-4d",a[i][j]); if(j==3) printf("|n"); } } printf(" |-------------------|n"); } int add() { int i,j,t=1,change=0; while(t<=3) { for(i=0;i<3;i++) { if(temp[i]==0) { if(temp[i]!=temp[i+1]) change=1; temp[i]=temp[i+1]; temp[i+1]=0; } } t++; } for(i=0;i<3;i++) { if(temp[i]==temp[i+1]) { if(temp[i]!=0) { change=1; score=score+temp[i]; } temp[i]=temp[i]*2; temp[i+1]=0; } } t=1; while(t<=3) { for(i=0;i<3;i++) { if(temp[i]==0) { temp[i]=temp[i+1]; temp[i+1]=0; } } t++; } return change; } int main() { int change=1,gameover=0,i,j; char input; srand((unsigned)time(NULL)); while(gameover==0) { if(change>=1) { do { i=((unsigned)rand())%4; j=((unsigned)rand())%4; }while(a[i][j]!=0); if(((unsigned)rand())%2==0) a[i][j]=2; else a[i][j]=4; } print(); input=getch(); change=0; if(input=='0') { printf("Do you really want to exit this game?Y/Nn"); input=getch(); if(input=='y'||input=='Y') break; } else if(input=='w'||input=='W') { for(j=0;j<4;j++) { for(i=0;i<4;i++) temp[i]=a[i][j]; temp[5]=0; change+=add(); for(i=0;i<4;i++) a[i][j]=temp[i]; } move++; } else if(input=='s'||input=='S') { for(j=0;j<4;j++) { for(i=0;i<4;i++) temp[i]=a[3-i][j]; temp[5]=0; change+=add(); for(i=0;i<4;i++) a[i][j]=temp[3-i]; } move++; } else if(input=='a'||input=='A') { for(i=0;i<4;i++) { for(j=0;j<4;j++) temp[j]=a[i][j]; temp[5]=0; change+=add(); for(j=0;j<4;j++) a[i][j]=temp[j] ; } move++; } else if(input=='d'||input=='D') { for(i=0;i<4;i++) { for(j=0;j<4;j++) temp[j]=a[i][3-j]; temp[5]=0; change+=add(); for(j=0;j<4;j++) a[i][j]=temp[3-j]; } move++; } gameover=1; for(i=0;i<4;i++) for(j=0;j<4;j++) { if(a[i][j]==0) gameover=0; } if(gameover==1) { for(i=0;i<3;i++) for(j=0;j<3;j++) if(a[i][j]==a[i+1][j]||a[i][j]==a[i][j+1]) gameover=0; for(i=0;i<3;i++) if(a[3][i]==a[3][i+1]||a[i][3]==a[i+1][3]) gameover=0; } if(gameover==1) { printf("Do you want to try again?Y/N"); input=getch(); if(input=='Y'||input=='y') { gameover=0; memset(a,0,sizeof(a)); change=1; if(score>highest_score) highest_score=score; score=0; move=0; } else if(input=='n'||input=='N') gameover=1; } } printf("n Game over!n"); getch(); return 0; }
就是highest_score这个全局变量,为什么每次重新开始游戏的时候只在按过Y之后才会显示为score的值,之后一旦进行了一次操作,就右边为了0?而且我发现只要把它改为一个非零的数,就一切正常,这是为什么?
解决方案
是因为你程序里面highest_score=score;是在按了Y之后,其实在gameover=1游戏结束的时候就可以判断和保存最高分了。
解决方案二:
改成这样:
if(gameover==1)
{
...
highest_score=score;
...
if(input=='Y'||input=='y')
{
...
}
...
}
解决方案三:
而且当我把最高分的类型变成double的时候,即使是初值为零也可以
解决方案四:
temp数组长度设置为6就行了,你的最高分在内存中位于数组后面,下面有tem[5] = 0的操作,这就把最高分设置为0了。
解决方案五:
不明白楼主为什么有如下的想法
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{
if(a[i][j]==0){
gameover=0;
}
这个说明只要有一个元素为0,永远都不会对highest_score赋值,因此永远都是0
时间: 2024-09-17 03:19:16