注册 登录
编程论坛 C++教室

写个游戏给那些感到学C枯燥的孩子玩, 激励其志

好聚好散 发布于 2013-05-23 20:42, 2009 次点击
#include<iostream.h>
#include<windows.h>
#include<time.h>
#include<stdlib.h>
#include<conio.h>
#define N 30
void gotoxy(int x,int y)//位置函数
{
COORD pos;
pos.X=2*x;
pos.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
void color(int a)//颜色函数
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a + 1);
}
void init(int apple[2])//初始化函数(初始化围墙、显示信息、苹果)
{
int i,j;//初始化围墙
int wall[N+2][N+2]={{0}};
for(i=1;i<=N;i++)
{
for(j=1;j<=N;j++)
wall[i][j]=1;
}
color(11);
for(i=0;i<N+3;i++)
{
for(j=0;j<N+3;j++)
{
if(wall[i][j])
cout<<"■";//■
else cout<<"□" ;//□
}
cout<<endl;
}
gotoxy(N+3,1);//显示信息
color(20);
cout<<"按 W S A D 移动方向"<<endl;
gotoxy(N+3,2);
color(20);
cout<<"按任意键暂停"<<endl;
gotoxy(N+3,3);
color(20);
cout<<"得分:"<<endl;
apple[0]=rand()%N+1;//苹果
apple[1]=rand()%N+1;
gotoxy(apple[0],apple[1]);
color(12);
cout<<"●"<<endl;
}
int main()
{
int i;
int** snake=NULL;
int apple[2];
int score=0;
int tail[2];
int len=3;
char ch='p';
srand((unsigned)time(NULL));
init(apple);
snake=(int**)realloc(snake,sizeof(int*)*len);
for(i=0;i<len;i++)
snake[i]=(int*)malloc(sizeof(int)*2);
for(i=0;i<len;i++)
{
snake[i][0]=N/2;
snake[i][1]=N/2+i;
gotoxy(snake[i][0],snake[i][1]);
color(14);
cout<<"★"<<endl;
}
while(1)//进入消息循环
{
tail[0]=snake[len-1][0];
tail[1]=snake[len-1][1];
gotoxy(tail[0],tail[1]);
color(11);
cout<<"■"<<endl;
for(i=len-1;i>0;i--)
{
snake[i][0]=snake[i-1][0];
snake[i][1]=snake[i-1][1];
gotoxy(snake[i][0],snake[i][1]);
color(14);
cout<<"★"<<endl;
}
if(kbhit())
{
gotoxy(0,N+2);
ch=getche();
}
switch(ch)
{
case 'w':snake[0][1]--;break;
case 's':snake[0][1]++;break;
case 'a':snake[0][0]--;break;
case 'd':snake[0][0]++;break;
default: break;
}
gotoxy(snake[0][0],snake[0][1]);
color(3);
cout<<"★"<<endl;
Sleep(abs(200-0.5*score));
if(snake[0][0]==apple[0]&&snake[0][1]==apple[1])//吃掉苹果后蛇分数加1,蛇长加1
{
score++;
len++;
snake=(int**)realloc(snake,sizeof(int*)*len);
snake[len-1]=(int*)malloc(sizeof(int)*2);
apple[0]=rand()%(N-1)+1;
apple[1]=rand()%(N-1)+1;
gotoxy(apple[0],apple[1]);
color(12);
cout<<"●"<<endl;
gotoxy(N+5,3);
color(20);
cout<<score<<endl;
}
if(snake[0][1]==0||snake[0][1]==N||snake[0][0]==0||snake[0][0]==N)//撞到围墙后失败
{
gotoxy(N/2,N/2);
color(30);
cout<<"失败!!!"<<endl;
for(i=0;i<len;i++)
free(snake[i]);
//Sleep(INFINITE);
return 0;
}
}
return 0;
}
21 回复
#2
yuccn2013-05-24 12:13
如果能整理下代码的缩进就好很多了。加油
#3
邓士林2013-05-24 12:39
不错,努力
#4
aaxxop2013-05-24 13:39
这条蛇可以自己撞自己,还可以收缩成两点的呵....新手飘过
#5
我叫沃恩2013-05-24 13:43
加油!!
#6
outaini2013-05-24 15:15
我编出,不出现效果
#7
Susurrant2013-05-26 12:49
赞一个
#8
qunxingw2013-05-26 14:10
good
#9
haoyasen2013-05-27 20:35
好强
#10
子楠2013-05-28 13:20
#11
我有我梦2013-05-28 21:01
你这里面有错误哦!!!
#12
arsonala2013-05-30 18:03
我粘贴了一下,怎么有好多错误啊!!!
#13
aaxxop2013-05-30 23:43
//我把缩进给优化了下,再次感谢原作者
//可以吃自己的贪吃蛇源代码

#include<iostream.h>
#include<windows.h>
#include<time.h>
#include<stdlib.h>
#include<conio.h>
#define N 30
void gotoxy(int x,int y)//位置函数
{
    COORD pos;
    pos.X=2*x;
    pos.Y=y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
void color(int a)//颜色函数
{
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a + 1);
}
void init(int apple[2])//初始化函数(初始化围墙、显示信息、苹果)
{
    int i,j;//初始化围墙
    int wall[N+2][N+2]= {{0}};
    for(i=1; i<=N; i++)
    {
        for(j=1; j<=N; j++)
            wall[i][j]=1;
    }
    color(11);
    for(i=0; i<N+3; i++)
    {
        for(j=0; j<N+3; j++)
        {
            if(wall[i][j])
                cout<<"■";//■
            else cout<<"□" ;//□
        }
        cout<<endl;
    }
    gotoxy(N+3,1);//显示信息
    color(20);
    cout<<"按 W S A D 移动方向"<<endl;
    gotoxy(N+3,2);
    color(20);
    cout<<"按任意键暂停"<<endl;
    gotoxy(N+3,3);
    color(20);
    cout<<"得分:"<<endl;
    apple[0]=rand()%N+1;//苹果
    apple[1]=rand()%N+1;
    gotoxy(apple[0],apple[1]);
    color(12);
    cout<<"●"<<endl;
}
int main()
{
    int i;
    int** snake=NULL;
    int apple[2];
    int score=0;
    int tail[2];
    int len=3;
    char ch='p';
    srand((unsigned)time(NULL));
    init(apple);
    snake=(int**)realloc(snake,sizeof(int*)*len);
    for(i=0; i<len; i++)
        snake[i]=(int*)malloc(sizeof(int)*2);
    for(i=0; i<len; i++)
    {
        snake[i][0]=N/2;
        snake[i][1]=N/2+i;
        gotoxy(snake[i][0],snake[i][1]);
        color(14);
        cout<<"★"<<endl;
    }
    while(1)//进入消息循环
    {
        tail[0]=snake[len-1][0];
        tail[1]=snake[len-1][1];
        gotoxy(tail[0],tail[1]);
        color(11);
        cout<<"■"<<endl;
        for(i=len-1; i>0; i--)
        {
            snake[i][0]=snake[i-1][0];
            snake[i][1]=snake[i-1][1];
            gotoxy(snake[i][0],snake[i][1]);
            color(14);
            cout<<"★"<<endl;
        }
        if(kbhit())
        {
            gotoxy(0,N+2);
            ch=getche();
        }
        switch(ch)
        {
        case 'w':
            snake[0][1]--;
            break;
        case 's':
            snake[0][1]++;
            break;
        case 'a':
            snake[0][0]--;
            break;
        case 'd':
            snake[0][0]++;
            break;
        default:
            break;
        }
        gotoxy(snake[0][0],snake[0][1]);
        color(3);
        cout<<"★"<<endl;
        Sleep(abs(200-0.5*score));
        if(snake[0][0]==apple[0]&&snake[0][1]==apple[1])//吃掉苹果后蛇分数加1,蛇长加1
        {
            score++;
            len++;
            snake=(int**)realloc(snake,sizeof(int*)*len);
            snake[len-1]=(int*)malloc(sizeof(int)*2);
            apple[0]=rand()%(N-1)+1;
            apple[1]=rand()%(N-1)+1;
            gotoxy(apple[0],apple[1]);
            color(12);
            cout<<"●"<<endl;
            gotoxy(N+5,3);
            color(20);
            cout<<score<<endl;
        }
        if(snake[0][1]==0||snake[0][1]==N||snake[0][0]==0||snake[0][0]==N)//撞到围墙后失败
        {
            gotoxy(N/2,N/2);
            color(30);
            cout<<"失败!!!"<<endl;
            for(i=0; i<len; i++)
                free(snake[i]);
//Sleep(INFINITE);
            return 0;
        }
    }
    return 0;
}
#14
aaxxop2013-05-30 23:46
说有错误的同学多半是自己的编译器或者编译方法错了,其实就是把自己第一个"hello world"的空程序代码给覆盖掉再编译就欧克可以开始play了
#15
无与容比2013-06-01 20:39
不错
#16
rvan2013-06-02 11:10
回复 楼主 好聚好散
有一个错误,运行不了
#17
rvan2013-06-02 11:11
回复 14楼 aaxxop
怎么覆盖,求解
#18
rvan2013-06-02 11:32
D:\计算机语言软件\11.c(1) : warning C4067: unexpected tokens following preprocessor directive - expected a newline
D:\计算机语言软件\11.c(2) : error C2449: found '{' at file scope (missing function header?)
D:\计算机语言软件\11.c(23) : error C2059: syntax error : '}'
执行 cl.exe 时出错.

11.exe - 1 error(s), 0 warning(s)
什么情况呢
#19
rvan2013-06-02 20:01
回复 11楼 我有我梦
你确定你是在win32控制应用平台下运行的不
#20
爱学习c语言2013-06-03 08:53
强 ,
#21
雪狼633812013-06-03 19:52
太棒了,继续加油
#22
陈氏2017-10-27 20:20
好强,我是菜鸟。好羡慕你们这些大佬。
1