网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
12月22日漏签0天
c++吧 关注:647,009贴子:2,117,634
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 8回复贴,共1页
<<返回c++吧
>0< 加载中...

我也写了个贪吃蛇,不过比较短,只用了一下午。你们很容易看懂的…

  • 取消只看楼主
  • 收藏

  • 回复
  • 菊花残思密达
  • &&
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
长夜漫漫,圣诞节那天没事写了个贪吃蛇,本来不想发的,但觉得发了的话可能会让一些人学到些东西,就发吧。代码不长,200来行,画面比较流畅。其实还可以更短的,因为我不知道line可以设置宽度,所以我自己想了个每次把5条line并排输出的算法,还有的地方也可以精简,不过懒得弄了,有兴趣的玩玩吧,地址:http://wysaid.googlecode.com/files/snake.rar 如何使用graphics.h 请参见 http://tieba.baidu.com/f?kz=778031710
下面是代码:第一个文件 snake.h
#ifndef _snake_n_
#define _snake_n_
#include<vector>
#include<conio.h>
#include<graphics.h>
#include<cmath>
#include<ctime>
#include<cstdlib>
using std::vector;
class Snake
{
public:
     Snake(){direction = 'd';x_head = 100;y_head = 240;x_corner.push_back(0),y_corner.push_back(240);}
     void operator++();
     friend void drawline(int,int,int,int,bool);
     friend class Fruit;
     void draw(int);
     void ifhit();
     void longer();
     char getdir(){return direction;}
     void move_up(char direct,int speed){if(direction != direct) {x_corner.push_back(x_head);y_corner.push_back(y_head);}y_head -= speed;direction = direct;}
     void move_down(char direct,int speed){if(direction != direct) {x_corner.push_back(x_head);y_corner.push_back(y_head);}y_head += speed;direction = direct;}
     void move_left(char direct,int speed){if(direction != direct) {x_corner.push_back(x_head);y_corner.push_back(y_head);}x_head -= speed;direction = direct;}
     void move_right(char direct,int speed){if(direction != direct) {x_corner.push_back(x_head);y_corner.push_back(y_head);}x_head += speed;direction = direct;}
private:
     char direction;
     int x_head;
     int y_head;
     vector<int> x_corner;
     vector<int> y_corner;
};
class Fruit
{
public:
     Fruit(){x = 0;y = 0;radius = 4;score = 0;}
     Fruit(int x_first,int y_first){x = x_first;y = y_first;radius = 4;score = 0;}
     void drawfruit(Snake&,int);
     bool eaten(Snake&);
private:
     int x;
     int y;
     int radius;
     int score;
};
void gameover();
#endif



  • 菊花残思密达
  • &&
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
不要问我为什么四个move写在类里面……我的目的很单纯,我只是想节省篇幅……
第二个文件: snake.cpp //包含主函数
#include"snake.h"
int main()
{
     initgraph(640,480);
     Snake snake;
     int speed = 1;
     Fruit fruit(rand()%600+100,rand()%400+100);
     char c = 'd';
     char prior = 0;
     BeginBatchDraw();
     setcolor(YELLOW);
     setfillstyle(YELLOW);
     drawline(100,240,0,240,true);
     fillellipse(100,240,4,4);
     outtextxy(100,50,"圣诞节只写了这么一点点~不足的地方请包涵...\n请选择难度:(1,2,3)");
     outtextxy(100,100,"1. 简单");
     outtextxy(100,150,"2. 中等");
     outtextxy(100,200,"3. 难!");
     FlushBatchDraw();
     prior = getch();
     switch(prior)
     {
     case '2': speed = 2;break;
     case '3': speed = 4;break;
     default: prior = 49;
     }
     while(c != 27)
     {
         cleardevice();
         if(kbhit())
         {
             c = getch();
             if(abs(prior - c) == 4 || abs(prior - c) == 3) c = prior;
             prior = c;
         }
         switch(c)
         {
         case 'w': snake.move_up(c,speed);break;
         case 's': snake.move_down(c,speed);break;
         case 'a': snake.move_left(c,speed);break;
         case 'd': snake.move_right(c,speed);break;
         case 27: break;
         default: outtextxy(200,240,"错误的按键!请按'w''a''s''d'控制方向或者ESC退出");FlushBatchDraw();Sleep(1000);c = snake.getdir();
         }
         fruit.drawfruit(snake,speed);
         snake.draw(speed);
         snake.ifhit();
         FlushBatchDraw();
         Sleep(10);
     }
     outtextxy(200,240,"谢谢使用,再见~");
     FlushBatchDraw();
     getch();
     EndBatchDraw();
     closegraph();
     return 0;
}



2025-12-22 02:41:24
广告
不感兴趣
开通SVIP免广告
  • 菊花残思密达
  • &&
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
第三个文件: wysaid.cpp  
//包含主要算法实现。至于为什么叫wysaid.cpp嘛,参照我的google帐号
#include"snake.h"
void drawline(int x1,int y1,int x2,int y2,bool xy)
{
     line(x1,y1,x2,y2);
     if(xy)
     {
         line(x1,y1+1,x2,y2+1);
         line(x1,y1-1,x2,y2-1);
         line(x1,y1+2,x2,y2+2);
         line(x1,y1-2,x2,y2-2);
     }
     else
     {
         line(x1+1,y1,x2+1,y2);
         line(x1-1,y1,x2-1,y2);
         line(x1+2,y1,x2+2,y2);
         line(x1-2,y1,x2-2,y2);
     }
}
void Snake::draw(int speed)
{
     int b,s,n=1;
     if(x_head == x_corner[x_corner.size()-1])
         drawline(x_head,y_head,x_corner[x_corner.size()-1],y_corner[y_corner.size()-1],false);
     else
         drawline(x_head,y_head,x_corner[x_corner.size()-1],y_corner[y_corner.size()-1],true);
     fillellipse(x_head,y_head,4,4);
     for(;n < x_corner.size(); ++n)
     {
         if(x_corner[n] == x_corner[n-1])
         {
             drawline(x_corner[n],y_corner[n],x_corner[n-1],y_corner[n-1],false);
             if(x_head != x_corner[n]) continue;
             if(y_corner[n] > y_corner[n-1]) b = y_corner[n],s = y_corner[n-1];
             else b = y_corner[n-1],s = y_corner[n];
             if(y_head < b && y_head > s) gameover();
         }
         else
         {
             drawline(x_corner[n],y_corner[n],x_corner[n-1],y_corner[n-1],true);
             if(y_head != y_corner[n]) continue;
             if(x_corner[n] > x_corner[n-1]) b = x_corner[n],s = x_corner[n-1];
             else b = x_corner[n-1],s = x_corner[n];



  • 菊花残思密达
  • &&
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
             if((x_head < b) && (x_head > s)) gameover();
         }
     }
     if(x_corner.size() != 1)
     {
         if(x_corner[0] == x_corner[1])
         {
             y_corner[0]>y_corner[1]?y_corner[0]-=speed:y_corner[0]+=speed;
             if(y_corner[0] == y_corner[1])
             {
                 y_corner.erase(y_corner.begin());
                 x_corner.erase(x_corner.begin());    
             }
         }
         else if(y_corner[0] == y_corner[1])
         {
             x_corner[0]>x_corner[1]?x_corner[0]-=speed:x_corner[0]+=speed;
             if(x_corner[0] == x_corner[1])
             {
                 y_corner.erase(y_corner.begin());
                 x_corner.erase(x_corner.begin());    
             }
         }
     }
     else if(x_head == x_corner[0])
         y_corner[0]>y_head?y_corner[0]-=speed:y_corner[0]+=speed;
     else x_corner[0]>x_head?x_corner[0]-=speed:x_corner[0]+=speed;
}
bool Fruit::eaten(Snake& snake)
{
     if(pow(snake.x_head-x,2)+pow(snake.y_head-y,2) < pow(radius,2)+4)
         return true;
     return false;
}
void Fruit::drawfruit(Snake& snake,int speed)
{
     char sco[10];
     srand(unsigned(time(NULL)));
     if(eaten(snake))
     {
         x = rand()%(640-radius)+8;
         y = rand()%(480-radius)+8;
         score += 100*speed;
         ++snake;
     }
     fillellipse(x,y,radius,radius);
     outtextxy(160,10,"Your score is:");
     outtextxy(300,10,itoa(score,sco,10));
}
void Snake::ifhit(/*...待添加(障碍物等)...*/)
{
     if(x_head<4 || x_head>636 || y_head<4 || y_head>476)
         gameover();
     //...待添加...
}
void Snake::operator++()
{
     switch(direction)
     {
     case 'w': y_head -= 8;break;
     case 's': y_head += 8;break;
     case 'a': x_head -= 8;break;
     case 'd': x_head += 8;break;
     default: ;
     }
        
}
void gameover()
{
     for(int x=160;x<420;++x)
         for(int y=350;y<450;++y)
             putpixel(x,y,0x0000ff);
     setcolor(BLACK);
     outtextxy(200,400,"You Lose!But merry xmas!");
     outtextxy(300,420,"Made by wysaid");
     FlushBatchDraw();
     getchar();
     EndBatchDraw();
     closegraph();
     exit(0);
}



  • 菊花残思密达
  • &&
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
上面是用vc++6.0写的。本来也想用vs2010写的,但……嫌vs2010编译出来的控制台程序不好拿给其他人用。如果要用vs2010的话,请在所有常量字符串比如 "1.简单" 前加上大写字母 L
即写成 L"1.简单" 才能通过编译。
因为vs2010里面必须使用宽字符,vc6.0貌似……嗯,通过“pow(1,1)”这样的表达式在vs2010里面不能通过编译,而在vc++6.0里没错,大家就知道vs2010要求比较严格了。所以,建议大家还是用vs2010吧(呃,貌似我自己也用的vc++6.0,废话太多了)。
当然,前提是你得有一个库,要么是graphics或者叫它easyX。下载方式最顶上的连接里有。挺好玩的,适合初学者。试试就知道了。
本来是要学opencv的,不过那个……500多个函数,看着帮助就很蛋疼,这个函数比那个少十倍,学着轻松点。等哥学好了再用opencv搞个牛X一点的,嘿嘿。
本人写这个之前可是什么都没参照哦。
嗯,在此申明一下:版权没有,随便使用,如有雷同,算我抄你的。我睡觉去了……


  • 菊花残思密达
  • &&
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
疑似贴代码的都加精了……吧主…………你懂的……



  • 菊花残思密达
  • &&
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼


  • 菊花残思密达
  • &&
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
试玩地址... http://wysaid.googlecode.com/files/snake.rar
吃早饭去鸟……


2025-12-22 02:35:24
广告
不感兴趣
开通SVIP免广告
  • 菊花残思密达
  • &&
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
回复:11楼
唉,当时写的时候没怎么考虑,完全是觉得能达到目的就行。
其实speed本来是要写成全局的,但我写成全局的int speed就会fatal error
而写成const int speed就没事。但写成const这个speed就失去意义了。
谢谢你的提醒了。


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 8回复贴,共1页
<<返回c++吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示