当前位置:首页 » 编程语言 » c语言移动小怪
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言移动小怪

发布时间: 2022-10-23 04:59:11

A. c语言做塔防游戏小怪的生命值怎么完成

小怪数量不定,各自具有一系列属性。所以小怪要定义成结构,结构成员包括生命值,等级,移动速度,位置坐标等等。每轮开始创建一组小怪的结构变量并组成链表,(塔也用链表创建),游戏本身是个大循环不断检测所有单位状态,在这个循环中不断遍历链表更新单位状态,比如在一次循环中遍历塔和怪的链表,比较两者每个节点的坐标成员值,发现两个坐标距离小于等于塔的射程,就表示被攻击,然后根据两者其它成员值修改怪的生命值,要是生命值为0,就从怪链表中删除这个节点(将该节点从链表中断开并释放其空间)。

B. C语言(移动小球问题) 我的代码为什么不能够输出呢编译并运行的时候并没有输出

有明显的两个问题:

  1. k<i<l这种写法是不能达到目的的,似乎应该是k<i && i<l才对。其他几个类似的都得这样改。

  2. 逻辑有错,比如在前面输入正确的情况下若输入1 1 4,那么k就是1,可是if分支里找不到k==1的出路,只有k>1和k<1的情况。

  3. 其余细节未看。提供一个作参考——

#include"stdio.h"
intmain(intargc,char*argv[]){
intt,n,m,j,k,l,i,x,y,q,a[1000]={0};//删除数组c
scanf("%d",&t);
for(t;t>0;t--){
scanf("%d%d",&n,&m);//n个数,m条指令
for(i=0;i<n;a[i]=1+i++);
while(m--){
if(scanf("%d%d%d",&j,&k,&l)!=3||j<1||j>2||k<1||k>n||l<1||l>n||k==l){//if判断保证输入正确且无非法数据
printf("Inputerror,exit... ");
return0;
}
for(i=0;i<n;i++){//求出要移动目标和目的目标的下标而不是值
if(k==a[i])
x=i;
if(l==a[i])
y=i;
}
if(q=a[x],j==1){//移到左边的情况
if(x<y){//目标在前目的在后
for(i=x+1;i<y;a[i-1]=a[i++]);
a[y-1]=q;
}
elseif(y<x){//目标在后目的在前
for(i=x;i>y;a[i--]=a[i-1]);
a[y]=q;
}
}
elseif(j==2){//移到右边的情况
if(x<y){//目标在前目的在后
for(i=x+1;i<=y;a[i-1]=a[i++]);
a[y]=q;
}
elseif(y<x){//目标在后目的在前
for(i=x;i>y;a[i--]=a[i-1]);
a[y+1]=q;
}
}
for(i=0;i<n;i++)
printf("%d",a[i]);
printf(" ");
}
}
return0;
}

运行样例:

C. C语言小题,这个图片里面的小人是输出,怎么用C语言让这个小人从右往左移动呢

其实就是输出4行数据。

前面有若干个空格。所以要想让它移动的话,执行两步
清屏
重新输出4行数据,每行前面空格减少一位。

这样就向左移动了一位了。
循环执行 就是不停向左,类似的 还可以上下右移动。

D. 用C语言编译一个简单的物体移动程序

#include<reg52.h>

sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;

unsigned char code LedChar[]={
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};
unsigned char LedBuff[7]={
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};
unsigned char code image[30][8]={
{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}, //动画帧1
{0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F}, //动画帧2
{0xFF,0x3F,0x7F,0x7F,0x7F,0x7F,0x7F,0x3F}, //动画帧3
{0xFF,0x1F,0x3F,0x3F,0x3F,0x3F,0x3F,0x1F}, //动画帧4
{0xFF,0x0F,0x9F,0x9F,0x9F,0x9F,0x9F,0x0F}, //动画帧5
{0xFF,0x87,0xCF,0xCF,0xCF,0xCF,0xCF,0x87}, //动画帧6
{0xFF,0xC3,0xE7,0xE7,0xE7,0xE7,0xE7,0xC3}, //动画帧7
{0xFF,0xE1,0x73,0x73,0x73,0xF3,0xF3,0xE1}, //动画帧8
{0xFF,0x70,0x39,0x39,0x39,0x79,0xF9,0xF0}, //动画帧9
{0xFF,0x38,0x1C,0x1C,0x1C,0x3C,0x7C,0xF8}, //动画帧10
{0xFF,0x9C,0x0E,0x0E,0x0E,0x1E,0x3E,0x7C}, //动画帧11
{0xFF,0xCE,0x07,0x07,0x07,0x0F,0x1F,0x3E}, //动画帧12
{0xFF,0x67,0x03,0x03,0x03,0x07,0x0F,0x9F}, //动画帧13
{0xFF,0x33,0x01,0x01,0x01,0x03,0x87,0xCF}, //动画帧14
{0xFF,0x99,0x00,0x00,0x00,0x81,0xC3,0xE7}, //动画帧15
{0xFF,0xCC,0x80,0x80,0x80,0xC0,0xE1,0xF3}, //动画帧16
{0xFF,0xE6,0xC0,0xC0,0xC0,0xE0,0xF0,0xF9}, //动画帧17
{0xFF,0x73,0x60,0x60,0x60,0x70,0x78,0xFC}, //动画帧18
{0xFF,0x39,0x30,0x30,0x30,0x38,0x3C,0x7E}, //动画帧19
{0xFF,0x9C,0x98,0x98,0x98,0x9C,0x1E,0x3F}, //动画帧20
{0xFF,0xCE,0xCC,0xCC,0xCC,0xCE,0x0F,0x1F}, //动画帧21
{0xFF,0x67,0x66,0x66,0x66,0x67,0x07,0x0F}, //动画帧22
{0xFF,0x33,0x33,0x33,0x33,0x33,0x03,0x87}, //动画帧23
{0xFF,0x99,0x99,0x99,0x99,0x99,0x81,0xC3}, //动画帧24
{0xFF,0xCC,0xCC,0xCC,0xCC,0xCC,0xC0,0xE1}, //动画帧25
{0xFF,0xE6,0xE6,0xE6,0xE6,0xE6,0xE0,0xF0}, //动画帧26
{0xFF,0xF3,0xF3,0xF3,0xF3,0xF3,0xF0,0xF8}, //动画帧27
{0xFF,0xF9,0xF9,0xF9,0xF9,0xF9,0xF8,0xFC}, //动画帧28
{0xFF,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFE}, //动画帧29
{0xFF,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF} //动画帧30
};
unsigned char index=0;

void main()
{
unsigned int j = 0;
unsigned int cnt = 0;
unsigned long sec = 0;
unsigned char i = 0;

ENLED = 0;
ADDR3 = 1;
TMOD = 0x01;
TH0 = 0xFC;
TL0 = 0x67;
TR0 = 1;

while(1)
{
if(TF0 ==1)
{
TF0 = 0;
TH0 = 0xFC;
TL0 = 0x67;
cnt++;
sec=0x1e240;
switch(j)
{ case 0: LedBuff[0] = LedChar[sec%10];j++;break;
case 1:LedBuff[1] = LedChar[sec/10%10];j++;break;
case 2:LedBuff[2] = LedChar[sec/100%10];j++;break;
case 3:LedBuff[3] = LedChar[sec/1000%10];j++;break;
case 4:LedBuff[4] = LedChar[sec/10000%10];j++;break;
case 5:LedBuff[5] = LedChar[sec/100000%10] ;j=0;break;
default:break;
}
if(cnt>1000)
{ i++;
cnt=0;
}
switch(i)
{
case 0: ADDR2=0; ADDR1=0; ADDR0=0; P0=LedBuff[0];break;
case 1: ADDR2=0; ADDR1=0; ADDR0=1; P0=LedBuff[1];break;
case 2: ADDR2=0; ADDR1=1; ADDR0=0; P0=LedBuff[2];break;
case 3: ADDR2=0; ADDR1=1; ADDR0=1; P0=LedBuff[3];break;
case 4: ADDR2=1; ADDR1=0; ADDR0=0; P0=LedBuff[4];break;
case 5: ADDR2=1; ADDR1=0; ADDR0=1; P0=LedBuff[5];break;
case 6: ADDR2=1; ADDR1=1; ADDR0=0; P0=0x01;break;
case 7: ADDR2=1; ADDR1=1; ADDR0=0; P0=0xFF;break;
default:break;
}
if(i>8)
{

ADDR3=0;
EA=1;
ENLED=0;
TH0=0xFC;
TL0=0x67;
TR0=1;
ET0=1;
if(index>=30)
{i=0;ADDR3=1;EA=0;ET0=0;index=0;}
}
}
}}
void InterruptTimer0() interrupt 1
{
static unsigned char k=0;
static unsigned char tmr=0;
TH0=0xFC;
TL0=0x67;
P0=0xFF;
switch(k)
{
case 0: ADDR2=0; ADDR1=0; ADDR0=0; k++; P0=image[index][0]; break;
case 1: ADDR2=0; ADDR1=0; ADDR0=1; k++; P0=image[index][1]; break;
case 2: ADDR2=0; ADDR1=1; ADDR0=0; k++; P0=image[index][2]; break;
case 3: ADDR2=0; ADDR1=1; ADDR0=1; k++; P0=image[index][3]; break;
case 4: ADDR2=1; ADDR1=0; ADDR0=0; k++; P0=image[index][4]; break;
case 5: ADDR2=1; ADDR1=0; ADDR0=1; k++; P0=image[index][5]; break;
case 6: ADDR2=1; ADDR1=1; ADDR0=0; k++; P0=image[index][6]; break;
case 7: ADDR2=1; ADDR1=1; ADDR0=1; k=0; P0=image[index][7]; break;
default: break;
}
tmr++;
if(tmr>250)
{
tmr=0;
index++;
}
}

E. c语言中怎样实现对物体的移动

程序需要分两个部分,一个是计算位移的,一个是画图的,首先定义隔多少时间扫描一次键盘,比如是1ms,则扫描的时候,如果W被按下,则消除现在位置的图形,将当前坐标值向上移动也就是将纵坐标减少一个单位,在扫描,如果发现2ms内没有W被按下则在现在的位置重新绘制物体图形

ps:绘图时个麻烦的事情,至少在C语言里是这样,

F. C语言贪吃蛇移动

for(i=snake.node-1;i>0;i--)/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/
{
snake.x[i]=snake.x[i-1];
snake.y[i]=snake.y[i-1];
}

注释已经解释的很清楚了,不知道你还要问什么?

G. c++ 帧同步 小怪逻辑怎么实现

C语言的逻辑或运算符为||,这并不是一个字符,而是由两个|组成的。所以在打||的时候,需要连续打两个|。|在键盘右上角,backspace下面有一个印有|和\的键。按住shift同时按这个键,就可以打出|了。在打||的时候,可以按住shift,再按|键两次,然后抬起shift键即可。逻辑或的运算形式为:expr1 || expr2其运算规则为:当expr1与expr2均为假时,结果为假。否则结果为真。

H. C语言中怎么控制小人的移动

每次循环的时候,检测按键,如果有按键按下,就改变小人的坐标,下次重绘的时候,使用新的坐标,就相当于小人运动了

I. c语言贪吃蛇代码问题,按左右按一下不能一直移动,请帮忙改下

/*
program by wlfryq [email protected]
*/
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#include <time.h>
#include <direct.h>
#include <stdbool.h>

#define W 80 //屏幕宽度
#define H 37 //屏幕高度
#define SNAKE_ALL_LENGTH 200 //蛇身最长为

void CALLBACK TimerProc(
HWND hwnd,
UINT message,
UINT idTimer,
DWORD dwTime);
void start();

struct MYPOINT
{
int x;
int y;
} s[SNAKE_ALL_LENGTH] , head, end, food;

int max_count=0; //历史最高分,如果count>max_count, 则max_count=count
int old_max_count=0; //历史最高分,不会变动, 用于死亡时判断max_count是否大于old_max_count,如果大于,则写入文件
int count=0; //得分
int len=20; //当前蛇身长度
int direct=0; //方向: 0-向右, 1-向下, 2-向左, 3-向上
int speed=200; //速度:毫秒
bool isfood=false; //食物是否存在
int timerID;
bool stop=false; //暂停
char* ini_path; //数据文件绝对路径
void setxy(int x, int y) //设置CMD窗口光标位置
{
COORD coord = {x, y};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}

void hide_cursor() //隐藏CMD窗口光标
{
CONSOLE_CURSOR_INFO cci;
cci.bVisible = FALSE;
cci.dwSize = sizeof(cci);
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorInfo(handle, &cci);
}

void set_food() //设置食物坐标
{
if(isfood==true)
{
return;
}
int x,y,i;
bool flag=false;
while(1)
{
flag=false;
x=rand()%(W-14)+6;
y=rand()%(H-12)+6;
for(i=0;i<len;i++) //判断食物是否落在蛇身上
{
if(s[i].x==x && s[i].y==y)
{
flag=true;
break;
}
}
if(flag==true)
{
continue;
}
else
{
food.x=x;
food.y=y;
break;
}
}
setxy(food.x,food.y);
printf("*");
isfood=true;
}

void check_board() //检测蛇身是否越界和相交
{
int i;
if(s[0].x>=W-3 || s[0].x<=2 || s[0].y>=H-1 || s[0].y<=2)
{
setxy(W/2-5,0);
printf("game over\n");
stop=true;
if(old_max_count<max_count)
{
char t[5]={'\0'};
sprintf(t,"%d",max_count);
WritePrivateProfileString("MAX_COUNT","max_count",t,ini_path);
}
}
for(i=1;i<len;i++)
{
if(s[i].x==s[0].x && s[i].y==s[0].y)
{
setxy(W/2-5,0);
printf("game over\n");
stop=true;
if(old_max_count<max_count)
{
char t[5]={'\0'};
sprintf(t,"%d",max_count);
WritePrivateProfileString("MAX_COUNT","max_count",t,ini_path);
}
break;
}
}
if(stop==true)
{
KillTimer(NULL,timerID);
int c;
while(1)
{
fflush(stdin);
c=_getch();
if(c=='n' || c=='N')
{
start();
}
else if(c=='q' || c=='Q')
{
exit(0);
}
else continue;
}
}
}

void printf_body(bool is_first) //打印蛇身
{
if(is_first==true) //如果是第一次打印蛇身
{
int i;
for(i=0;i<len;i++)
{
setxy(s[i].x,s[i].y);
printf("O");
}
}
else //如果不是第一次打印蛇身
{
setxy(end.x,end.y);
printf(" ");
setxy(s[0].x,s[0].y);
printf("O");
}
if(food.x==s[0].x && food.y==s[0].y) //如果吃到食物
{
count++;
isfood=false; //重置食物
set_food();
len++;
KillTimer(NULL,timerID);
if(speed>100) speed-=10;
else if(speed>50) speed-=5;
else if(speed>30) speed-=2;
else if(speed>16) speed-=1;
else ;
setxy(0,0);
if(max_count<count) max_count=count;
printf(" speed : %d ms score : %d best score:%d ",speed,count,max_count);
timerID=SetTimer(NULL,001,speed,TimerProc);
}
}

void change_body_pos(int x, int y) //改变蛇身的坐标数据
{
end.x=s[len-1].x;
end.y=s[len-1].y;
int i;
for(i=len-1;i>0;i--)
{
s[i].x=s[i-1].x;
s[i].y=s[i-1].y;
}
s[0].x=x;
s[0].y=y;
}
void CALLBACK TimerProc(
HWND hwnd,
UINT message,
UINT idTimer,
DWORD dwTime)
{
switch(direct)
{
case 0:
head.x++;
change_body_pos(head.x,head.y);
printf_body(false);
check_board();
break;
case 1:
head.y++;
change_body_pos(head.x,head.y);
printf_body(false);
check_board();
break;
case 2:
head.x--;
change_body_pos(head.x,head.y);
printf_body(false);
check_board();
break;
case 3:
head.y--;
change_body_pos(head.x,head.y);
printf_body(false);
check_board();
break;
}
}

void start()
{
int i;
KillTimer(NULL,timerID);
count=0; //得分
len=20; //当前蛇身长度
direct=0; //方向: 0-向右, 1-向下, 2-向左, 3-向上
speed=200; //速度:毫秒
isfood=false; //食物是否存在
stop=false; //停止
system("cls");
setxy(1,4);
printf("┌─────────────────────────────────────┐\n");
for(i=0;i<33;i++)
{
printf(" │ │\n");
}
printf(" └─────────────────────────────────────┘");
head.x=len-1+5;
head.y=H/2;
for(i=0;i<len;i++)
{
s[i].x=head.x-i;
s[i].y=head.y;
}
setxy(0,0);
printf(" speed : %d:ms score : %d best score:%d ",speed,count,max_count);
printf_body(true);
set_food();
timerID=SetTimer(NULL,001,speed,TimerProc);
int c;
MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
if(stop==true) break;
if(_kbhit()) //如果按下的是方向键或功能键, _getch()要调用两次,第一次返回0XE0或0
{
fflush(stdin);
c=_getch(); //上: 72 下:80 左:75 右:77
if(c==0XE0 || c==0)
{
c=_getch();
if(c==72 && direct!=1 && direct!=3)
{
direct=3;
}
else if(c==80 && direct!=1 && direct!=3)
{
direct=1;
}
else if(c==75 && direct!=0 && direct!=2)
{
direct=2;
}
else if(c==77 && direct!=0 && direct!=2)
{
direct=0;
}
}
else if(c==' ')
{
setxy(W/2-10,0);
system("pause");
setxy(W/2-10,0);
printf(" ");
}
}
if(msg.message==WM_TIMER)
{
DispatchMessage(&msg);
}
}
}

int main()
{
ini_path=(char*)malloc(sizeof(char)*50);
srand((unsigned)time(0));
getcwd(ini_path,50);//取得当前程序绝对路径
ini_path=strcat(ini_path,"snake.dat");

max_count=GetPrivateProfileInt("MAX_COUNT","max_count",0,ini_path);
old_max_count=max_count;
char cmd[50];
sprintf(cmd,"mode con cols=%d lines=%d\0",W,H);
system(cmd);//改变CMD窗口大小
hide_cursor();
start();
return 0;
}

J. C语言中如何通过WASD控制小球移动

如果需要平滑的按键输入,或者同时按下多个按键,就不能用 getch() 了,需要使用另一个 Windows API 函数:GetAsyncKeyState()。该函数原型如下:
SHORT GetAsyncKeyState( int vKey
// virtual-key code);

vKey 是要检测的按键的虚拟键码,常用的如 VK_UP、VK_DOWN 等,分别表示方向键的上、下等。需要注意:对于 26 个字母的键码,可以直接写 'A'、'B'……,而不要写 VK_A、VK_B。数字键也是,请直接写 '0'、'1'……。全部的 256 种虚拟键码,请参考 MSDN 中的 Virtual-Key Codes。
返回的 SHORT 值,如果最高位为 1,表示该键被按下;否则表示该键弹起。该函数的最低位还可以用来检测开关键(比如大小写锁定键)的状态。作为按键处理,还可以使用 GetKeyState、GetKeyboardState 等函数,详细请参考 MSDN 手册中的 Keyboard Input Functions 部分。