作者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