关于输入关键字?
程序代码: 快学了一个月的C语言了,最近想写一个以前小霸王,上面的坦克大战,再发射子弹的代码上遇到了一个小麻烦。
我是用getch(),来接受键盘的控制的。
比如:
1 当我用'j'来接受发射子弹的时候,然后程序进入打印清除的循环。(这个时候我必须等到子弹发出去,消失后才能,移动自己的人物)
2 当子弹在移动的过程中,我如果按方向键移动的话,人物不会重新打印,而是记录按键,等到子弹循环消失后,直接打印在,记录按键最后一个上(瞬移)
3 是我逻辑错误还是没有用对?(getch())?;
4 希望大家多提提意见_格式_排版_还有各种不好的地方都提出来;
#include <stdio.h>
#include<conio.h>
#include<windows.h>
#include<time.h>
#include<stdlib.h>
int IF(int (*arr)[20]);
void Move(int x,int y)
{
HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos= {x, y};
SetConsoleCursorPosition(hOut, pos);
}
void Put(int (*arr)[20])//打印地图
{
int x=1,y=1;
int i,j;
arr[x][y]=2;
for (i=0;i<20;i++)
{
for (j=0;j<20;j++)
{
if (arr[i][j]==1)
printf("■");
if (arr[i][j]==2)
printf("¤");
if (arr[i][j]==0)
printf(" ");
if (arr[i][j]==3)
printf("◎");
if (arr[i][j]==5)
printf("〓");
if (arr[i][j]==6)
printf("▲");
if (arr[i][j]==7)
printf("△");
if (arr[i][j]==8)
printf("¤");
if (arr[i][j]==9)
printf("▲");
}
printf("\n");
}
}
void character(char n1,int (*arr)[20],int *x1,int *y1) //传数组的首地址,
{
int x=*x1,y=*y1;
switch(n1)
{
case 'w':case'W': //上
if(arr[*x1-1][*y1]==1||arr[*x1-1][*y1]==7||arr[*x1-1][*y1]==8)
{
break;
}
arr[(*x1)--][*y1]=2;
arr[*x1+1][*y1]=0;
break;
case's':case'S': //下
if (arr[*x1+1][*y1]==1||arr[*x1+1][*y1]==7||arr[*x1+1][*y1]==8)
{
break;
}
arr[(*x1)++][*y1]=2; //(*x1)++加括号
arr[*x1-1][*y1]=0;
break;
case'a':case'A': //左
if(arr[*x1][*y1-1]==1||arr[*x1][*y1-1]==7||arr[*x1][*y1-1]==8)
{
break;
}
arr[*x1][(*y1)--]=2;
arr[*x1][*y1+1]=0;
break;
case'd':case'D': //右
if(arr[*x1][*y1+1]==1||arr[*x1][*y1+1]==7||arr[*x1][*y1+1]==8)
{
break;
}
arr[*x1][(*y1)++]=2;
arr[*x1][*y1-1]=0;
break;
case'k':case'K':
if (arr[*x1+1][*y1]!=1)
{
int i=1;
while(arr[*x1+i][*y1]!=1)
{
if (arr[*x1+i][*y1]==7)
{
arr[*x1+i][*y1]=0;
Move (*y1*2,*x1+i);printf(" ");
break;
}
arr[*x1][*y1]=2;
Sleep(200);
Move(*y1*2,*x1);printf("¤");
arr[*x1+i][*y1]=10;
Move(*y1*2,*x1+i);printf("☆");
arr[*x1+i-1][*y1]=0;
Move(*y1*2,*x1+i-1);printf(" ");
i++;
}
Move(*y1*2,*x1+i-1);printf(" ");
}break;
case'i':case'I':
if (arr[*x1-1][*y1]!=1)
{
int i=1;
while(arr[*x1-i][*y1]!=1)
{
if (arr[*x1-i][*y1]==7)
{
arr[*x1-i][*y1]=0;
Move(*y1*2,*x1-i);printf(" ");
break;
}
arr[*x1][*y1]=2;
Move(*y1*2,*x1);printf("¤");
Sleep(200);
arr[*x1-i][*y1]=10;
Move(*y1*2,*x1-i);printf("☆");
arr[*x1-i+1][*y1]=0;
Move(*y1*2,*x1-i+1);printf(" ");
i++;
}
Move(*y1*2,*x1-i+1);printf(" ");
}break;
case'j':case'J':
if (arr[*x1][*y1-1]!=1)
{
int i=1;
while (arr[*x1][*y1-i]!=1)
{
if (arr[*x1][*y1-i]==7)
{
arr[*x1][*y1-i]=0;
Move ((*y1-i)*2,*x1);printf(" ");
break;
}
arr[*x1][*y1]=2;
Sleep(200);
Move(*y1*2,*x1);printf("¤");
arr[*x1][*y1-i]=10;
Move((*y1-i)*2,*x1);printf("☆");
arr[*x1][*y1-i+1]=0;
Move((*y1-i+1)*2,*x1);printf(" ");
i++;
}
Move((*y1-i+1)*2,*x1);printf(" ");
}break;
case'l':case'L':
if (arr[*x1][*y1+1]!=1)
{
int i=2;
while (arr[*x1][*y1+i]!=1)
{
if(arr[*x1][*y1+i]==7)
{
arr[*x1][*y1+i]=0;
Move((*y1+i)*2,*x1);printf(" ");
break;
}
arr[*x1][*y1]=2;
Sleep(200);
Move(*y1*2,*x1);printf("¤");
arr[*x1][*y1+i]=10;
Move((*y1+i)*2,*x1);printf("☆");
arr[*x1][*y1+i-1]=0;
if(arr[*x1][*y1+i-1]==0)
Move((*y1+i-1)*2,*x1);printf(" ");
i++;
}
Move((*y1+i-1)*2,*x1);printf(" ");
}
}
Move(y*2,x);printf(" ");//老人物坐标
Move((*y1)*2,*x1);printf("¤");//新任务坐标
}
void Random(int (*arr)[20])//随机怪物
{
int n=1,j;
int sum=0;
srand((unsigned)time(0));
while(n)
{
j=1+(unsigned)(20.0*rand()/(RAND_MAX+1.0));
n=1+(unsigned)(20.0*rand()/(RAND_MAX+1.0));
if(arr[j][n]==0)
{
arr[j][n]=7;
sum++;
}
if(sum==20)
{
n=0;
}
}
}
void main()
{
int open=1;
int x=1,y=1;
char n;
int num=1;
static int arr[20][20]={ //静态变量static 改变数组值后,将保存新的值
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},//6(1,6)
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},//6(12,8)
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,1},//7(17,2) 8(17,18)
{1,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,1},//7(18,6)
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
};
Random(arr);//随机怪物
Put(arr);//打印地图
while(open)
{
n=getch();
character(n,arr,&x,&y);
open=IF(arr);
if (open==0)
{
Move(0,20);printf("Game ovre");
}
Move(40,1);printf("\t坦克大战(史前版)");
Move(40,2);printf("\tw,s,a,d(前后左右)");
Move(40,3);printf("\ti,k,j,l(前后左右各攻击)");
Move(40,19);printf("\n\n\n");
}
}
int IF(int (*arr)[20])
{
int i,j,num=0;
for (i=0;i<20;i++)
for (j=0;j<20;j++)
if (arr[i][j]==7)
{
num=1;
}
return num;
}[ 本帖最后由 Mrrr 于 2012-11-14 19:02 编辑 ]









学了一个月就这样?厉害!
