當前位置:首頁 » 編程語言 » 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 部分。