c语言,为什么我定义了一个全局变量,总是会自动变为零?

问题描述

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

c语言,为什么我定义了一个全局变量,总是会自动变为零?的相关文章

javascript-JS中定义的一个全局变量为何提示没有正确定义eg?

问题描述 JS中定义的一个全局变量为何提示没有正确定义eg? <script type="text/javascript"> var eg={};/*声明一个对象,当做命名空间来使用*/ //定义一个公共函数来获取指定id元素,减少代码量,提高代码复用率// var eg.$ = function (id){ return document.getElementById(id); }; eg.regCheck = function(){ var uid = eg.$(&qu

设计模式 java语言-如何把自己定义的一个语言转换到java语言。想请问有人知道用什么设计模式比较好不?

问题描述 如何把自己定义的一个语言转换到java语言.想请问有人知道用什么设计模式比较好不? 如何把自己定义的一个语言转换到java语言.想请问有人知道用什么设计模式比较好不?

Go语言结构体定义和使用方法_Golang

本文实例讲述了Go语言结构体定义和使用方法.分享给大家供大家参考.具体分析如下: 一个结构体(struct)就是一个字段的集合. (而 type 定义跟其字面意思相符.) 复制代码 代码如下: package main import "fmt" type Vertex struct {     X int     Y int } func main() {     fmt.Println(Vertex{1, 2}) } 结构体字段使用点号来访问. 复制代码 代码如下: package

Go语言中常量定义方法实例分析_Golang

本文实例讲述了Go语言中常量定义方法.分享给大家供大家参考.具体分析如下: 常量的定义与变量类似,只不过使用 const 关键字. 常量可以是字符.字符串.布尔或数字类型的值. 复制代码 代码如下: package main import "fmt" const Pi = 3.14 func main() {     const World = "世界"     fmt.Println("Hello", World)     fmt.Printl

C++语言如何用数组实现一个二叉树?

问题描述 C++语言如何用数组实现一个二叉树? 提示,二叉树的第n层可以用数组的第2^(n-1)~2^n-1表示.定义一个二叉树,并且实现对它的遍历. 解决方案 struct node { int l,r; }; struct node tree[100]; int path[100]; int ans; void init() { int i; ans = 0; for(i = 0 ; i < 100 ; i ++ ) tree[i].l = tree[i].r = -1,path[i] =

gcc-.h文件里定义了一个类,怎么链接到so文件里?

问题描述 .h文件里定义了一个类,怎么链接到so文件里? A.h里定义了class B C.cpp里include A.h并且引用了B类,声明B类B b: G++ C.cpp -o X.so 为什么用JNI调用X.so运行时,错误提示找不到B类? 解决方案 先用nm等查看一下是否有导出类B来,通过JNI,一般最好是调用导出的函数,直接调用导出类,跨语言不容易处理 解决方案二: gcc hello.c-I../include -fPIC -shared -o libhello.so 很明显,"G+

enum-C# 一个全局变量总是自动变成初始值

问题描述 C# 一个全局变量总是自动变成初始值 C# 一个全局变量总是自动变成初始值 如题,在class中定义了一个枚举类型的变量, public partial class XXXXDlg : Form { private enum POSOFITEMICONSTYLE { POSLARGEICONS, POSSMALLICONS, POSLIST, POSTITLE, POSDETAILS }; private static POSOFITEMICONSTYLE iCurrentSelect

vs2010,实验数据保存成自己定义的一个格式*tk,如何调用

问题描述 vs2010,实验数据保存成自己定义的一个格式*tk,如何调用 vs2010,实验数据保存成自己定义的一个格式*tk,如何调用

C语言有谁编过一个简单的系统吗?学生信息管理系统 求助!用C++编程

问题描述 C语言有谁编过一个简单的系统吗?学生信息管理系统 求助!用C++编程 各项功能说明 (1)学生基本信息的录入和保存: 这部分的功能主要包括信息的录入和保存和总分.平均分的计算,首先按程序提示输入所要输入的学生人数,接着是分别输入有关学生的相关信息包括学号.姓名.年龄.性别以及学生各科成绩的分数等.在录入数据的同时,系统将对信息的合法性进行检验(学号范围为100~200.姓名不限.年龄为15~50岁.性别可输入m或f.各科成绩均限定在0~100之间),若用户录入了不合法的数据系统将会作出