| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1214 人关注过本帖
标题:我想做一个类似雷电的游戏,现在想要子弹(符号是*)自动从飞机发射出去,怎 ...
只看楼主 加入收藏
菜鸡一只
Rank: 1
等 级:新手上路
帖 子:23
专家分:4
注 册:2014-12-31
结帖率:85.71%
收藏
已结贴  问题点数:20 回复次数:9 
我想做一个类似雷电的游戏,现在想要子弹(符号是*)自动从飞机发射出去,怎么写啊
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<time.h>
#include<conio.h>
int map[50][40];
int x=25,y=30;
int ix,iy;
char key;
int Wait_Time=1;
int t=1;
clock_t Now_Time=clock();

void HideCursor();
void gotoxy(int x,int y);
void draw(int x,int y);
void plane();
void setmap();
void bullet(int x,int y);

void HideCursor()
{
    HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_CURSOR_INFO cursor_info={1,0};
    SetConsoleCursorInfo(hOut,&cursor_info);
}

void gotoxy(int x,int y)
{
    HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);
    COORD pos{x,y};
    SetConsoleCursorPosition(hOut,pos);
}

void draw(int x,int y)
{
    gotoxy(x,y);
    printf("&");
}

void plane()
{
    int Wait_Time=1;
    if(clock()-Now_Time>=Wait_Time)
    {
        srand((unsigned)time(NULL));
        ix=rand()%25;
        iy=10;
        gotoxy(ix,iy);
        printf("$");
        Now_Time=clock();
    }
}

void bullet(int x,int y)
{
        if(clock()-Now_Time>=Wait_Time)
        {
            y=y-1;
            gotoxy(x,y);
            printf("*");
            Now_Time=clock();
        }
}


int main()
{
    system("mode con cols=50 lines=40");
    for(ix=0;ix<50;ix++)
    for(iy=0;iy<40;iy++)
    {
        map[ix][iy]=0;
    }
    draw(x,y);
    HideCursor();
    while(1)
    {
        plane();
        if(kbhit())
        {
            switch(getch())
            {
                case 'w':{gotoxy(x,y);printf(" ");map[x][y]=1;draw(x,--y);break;}
                case 's':{gotoxy(x,y);printf(" ");map[x][y]=1;draw(x,++y);break;}
                case 'a':{gotoxy(x,y);printf(" ");map[x][y]=1;draw(--x,y);break;}
                case 'd':{gotoxy(x,y);printf(" ");map[x][y]=1;draw(++x,y);break;}
            }
            if(map[x][y]==1)
            bullet(x,y);
        }

    }

}
搜索更多相关主题的帖子: include 游戏 
2015-01-10 20:07
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:4 
有点兴趣,帮你弄了个,在vc++6控制台下编译运行成功,你可以运行一下exe看效果。
程序代码:
#include "stdafx.h"
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<time.h>
#include<conio.h>
int map[50][40],oldmap[50][40];
clock_t Now_Time=clock();

void HideCursor();
void gotoxy(int x,int y);

void HideCursor()
{
    HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_CURSOR_INFO cursor_info={1,0};
    SetConsoleCursorInfo(hOut,&cursor_info);
}

void gotoxy(int x,int y)
{
    HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);
    COORD loc={x,y};
    SetConsoleCursorPosition(hOut,loc);
}
void drawmap()
{//画整个图片
    int x,y,j;
    char a;
    for(x=0;x<50;x++)
        for(y=0;y<40;y++)
        {
            gotoxy(x,y);
            j=map[x][y];
            if(j==0)
                a=32;
            if(j==1)
                a=48;
            if(j==2)
                a=42;
            if(map[x][y]!=oldmap[x][y])
                printf("%c",a);
            oldmap[x][y]=map[x][y];
        }
}

void setplane(int x,int y)
{//设置飞机
    int i,j;
    for(i=0;i<50;i++)
        for(j=0;j<40;j++)
            if(map[i][j]==1)
                map[i][j]=0;

    for(i=y;i<(y+6);i++)
        map[x][i]=1;
    for(i=x-3;i<x+4;i++)
        map[i][y+2]=1;
    map[x-1][y+5]=1;
    map[x+1][y+5]=1;
}

void main()
{
    int x,y,px=25,py=30,flag;
    long t1,t2;
    char a;
    system("mode con cols=50 lines=40");
    for(x=0;x<50;x++)
    for(y=0;y<40;y++)
    {
        map[x][y]=0;
        oldmap[x][y]=-1;
    }
    HideCursor();
    flag=true;
    drawmap();
    Now_Time=clock();
    t1=Now_Time;
    t2=Now_Time;
    while(1)
    {
        Now_Time=clock();
        if(kbhit())   //判断击键
        {
            a=getch();
            if((a==97)&((px-3)>0))
                px=px-1;
            if((a==115)&((py+6)<40))
                py=py+1;
            if((a==100)&((px+3)<49))
                px=px+1;
            if((a==119)&(py>0))
                py=py-1;
            if(a==112)
                flag=!flag;     //a:左移 s:下移 d:右移 w:上移 p:暂停
        }
        if(flag)  //处理刷新
        {
            setplane(px,py);
            if(Now_Time-t1>200)
            {
                map[px][py-1]=2;
                t1=Now_Time;
            }   //每200毫秒产生一颗子弹
            if(Now_Time-t2>30)
            {
                t2=Now_Time;
                for(x=0;x<50;x++)
                    for(y=0;y<40;y++)
                        if(map[x][y]==2)
                        {
                            map[x][y]=0;
                            if((y-1)>0)
                                map[x][y-1]=2;  //每30毫秒子弹上移
                        }
            }
            drawmap();
        }
    }
} 

abc.rar (29.43 KB)


[ 本帖最后由 wmf2014 于 2015-1-11 00:11 编辑 ]

能编个毛线衣吗?
2015-01-11 00:06
砖家的谎言
Rank: 12Rank: 12Rank: 12
等 级:禁止访问
威 望:30
帖 子:693
专家分:3898
注 册:2013-12-6
收藏
得分:4 
不错,这个就是一个简单的模型了

我不是砖家,要努力成为砖家。
2015-01-11 08:46
菜鸡一只
Rank: 1
等 级:新手上路
帖 子:23
专家分:4
注 册:2014-12-31
收藏
得分:0 
回复 2楼 wmf2014
画图的那个函数不理解。。。什么OLDMAP还有什么a=32,48,42的是什么啊,本人大一,很多东西都不懂,太菜了。。。
2015-01-11 08:59
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:4 
设置oldmap数组只是为了判断是否和新的map数组数据相同,相同就不需要printf,不同就printf,他的主要作用是消除字符闪烁。32是空格,48是字符0,42是子弹*,把语句改成下面的就好理解了:
            if(j==0)
                a=' ';    //空格背景
            if(j==1)
                a='0';    //我方战机字符
            if(j==2)
                a='*';    //我方子弹字符
            if(map[x][y]!=oldmap[x][y])
                printf("%c",a);    //如果oldmap对应位置的数据和map数据不同则输出,此举消除闪烁,同时达到移动图像的效果

能编个毛线衣吗?
2015-01-11 09:40
菜鸡一只
Rank: 1
等 级:新手上路
帖 子:23
专家分:4
注 册:2014-12-31
收藏
得分:0 
回复 5楼 wmf2014
没看懂为什么取消闪烁。。。。。。
2015-01-11 12:29
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:4 
你可以把我2楼代码“if(map[x][y]!=oldmap[x][y])”注释掉,再看编译运行效果就知道取消闪烁是多么重要了。
void drawmap()
{//画整个图片
    int x,y,j;
    char a;
    for(x=0;x<50;x++)
        for(y=0;y<40;y++)
        {
            gotoxy(x,y);
            j=map[x][y];
            if(j==0)
                a=32;
            if(j==1)
                a=48;
            if(j==2)
                a=42;
            //if(map[x][y]!=oldmap[x][y])  //注释掉这一句,就无法消除闪烁
                printf("%c",a);
            oldmap[x][y]=map[x][y];
        }
}

能编个毛线衣吗?
2015-01-12 12:22
菜鸡一只
Rank: 1
等 级:新手上路
帖 子:23
专家分:4
注 册:2014-12-31
收藏
得分:0 
回复 7楼 wmf2014
哦!谢谢你!但是我现在加入了敌机这个元素,但是不知道为什么运行了一段时间之后飞机突然自动变形了!请问一下是为什么,然后怎么改。。
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<time.h>
#include<conio.h>
int map[50][40],oldmap[50][40];
clock_t Now_Time=clock();

void HideCursor();
void gotoxy(int x,int y);
void drawmap();
void setplane();

void HideCursor()
{
    HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_CURSOR_INFO cursor_info={1,0};
    SetConsoleCursorInfo(hOut,&cursor_info);
}

void gotoxy(int x,int y)
{
    HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);
    COORD loc={x,y};
    SetConsoleCursorPosition(hOut,loc);
}
void drawmap()
{
    int x,y,j;
    char a,b;
    for(x=0;x<50;x++)
        for(y=0;y<40;y++)
        {
            gotoxy(x,y);
            j=map[x][y];
            if(j==0)
                a=' ';
            if(j==1)
                a='0';
            if(j==2)
                a='*';
            if(j==3)
                a='$';
            if(map[x][y]!=oldmap[x][y])
                {printf("%c",a);oldmap[x][y]=map[x][y];}

        }
}

void setplane(int x,int y)
{
    HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(hOut,FOREGROUND_GREEN);
    int i,j;
    for(i=0;i<50;i++)
        for(j=0;j<40;j++)
            if(map[i][j]==1)
                map[i][j]=0;
    for(i=y;i<(y+6);i++)
        map[x][i]=1;
    for(i=x-3;i<x+4;i++)
        map[i][y+2]=1;
    map[x-1][y+5]=1;
    map[x+1][y+5]=1;
}

int main()
{
    srand((unsigned)time(NULL));
    int x,y,px=25,py=30,flag,ix,iy,m,score=0;
    long t1,t2,t3,t4;
    char a;
    system("mode con cols=80 lines=40");
    for(x=0;x<50;x++)
    for(y=0;y<40;y++)
    {
        map[x][y]=0;
        oldmap[x][y]=-1;
    }
    HideCursor();
    flag=true;
    drawmap();
    Now_Time=clock();
    t1=Now_Time;
    t2=Now_Time;
    t3=Now_Time;
    while(1)
    {

        Now_Time=clock();
        if(kbhit())
        {
            a=getch();
            if((a=='a')&&((px-3)>0))
                px=px-1;
            if((a=='s')&&((py+6)<40))
                py=py+1;
            if((a=='d')&&((px+3)<49))
                px=px+1;
            if((a=='w')&&(py>0))
                py=py-1;
            if(a=='p')
                flag=!flag;
        }
        if(flag)
        {
            setplane(px,py);
            if(Now_Time-t1>200)
            {
                map[px][py-1]=2;
                t1=Now_Time;
            }
            if(Now_Time-t2>30)
            {
                t2=Now_Time;
                for(x=0;x<50;x++)
                    for(y=0;y<40;y++)
                        if(map[x][y]==2)
                        {
                            map[x][y]=0;
                            if((y-1)>0)
                            map[x][y-1]=2;
                        }
            }
            if(Now_Time-t3>1000)
            {
                ix=rand()%44+3;
                iy=1;
                map[ix][iy]=3;
                t3=Now_Time;
            }
            if(Now_Time-t4>500)
            {
                t4=Now_Time;
                for(x=50;x>0;x--)
                for(y=40;y>0;y--)
                if(map[x][y]==3)
                {
                    map[x][y]=0;
                    if((y+1)<40)
                    map[x][y+1]=3;
                }
            }
            drawmap();
        }
    }
}
2015-01-12 16:30
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:4 
多长时间乱?我运行好久没发现问题的。发子弹算法还要改下,如果把飞机放到最上面,子弹从下面出来了,这不符合常规。
已经很不错了。其实达到设计规范,先应该用心构造一个场景元素数据结构,里面包含元素类型(敌机、子弹、我战机)、元素当前位置、运动方向、运动速度、得分(击中敌机有效)等等;其次不要定义全局变量,应在main函数中定义指针数组,将指针传给函数,这样符合程序设计规范。

能编个毛线衣吗?
2015-01-12 19:56
菜鸡一只
Rank: 1
等 级:新手上路
帖 子:23
专家分:4
注 册:2014-12-31
收藏
得分:0 
回复 9楼 wmf2014
就是我这个代表敌机的符号$不是从最上面开始下来的吗,然后下到最底层的时候程序就乱了。。
2015-01-13 13:54
快速回复:我想做一个类似雷电的游戏,现在想要子弹(符号是*)自动从飞机发射出 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021421 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved