作者clarkman (凉雨)
看板C_and_CPP
标题[问题] 全域变数
时间Sun Feb 15 23:55:27 2009
我在写一个简单的打地鼠
可是分数 num 每次在空跑了几轮後就会莫名地变成极大的数
我和同学找了很久都找不到原因
不知道是什麽原因
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <conio.h>
void creat(void);
void display(void);
void hit(void);
int num=0; // 分数跑过几轮後会变很大
char mouse[8]={0};
int main(void)
{
int count=0;
srand(time(NULL));
while(1)
{
creat(); //建立图形
while(1)
{
hit(); //检查是否按键
count++;
if(count==1)//原定40000
{
system("cls");
display(); //显示
count=0;
break;
}
}
system("cls");
}
return 0;
}
void creat(void)
{
int number;
int a,b,c,d;
memset(mouse,'0',8);
number=rand()%5; //随机取地鼠只数
a=rand()%8; //随机取地鼠出现的地点
b=( (a*2501+35)-37 )%8; //乱取
c=( (b*2083+90)-36 )%8;
d=( (c*1779+11)-39 )%8;
if(number==1)
mouse[a]='1';
else if(number==2)
{
mouse[a]='1';
mouse[b]='1';
}
else if(number==3)
{
mouse[a]='1';
mouse[b]='1';
mouse[c]='1';
}
else if(number==4)
{
mouse[a]='1';
mouse[b]='1';
mouse[c]='1';
mouse[d]='1';
}
display();
}
void display()
{
int i;
for(i=0;i<8;i++)
{
if(i==4)
printf("\n");
if(mouse[i]=='0') //没地鼠
printf("○ ");
else if(mouse[i]=='1') //有地鼠
printf(" § ");
else if(mouse[i]=='2') //打到地鼠
printf("hit! ");
}
printf("\n\n得分:%d\n",num);
}
void hit(void)
{
char down=' ';
if( kbhit() ) //检查是否按键
{
down=getch();
if(down=='g' && mouse[0]=='1')
{
num+=10;
mouse[0]='2';
system("cls");
display();
}
if(down=='h' && mouse[1]=='1')
{
num+=10;
mouse[1]='2';
system("cls");
display();
}
if(down=='j' && mouse[2]=='1')
{
num+=10;
mouse[2]='2';
system("cls");
display();
}
if(down=='k' && mouse[3]=='1')
{
num+=10;
mouse[3]='2';
system("cls");
display();
}
if(down=='v' && mouse[4]=='1')
{
num+=10;
mouse[4]='2';
system("cls");
display();
}
if(down=='b' && mouse[5]=='1')
{
num+=10;
mouse[5]='2';
system("cls");
display();
}
if(down=='n' && mouse[6]=='1')
{
num+=10;
mouse[6]='2';
system("cls");
display();
}
if(down=='m' && mouse[7]=='1')
{
num+=10;
mouse[7]='2';
system("cls");
display();
}
down=' ';
}
}
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 122.116.13.191
1F:推 plover:num一直被用,而且num不应放在外面,num改score语意也会好些 02/15 23:57
2F:推 kikiqqp:num一直被num+ 你要全域宣告num 就要确保重复时有重置 02/16 00:00
3F:→ kikiqqp:除非特殊需求 02/16 00:00
4F:→ clarkman:我想请问当我没按键,kbhit()会回传0,就进不去if 02/16 00:04
5F:→ clarkman:这时候为什麽会改到num?? 我在其他地方没有改变num的值 02/16 00:05
6F:→ clarkman:我等等会把他改成区域变数 02/16 00:05
7F:→ clarkman:修改为区域变数後确实不会乱跑了^^...不过还是很好奇 02/16 00:15
8F:→ clarkman:为什麽之前的函式会一直跑num+=10?? 02/16 00:15
9F:推 yoco315:教你,你设一个 watch 点在本来全域的 num 02/16 02:27
10F:→ yoco315:这样当变数发生变动的时候,程式就会暂停 02/16 02:27
11F:→ yoco315:你就可以看到到底是谁在改他… 02/16 02:28
12F:→ yoco315:但是这样也会拦截到你自己正常的改动 02/16 02:28
13F:→ yoco315:记得把 watch 加上条件式…这样就可以抓到异常变动处了 02/16 02:28
14F:推 StubbornLin:为什麽全域变数邪恶? 因为行程式都可能是凶手 02/16 09:52
15F:→ StubbornLin:你的程式码有三千行 嫌疑犯就有三千行 02/16 10:21
16F:→ clarkman:了解~~感谢大家^^...我会少用全域变数 02/16 10:44
17F:推 adamkk:-1 % 8 == -1 你rand 的东西有可能变负的 02/17 11:25