首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

自己写的贪食蛇游戏,有关问题有很多

2012-03-30 
自己写的贪食蛇游戏,问题有很多由于反复刷屏和打印,导致硬盘读写严重(硬盘灯闪个不停)和屏幕闪烁,而且速度

自己写的贪食蛇游戏,问题有很多
由于反复刷屏和打印,导致硬盘读写严重(硬盘灯闪个不停)和屏幕闪烁,而且速度不好.各位有什么好点的方法吗?
学得不好,献丑了

C/C++ code
#include <windows.h>#include <stdlib.h> #include <stdio.h> #include <time.h> int end=1;            //全局变量main(){    for(;;)    {    int x=1,y=1,ditu[21][21]={0},shch=2,c;    int *xz=&x,*yz=&y,*chang=&shch;                //定义并初始化指针c=caidan('w',1);if(c==0) return 0;if(c==2) sett(chang);srand((unsigned)time(NULL));            //给随机函数种子kudamono(ditu);                //初始化食物坐标start('d',ditu,xz,yz,chang);        //开始游戏printf("\n\n\n\n\n                                     Game Over");Sleep(3000);getch();}    }start(char fx,int ditu[21][21],int *xz,int *yz,int *chang)        //游戏主函数{    yidong(fx,xz,yz);    end=over(ditu,xz,yz);    if(end==0) return;    if(ditu[*yz][*xz]<0)        //是否为食物    eat(ditu,xz,yz,chang);    ditu[*yz][*xz]=*chang;    dayin(ditu);    fx=gbfx(fx);    system("cls");            //清屏  start(fx,ditu,xz,yz,chang);                //重复游戏主函数    }    yidong(char fx,int *xz, int *yz)                //移动算法函数{    if(fx=='w') --*yz;    if(fx=='s') ++*yz;    if(fx=='a') --*xz;    if(fx=='d') ++*xz;}eat(int ditu[21][21],int *xz,int *yz,int *chang)        //吃食物函数(加长蛇身){    int x,y;    ++*chang;    for(y=1;y<=20;y++)    for(x=1;x<=20;x++)    if(ditu[y][x]>0)        ++ditu[y][x];    kudamono(ditu);    }kudamono(int ditu[21][21])                //产生食物函数{    int x,y;    x=(rand()%19)+1;    y=(rand()%19)+1;    if(ditu[y][x]==0) ditu[y][x]=-1;            //判断是否在蛇身上        else kudamono(ditu);    }dayin(int ditu[21][21])                //打印画面函数    {        int x,y;for(x=0;x<22;x++) printf("■");        //打印上边框printf("\n");    for(y=1;y<=20;y++)    {        printf("■");                    //打印左边框    for(x=1;x<=20;x++)    {        if(ditu[y][x]!=0)            {                printf("■");                ditu[y][x]--;                }        else printf("  ");        }    printf("■\n");                //打印右边框    }for(x=0;x<22;x++) printf("■");     //打印下边框printf("\n");        }gbfx(char fx)                //改变方向函数{    char nfx;  if (!kbhit()) return (fx);                //如果没有按键便返回原方向      else          {      nfx=getch();    if(nfx=='W'||nfx=='S'||nfx=='A'||nfx=='D') nfx=nfx+32;        //大写改小写  if(nfx=='w'&&fx!='s'||nfx=='s'&&fx!='w'||nfx=='a'&&fx!='d'||nfx=='d'&&fx!='a') return (nfx);  if(nfx=='\r') pau('a');  return (fx);    }}over(int ditu[21][21],int *xz,int *yz)                //是否死亡{    if(ditu[*yz][*xz]>0||*yz<1||*yz>20||*xz<1||*xz>20)        return 0;    else return 1;        }    caidan(char c,int w)            //主菜单函数{    system("cls");    printf("WSAD上下左右,Enter确定,游戏中Enter暂停、继续\n");    printf("      ");    if(w==1) printf("\b\b→");        printf("  开始游戏\n");    printf("      ");    if(w==2) printf("\b\b→");        printf("  游戏设置\n");    printf("      ");    if(w==3) printf("\b\b→");        printf("  退出游戏\n");                c=getch();    if(c=='W'||c=='S') c=c+32;        if(c=='w') --w;        if(c=='s') ++w;        if(w<1) w=1;        if(w>3) w=3;        if(c=='\r')        {if(w==3)     {        w=exi();    if(w==0) return w;  else caidan(c,w);  } return w;            }    caidan(c,w);    }exi()                //退出游戏函数{    char x;    printf("是否退出游戏?Y确定,任意键继续...");    x=getch();    if(x=='Y'||x=='y') return 0;        else return 1;    }    sett(int *chang)                //游戏设置函数{    int sh;    printf("输入蛇身的长度\n");    scanf("%d",&sh);    if(sh>=100)        {            printf("搞得这么长干什么 重新设置^_^\n");            //随手恶搞            sett(chang);            }    *chang=sh;    caidan('w',1);}pau(char p)                //暂停函数{    if(p=='\r') return 0;     if (!kbhit())    {    system("cls");    Sleep(500);    printf("\n\n\n\n\n\n                                     pause");    Sleep(1500);    }    else    {    p=getch();    if(p=='\r') return 0;    }    pau('a');    } 



[解决办法]
之前弄了个俄罗斯方块 也是win32运行的
 楼主试试不要用system("cls")
 试试用GoToXY(0,0)

GoToXY(0,0)的源码:
void GoToXY(int x, int y)
{
 COORD pos = {x,y};
 HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); // 获取标准输出设备句柄
 
 SetConsoleCursorPosition(hOut, pos);
}

void WhereXY(int *x, int *y)
{
 HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); // 获取标准输出设备句柄
 CONSOLE_SCREEN_BUFFER_INFO bInfo;
GetConsoleScreenBufferInfo( hOut, &bInfo ); 
 COORD pos = bInfo.dwCursorPosition;
 *x = pos.X;
 *y = pos.Y;
}

我是用这个来刷屏的,效果好很多
[解决办法]
又见贪吃蛇,HEHE,
7年前我在98下写了个.现在都不知道丢哪去了。

被我弄的好花哨,帮助我找了第一份工作.

好亲切.
[解决办法]
建议:
1.完全没考虑程序效率,所有的都放到for循环里做,这个样会让人笑的.
2.设计个规划,需要刷新的地方其实只有蛇身(头,尾),食物等.
3.循环里只要设计键盘消息分发,刷新由定时中断完成.
4.蛇体采用链表结构也许会好很多。


[解决办法]
我用Java做的。。
[解决办法]
改天我也弄一个
[解决办法]
都这么牛叉!学习!
[解决办法]
- -!
不懂,学习下,顺便帮顶,呵呵

[解决办法]
看看
[解决办法]
其实我也不咋懂,当时才大一,现在也就大二.....
也基本是拷贝过来用的
就当GoToXY(0,0)是一个函数就得了
后面的源码直接复制过去不用修改


探讨
引用:
之前弄了个俄罗斯方块 也是win32运行的
楼主试试不要用system("cls")
试试用GoToXY(0,0)

GoToXY(0,0)的源码:
void GoToXY(int x, int y)
{
COORD pos = {x,y};
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); // 获取标准输出设备句柄

SetConsoleCursorPosition(hOut, pos);
}

void WhereXY(int *x, int *y)
{
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); //…

[解决办法]
硬盤讀寫嚴重? 

看不出這程式跟硬盤有什麼關係?

热点排行