找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 4341|回复: 3

[C++] 贪吃蛇 DOS版

[复制链接]

17

主题

28

回帖

590

积分

用户组: 大·技术宅

UID
140
精华
5
威望
30 点
宅币
440 个
贡献
26 次
宅之契约
0 份
在线时间
54 小时
注册时间
2014-3-22
发表于 2014-9-20 08:33:14 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
本帖最后由 mzflz 于 2014-9-20 08:43 编辑

第一次在这版块发帖,呵呵,以前老感觉这版块是那些大牛们的地盘,所以只看没发。
这贪吃蛇程序说是C语言吧,其实也不是,因为这程序中用到了C++的引用(其实指针也行,只是懒得多改原来出现错误的代码),算法很简单,相信大家都能看懂。
本人能力有限,错误肯定是有的,望大牛们指教。

不多说了,上代码。



  1. / LazySnake.cpp : 定义控制台应用程序的入口点。
  2. //贪吃蛇  DOS版


  3. #include "stdafx.h"
  4. #include<windows.h>


  5. #define MAX 100
  6. #define UP 1
  7. #define DOWN 2
  8. #define LEFT 3
  9. #define RIGHT 4
  10. #define Head_X SnakeX[0]
  11. #define Head_Y SnakeY[0]
  12. const int Height = 30;
  13. const int Width = 50;
  14. const int Speed = 200/*ms*/;
  15. const int ScoreX = 60, ScoreY = 15;


  16. int HeadDirection = DOWN; //舌头方向
  17. int SnakeX[MAX];
  18. int SnakeY[MAX];
  19. int SnakeLength =1;
  20. int FoodX = rand()%Width;
  21. int FoodY = rand()%Height;



  22. inline BOOL isWin()
  23. {
  24.         return (MAX < SnakeLength);
  25. }
  26. BOOL gotoxy(int x, int y)
  27. {
  28.         COORD c={x,y};
  29.         return SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c);
  30. }
  31. void ArrayOffset(int &OldHeadX, int& OldHeadY, int& OldX, int& OldY)
  32. {
  33.         for (int i = 1; i < SnakeLength; i++)
  34.         {
  35.                 OldX = SnakeX[i];
  36.                 OldY = SnakeY[i];
  37.                 SnakeX[i] = OldHeadX;
  38.                 SnakeY[i] = OldHeadY;
  39.                 OldHeadX = OldX;
  40.                 OldHeadY = OldY;
  41.         }
  42. }
  43. int _tmain(int argc, _TCHAR* argv[])
  44. {

  45.         SetConsoleTitleA("LazySnake By null");
  46.         for (int i = 0; i < Width; i++)
  47.         {
  48.                 printf("-");
  49.         }
  50.         for (int i = 0; i < Height; i++)
  51.         {
  52.                 gotoxy(0,i);
  53.                 printf("|");
  54.                 gotoxy(Width,i);
  55.                 printf("|");
  56.         }
  57.         printf("\n");
  58.         for (int i = 0; i < Width; i++)
  59.         {
  60.                 printf("-");
  61.         }
  62.         ZeroMemory(SnakeX,sizeof(SnakeX));
  63.         ZeroMemory(SnakeY,sizeof(SnakeY));
  64.         gotoxy(FoodX,FoodY);
  65.         printf("8");
  66.         Head_X = Width / 2;
  67.         Head_Y = Height / 2;


  68.         while (true)
  69.         {
  70.                 if (GetAsyncKeyState(VK_LEFT))
  71.                         HeadDirection = LEFT
  72.                         ;
  73.                 if (GetAsyncKeyState(VK_RIGHT))
  74.                         HeadDirection = RIGHT
  75.                         ;
  76.                 if (GetAsyncKeyState(VK_UP))
  77.                         HeadDirection = UP
  78.                         ;
  79.                 if (GetAsyncKeyState(VK_DOWN))
  80.                         HeadDirection = DOWN
  81.                         ;
  82.                 static int OldHeadX,OldHeadY,OldX = OldHeadX,OldY = OldHeadY;
  83.                 switch (HeadDirection)
  84.                 {
  85.                 case UP:
  86.                         OldHeadX = Head_X;
  87.                         OldHeadY = Head_Y;
  88.                         Head_Y = Head_Y - 1;
  89.                         ArrayOffset(OldHeadX, OldHeadY, OldX, OldY);
  90.                         break;
  91.                 case DOWN:
  92.                         OldHeadX = Head_X;
  93.                         OldHeadY = Head_Y;
  94.                         Head_Y = Head_Y + 1;
  95.                         ArrayOffset(OldHeadX, OldHeadY, OldX, OldY);
  96.                         break;
  97.                 case LEFT:
  98.                         OldHeadX = Head_X;
  99.                         OldHeadY = Head_Y;
  100.                         Head_X = Head_X - 1;
  101.                         ArrayOffset(OldHeadX, OldHeadY, OldX, OldY);
  102.                         break;
  103.                 case RIGHT:
  104.                         OldHeadX = Head_X;
  105.                         OldHeadY = Head_Y;
  106.                         Head_X = Head_X + 1;
  107.                         ArrayOffset(OldHeadX, OldHeadY, OldX, OldY);
  108.                         break;
  109.                 }
  110.                 int Old_X, Old_Y;
  111.                 if (Head_X < 0 || Head_X > Width||Head_Y<0||Head_Y>Height)
  112.                 {
  113.                         system("cls");
  114.                         printf("Game Over\n");
  115.                         system("pause");
  116.                 }
  117.                 if (Head_X == FoodX&&FoodY == Head_Y)
  118.                 {
  119.                         FoodX = rand() % Width;
  120.                         FoodY = rand() % Height;
  121.                         gotoxy(FoodX,FoodY);
  122.                         printf("8");
  123.                         SnakeLength++;
  124.                 }
  125.                 for (int i = 0; i < SnakeLength; i++)
  126.                 {
  127.                         gotoxy(SnakeX[i],SnakeY[i]);
  128.                         printf("0");
  129.                 }
  130.                 if (isWin())
  131.                 {
  132.                         printf("恭喜你! 你赢了!");
  133.                 }
  134.                 gotoxy(OldHeadX,OldHeadY);
  135.                 printf(" ");
  136.                 gotoxy(ScoreX,ScoreY);
  137.                 printf("Score:%d",SnakeLength-1);
  138.                 Sleep(Speed);
  139.         }
  140.         return 0;
  141. }
复制代码


QQ截图20140920083210.png
回复

使用道具 举报

55

主题

275

回帖

9352

积分

用户组: 管理员

UID
77
精华
16
威望
237 点
宅币
8217 个
贡献
251 次
宅之契约
0 份
在线时间
254 小时
注册时间
2014-2-22
发表于 2014-9-20 11:50:40 | 显示全部楼层
非常喜欢这种这么萌的控制台小游戏。

如果不使用WIN32API那么就更好了。
回复 赞! 靠!

使用道具 举报

1110

主题

1651

回帖

7万

积分

用户组: 管理员

一只技术宅

UID
1
精华
244
威望
743 点
宅币
24225 个
贡献
46222 次
宅之契约
0 份
在线时间
2296 小时
注册时间
2014-1-26
发表于 2014-9-21 15:52:31 | 显示全部楼层
嗯。不使用Win32API的话,就能移植到DOS、Linux什么的。
回复 赞! 靠!

使用道具 举报

12

主题

35

回帖

959

积分

用户组: 大·技术宅

UID
3517
精华
1
威望
36 点
宅币
802 个
贡献
33 次
宅之契约
0 份
在线时间
207 小时
注册时间
2018-3-2
发表于 2018-3-3 19:49:41 | 显示全部楼层
这蛇长得真好看
回复 赞! 靠!

使用道具 举报

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-4-19 14:01 , Processed in 0.055863 second(s), 37 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表