• 欢迎访问C语言网www.dotcpp.com 比赛栏每月有奖月赛!举办比赛联系QQ:2045302297
  • 问题反馈、粉丝交流 QQ群327452739 蓝桥杯训练群:113766799 申请群时请备注排名里的昵称
  • C语言研究中心 为您提供有图、有料、解渴的C语言专题! 欢迎讨论!

VC6下实现C语言贪吃蛇游戏源码

C语言研究中心 CTO 32486次浏览 10个评论

找了个不依赖graphics头文件的VC6的贪吃蛇源码,供大家学习娱乐!

 

VC6.0下亲测可用,运行界面:

VC6下实现C语言贪吃蛇游戏源码

 

鄙人不才,越玩越快,很快就挂掉了

VC6下实现C语言贪吃蛇游戏源码

 

源代码:

#include <windows.h>
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
#define N 21
 
int apple[3];
char score[3];
char tail[3]; 
 
void gotoxy(int x, int y) //输出坐标 
{
 COORD pos;
 pos.X = x; 
 pos.Y = y;
 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}
 
void color(int b) //颜色函数 
{
 HANDLE hConsole = GetStdHandle((STD_OUTPUT_HANDLE)) ; 
 SetConsoleTextAttribute(hConsole,b) ;
} 
 
int Block(char head[2]) //判断出界 
{
 if ((head[0] < 1) || (head[0] > N) || (head[1] < 1) || (head[1] > N))
 return 1;
 return 0;
}
 
int Eat(char snake[2]) //吃了苹果 
{
 if ((snake[0] == apple[0]) && (snake[1] == apple[1]))
 {
 apple[0] = apple[1] = apple[2] = 0;
 gotoxy(N+44,10);
 color(13);
 printf("%d",score[0]*10);
 color(11);
 return 1;
 }
 return 0;
}
 
void Draw(char **snake, int len) //蛇移动 
{
 if (apple[2]) {
 gotoxy(apple[1] * 2, apple[0]);
 color(12);
 printf("●");
 color(11);
 }
 gotoxy(tail[1] * 2, tail[0]);
 if (tail[2]) 
 { color(14);
 printf("★");
 color(11);
 }
 else 
 printf("■");
 gotoxy(snake[0][1] * 2, snake[0][0]);
 color(14);
 printf("★");
 color(11);
 putchar('\n');
}
 
char** Move(char **snake, char dirx, int *len) //控制方向 
{
 int i, full = Eat(snake[0]);
 memcpy(tail, snake[(*len)-1], 2);
 for (i = (*len) - 1; i > 0; --i) 
 memcpy(snake[i], snake[i-1], 2);
 switch (dirx) 
 { 
 case 'w': case 'W': --snake[0][0]; break;
 case 's': case 'S': ++snake[0][0]; break;
 case 'a': case 'A': --snake[0][1]; break;
 case 'd': case 'D': ++snake[0][1]; break;
 default: ;
 } 
 if (full) 
 { 
 snake = (char **)realloc(snake, sizeof(char *) * ((*len) + 1));
 snake[(*len)] = (char *)malloc(sizeof(char) * 2);
 memcpy(snake[(*len)], tail, 2);
 ++(*len);
 ++score[0];
 if(score[3] < 16) 
 ++score[3];
 tail[2] = 1;
 }
 else 
 tail[2] = 0;
 return snake;
}
 
void init(char plate[N+2][N+2], char ***snake_x, int *len) //初始化 
{
 int i, j;
 char **snake = NULL;
 
 *len = 3;
 score[0] = score[3] =3;
 snake = (char **)realloc(snake, sizeof(char *) * (*len));
 for (i = 0; i < *len; ++i)
 snake[i] = (char *)malloc(sizeof(char) * 2);
 
 for (i = 0; i < 3; ++i) 
 {
 snake[i][0] = N/2 + 1;
 snake[i][1] = N/2 + 1 + i;
 } 
 
 for (i = 1; i <= N; ++i) 
 for (j = 1; j <= N; ++j) 
 plate[i][j] = 1;
 
 apple[0] = rand()%N + 1; apple[1] = rand()%N + 1;
 apple[2] = 1;
 
 for (i = 0; i < N + 2; ++i) 
 {
 gotoxy(0, i);
 for (j = 0; j < N + 2; ++j) 
 {
 switch (plate[i][j]) 
 {
 case 0: 
 color(12);printf("□");color(11); continue;
 case 1: printf("■"); continue;
 default: ;
 }
 }
 putchar('\n');
 } 
 for (i = 0; i < (*len); ++i)
 {
 gotoxy(snake[i][1] * 2, snake[i][0]);
 printf("★");
 } 
 putchar('\n');
 *snake_x = snake;
}
 
void Manual()
{
 gotoxy(N+30,2);
 color(10);
 printf("按 W S A D 移动方向");
 gotoxy(N+30,4);
 printf("按 space 键暂停"); 
 gotoxy(N+30,8);
 color(11);
 printf("历史最高分为: ");
 color(12);
 gotoxy(N+44,8);
 printf("%d",score[1]*10);
 color(11);
 gotoxy(N+30,12);
 printf("你现在得分为: 0"); 
 gotoxy(N+30,16);
 printf("c语言(www.dotcpp.com)研究中心");
}
 
int File_in() //取记录的分数 
{
 FILE *fp;
 if((fp = fopen("C:\\tcs.txt","a+")) == NULL)
 {
 gotoxy(N+18, N+2);
 printf("文件不能打开\n");
 exit(0);
 }
 if((score[1] = fgetc(fp)) != EOF);
 else
 score[1] = 0;
 return 0;
}
 
int File_out() //存数据 
{
 
 FILE *fp;
 if(score[1] > score[0]) 
 {gotoxy(10,10);
 color(12);
 puts("闯关失败 加油耶");
 gotoxy(0,N+2); 
 return 0;
 }
 if((fp = fopen("C:\\tcs.txt","w+")) == NULL)
 {
 printf("文件不能打开\n");
 exit(0);
 }
 if(fputc(--score[0],fp)==EOF)
 printf("输出失败\n");
 gotoxy(10,10);
 color(12);
 puts("恭喜您打破记录"); 
 gotoxy(0,N+2);
 return 0;
}
 
 
void Free(char **snake, int len) //释放空间 
{
 int i;
 for (i = 0; i < len; ++i) 
 free(snake[i]);
 free(snake);
}
 
int main(void)
{
 int len;
 char ch = 'g';
 char a[N+2][N+2] = {{0}};
 char **snake;
 srand((unsigned)time(NULL));
 system("title c语言(www.dotcpp.com)研究中心");
 color(11);
 File_in();
 init(a, &snake, &len);
 Manual();
 while (ch != 0x1B) // 按 ESC 结束 
 { 
 Draw(snake, len);
 if (!apple[2]) {
 apple[0] = rand()%N + 1;
 apple[1] = rand()%N + 1;
 apple[2] = 1;
 }
 Sleep(200-score[3]*10);
 setbuf(stdin, NULL);
 if (kbhit())
 {
 gotoxy(0, N+2);
 ch = getche();
 }
 snake = Move(snake, ch, &len); 
 if (Block(snake[0])==1) 
 {
 gotoxy(N+2, N+2);
 puts("你输了");
 File_out();
 Free(snake, len);
 getche();
 exit(0); 
 } 
 }
 Free(snake, len);
 exit(0);
}

C语言研究中心(www.dotcpp.com)

C语言网提供「C语言、C++、算法竞赛」在线课程,全部由资深研发工程师或ACM金牌大佬亲授课,更科学、全面的课程体系,以在线视频+在线评测的学习模式学习,学练同步,拒绝理论派,真正学会编程!还有奖学金等增值福利等你!

C语言网, 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明VC6下实现C语言贪吃蛇游戏源码
喜欢 (51)
[jinyangH@aliyun.com]
分享 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
(10)个小伙伴在吐槽
  1. 头文件是什么?
    鑫鑫2016-10-06 10:35 回复
    • 已经补全~
      CTO2016-12-17 21:01 回复
      • 为什么找不到东西吃
        2018-03-02 23:27 回复
  2. 怎么这里编译出错了 e:\vc 6.0\msdev98\myprojects\snake\snake.cpp(262) : fatal error C1010: unexpected end of file while looking for precompiled header directive Error executing cl.exe.
    星晟2017-01-04 19:32 回复
  3. 为什么在dev中运行不了啊
    痞子绅士2017-05-09 18:00 回复
  4. 报错 如下 Linking... LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main Debug/lianxi.exe : fatal error LNK1120: 1 unresolved externals 执行 link.exe 时出错.
    xlf2017-05-21 11:11 回复
  5. 没有main函数,能运行吗?
    xlf2017-05-21 11:25 回复
  6. VS2017闪退
    北漠2017-06-12 22:25 回复
    • 一样,不过我是2015
      凯子2019-12-18 16:52 回复
  7. 垃圾,一大堆错误,还缺头文件
    漆漆2019-07-21 21:40 回复