找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4152|回复: 8
打印 上一主题 下一主题
收起左侧

c语言贪吃蛇

[复制链接]
跳转到指定楼层
楼主
ID:51090 发表于 2014-9-17 14:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 xiaojuan 于 2014-9-17 14:55 编辑

#include<stdio.h>  //头文件 上传会自动去掉 请大家手动加上

void init ();

int main (void)
{
init();
return 0;
}

void init ()
{
int nIndex = 0;
int nRow = 20;
int nColumn = 44;
int nRowIndex = 0;

for (nIndex = 1; nIndex <= nColumn; nIndex++)
  printf ("*");
printf ("\n");
for (nRowIndex = 1; nRowIndex <=nRow-2; nRowIndex++)
{
  for (nIndex = 1; nIndex <=nColumn; nIndex++)
  {
   if (nIndex==1  ||  nIndex == nColumn)    //这句的选择很漂亮
   {
    printf ("*");
   }
   else
   {
    printf (" ");
   }
  }
  printf ("\n");
}
// printf ("\n");
for (nIndex = 1; nIndex <= nColumn; nIndex++)
  printf ("*");
printf ("\n");
}

评分

参与人数 1黑币 +5 收起 理由
lytcl + 5 赞一个!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:51090 发表于 2014-9-17 14:53 | 只看该作者
本帖最后由 xiaojuan 于 2014-9-17 15:02 编辑

#include<stdlib.h>
#include <windows.h>
#include <stdio.h>
#include <iostream>
int main (void)
{
COORD dwCursorPosition;

HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);  //将函数与命名放在一块了,相当于HANDLE hOutput; hOutput = GetStdHandle(STD_OUTPUT_HANDLE);

if (INVALID_HANDLE_VALUE == hOutput)
{
  printf ("GetStdHandle error!\n");
  return -1;        //跳出,显示错误
}


dwCursorPosition.X = 1;      //列
dwCursorPosition.Y = 10;     //行

if (!SetConsoleCursorPosition(hOutput, dwCursorPosition))//!给的很有味道
{
  printf ("SetConsoleCursorPosition!\n");
  return -1;
}
printf ("Hello, world!\n");
return 0;
}
回复

使用道具 举报

板凳
ID:51090 发表于 2014-9-17 14:54 | 只看该作者
本帖最后由 xiaojuan 于 2014-9-17 15:02 编辑


有些注释搞不出来很无语

#include<stdlib.h>
#include <windows.h>
#include <stdio.h>
#include <iostream>
int changeCursor(int nX, int nY);
bool drawFrame(int nXStart, int nYStart, int nCol, int nRow);

int main (int argc, char ** argv)
{
int nCol = 30;
int nRow = 15;
//画出两个格子
drawFrame(2,5,nCol,nRow);    //画出格子
drawFrame(36,5,nCol,nRow);    //画出格子


printf ("\n\n\n\n\n");
return 0;
}

int changeCursor(int nX, int nY)
{
COORD dwCursorPosition;

HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE); //  hOutput = GetStdHandle(STD_OUTPUT_HANDLE);

if (INVALID_HANDLE_VALUE == hOutput)
{
  printf ("GetStdHandle error!\n");
  return -1;        
}


dwCursorPosition.X = nX;      //列
dwCursorPosition.Y = nY;     //行

if (!SetConsoleCursorPosition(hOutput, dwCursorPosition))//!给的很有味道
{
  printf ("SetConsoleCursorPosition!\n");
  return -1;
}
}


bool drawFrame(int nXStart, int nYStart, int nCol, int nRow) //设定所设的边框的起始位置与边框的大小
{
int nColindex = 0;
int nRowindex = 0;

if (nXStart % 2 == 1  || nCol%2 == 1)    //因为我们采用的■是中文字符,中文字符占用两个字节,所以要使初始位是偶数,结束位也是偶数
  return false;

if (!(nXStart  >= 0 && nXStart + nCol <80
  && nYStart >= 0 && nYStart + nRow <80))   //设定方块起始位置与终止位置的所在的方框边缘
  return false;

changeCursor(nXStart, nYStart);
for (nColindex = 1; nColindex <= nCol/2+1; nColindex++)
   printf ("■");
printf ("\n");

changeCursor(nXStart + 3, nYStart + 6);
printf ("Hello world!!!");

for(nRowindex = 1; nRowindex <= nRow; nRowindex++)
{

    changeCursor(nXStart  , nYStart + nRowindex);    //出位置
    printf("■");
    changeCursor(nXStart + nCol , nYStart + nRowindex);    //末位置
    printf("■");

}

changeCursor(nXStart, nYStart + nRowindex);
for (nColindex = 1; nColindex <= nCol/2+1; nColindex++)
  printf ("■");
printf ("\n");
}
回复

使用道具 举报

地板
ID:51090 发表于 2014-9-17 14:54 | 只看该作者


       第一次开始模块化编程,先说下方法,其他的以后再补充



       建立一个工作区间过后,会自动出现
贪吃蛇lesson_4这样的一个方框,然后新建几个.c和.h文件,这几个文件会自动归类到几个文件夹里面
       .h这个文件主要作用是进行函数的声明,就是把你在main.c这个主函数里面所需要的函数写里面
__________________________________________________________________________________________________________________
      贪吃蛇里面的game.h文件内容
                                      BOOL init();
                                      BOOL isContinue();
                                      BOOL clean();
                                      BOOL input();
                                      BOOL step();
                                      BOOL draw();
因为C语言不接受bool  所以要用BOOL
华丽丽的分割线,最喜欢这玩意了,代表着一个的结束
___________________________________________________________________________________________________________________
然后在game.c文件夹中写函数里面的内容
                         根据在这个函数里面用到的库函数,在上面进行声明
                         贪吃蛇用到的
                                             # include
                                             # include
                        因为game.c这个里面主要做的就是将.h文件夹里面的函数进行解释
                                         所以加 # include "game.h"
___________________________________________________________________________________________________________________
最后是main.c
           这个文件里面主要是对game.c里面的的进行调用
                                      所以应该加# include "game.h"
           main.c里面的内容要从简,只写需要的就好了
                                  int main (int argc, char ** argv)
                               {
                                           init ();
                                           while (isContinue())
                                           {
                                                     clean ();
                                                     input ();
                                                     if (step ())
                                                    draw ();
                                                    Sleep (500);
                                                    }
回复

使用道具 举报

5#
ID:51090 发表于 2014-9-17 14:54 | 只看该作者
本帖最后由 xiaojuan 于 2014-9-17 15:03 编辑


     额,这个,今天感觉实在是太乱了,不知道从哪开始,先分割线调整下

——————————————————————————————————————————————



今天的贪吃蛇程序是这样的吧,感觉还是哟个顺序问题,开始程序是一条蛇在一个DOS中运行,然后开始写多条,多条就是建立一个结构体,这样就可以设置多个了,然后在考虑多画几个图出来

——————————————————————————————————————————————game.c文件




#include<stdlib.h>
#include <windows.h>
#include <stdio.h>
#include <iostream>

// 自写库
# include "game.h"


int changeCursor(int nX, int nY)
{
COORD dwCursorPosition;

HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE); //  hOutput = GetStdHandle(STD_OUTPUT_HANDLE);

if (INVALID_HANDLE_VALUE == hOutput)
{
  printf ("GetStdHandle error!\n");
  return -1;        
}


dwCursorPosition.X = nX;      //列
dwCursorPosition.Y = nY;     //行

if (!SetConsoleCursorPosition(hOutput, dwCursorPosition))//!给的很有味道
{
  printf ("SetConsoleCursorPosition!\n");
  return -1;
}
}


BOOL drawFrame(int nXStart, int nYStart, int nCol, int nRow) //设定所设的边框的起始位置与边框的大小
{
int nColindex = 0;
int nRowindex = 0;

if (nXStart % 2 == 1  || nCol%2 == 1)    //因为我们采用的■是中文字符,中文字符占用两个字节,所以要使初始位是偶数,结束位也是偶数
  return FALSE;

if (!(nXStart  >= 0 && nXStart + nCol <80   //!用的需要学下
  && nYStart >= 0 && nYStart + nRow <80))   //设定方块起始位置与终止位置的所在的方框边缘
  return FALSE;

nCol /= 2;
changeCursor(nXStart, nYStart);
for (nColindex = 1; nColindex <= nCol; nColindex++)
   printf ("¤");
printf ("\n");

changeCursor(nXStart + 5, nYStart + 3);
// printf ("guanguan a donkey");

for(nRowindex = 1; nRowindex <= nRow-2; nRowindex++)
{

    changeCursor(nXStart  , nYStart + nRowindex);    //出位置
    printf("¤");
    changeCursor(nXStart+(nCol-1)*2, nYStart + nRowindex);    //末位置
    printf("¤");

}

changeCursor(nXStart, nYStart + nRow-1);
for (nColindex = 1; nColindex <= nCol; nColindex++)
  printf ("¤");
printf ("\n");
}

//  设定边框的大小    //

//不加typedef就是相当于给这个结构体起了个名字叫 g_frame;
typedef struct
{
int nLeft;
int nTop;
int nHeight;
int nWidth;
}StuFrame;  //g开头全局变量


//设定贪吃蛇的起始位置和蛇的大小 //

//typedef 是给一个变量从新起了个名字typedef long byte_4; 给已知数据类型long起个新名字,叫byte_4。

typedef struct StuPoint
{
int nX;
int nY;
} StuPoint;

typedef enum _EN_DIRECTION
{
EN_UP,
EN_DOWN,
EN_LEFT,
EN_RIGHT,
} EN_DIRECTION;

typedef struct _StuSnake
{
StuFrame frame;
StuPoint snake[100];
int nSnakeLen;
EN_DIRECTION enDirection;
BOOL bContinue;
} StuSnake;

StuSnake g_snake[10];
int g_nSnakeLen = 0;

BOOL init_snake(StuSnake *pSnake,
    int nLeft, int nTop,
    int nWidth, int nHeight)
{

(*pSnake).frame.nLeft = nLeft;
(*pSnake).frame.nTop = nTop;
(*pSnake).frame.nHeight = nHeight;
(*pSnake).frame.nWidth = nWidth;
//面述方格里面一共有多少格子
// StuPoint *matrixPoint = (StuPoint *)malloc(sizeof(g_frame.nHeight-2)*g_frame.nWidth-2));
drawFrame(nLeft, nTop,
     nWidth,  nHeight);    //画出格子
//初始化小蛇的位置

(*pSnake).nSnakeLen = 3;
(*pSnake).snake[0].nX = ((*pSnake).frame.nLeft+2) + 0*2;
(*pSnake).snake[0].nY = (*pSnake).frame.nTop + (*pSnake).frame.nHeight/2;
(*pSnake).snake[1].nX = ((*pSnake).frame.nLeft+2) + 1*2;
(*pSnake).snake[1].nY = (*pSnake).frame.nTop + (*pSnake).frame.nHeight/2;
(*pSnake).snake[2].nX = ((*pSnake).frame.nLeft+2) + 2*2;
(*pSnake).snake[2].nY = (*pSnake).frame.nTop + (*pSnake).frame.nHeight/2;

(*pSnake).bContinue = TRUE;
(*pSnake).enDirection = EN_RIGHT;
}



BOOL init()
{
   //下面五个数据不再是全局变量,只能在这个地方在初始化
init_snake(&g_snake[0], 28, 5, 20, 9);
init_snake(&g_snake[1], 4, 2, 20, 9);
init_snake(&g_snake[2], 50, 12, 20, 9);

g_nSnakeLen = 3;    //蛇的个数
  // drawFrame(36,5,nCol,nRow);    //画出格子

return TRUE;
}
BOOL isContinue()
{
return g_snake[0].bContinue;
}

BOOL input( )
{
int nSnakeIndex = 0;
char c = '0';
if (kbhit())
  c = getch ();

for (nSnakeIndex = 0; nSnakeIndex< g_nSnakeLen; nSnakeIndex++)
{
  switch (c)
  {
   case 'w':
    if (EN_UP == g_snake[nSnakeIndex].enDirection
     || EN_DOWN == g_snake[nSnakeIndex].enDirection)  //在直线方向的时候按上下键没有反应
     break;
    g_snake[nSnakeIndex].enDirection = EN_UP;
    break;
   case 's':
    if (EN_UP == g_snake[nSnakeIndex].enDirection
     || EN_DOWN == g_snake[nSnakeIndex].enDirection)  //在直线方向的时候按上下键没有反应
     break;
    g_snake[nSnakeIndex].enDirection = EN_DOWN;
    break;
   case 'a':
    if (EN_LEFT == g_snake[nSnakeIndex].enDirection
     || EN_RIGHT == g_snake[nSnakeIndex].enDirection)  //在水平方向的时候按左右键没有反应
     break;
    g_snake[nSnakeIndex].enDirection = EN_LEFT;
    break;
   case 'd':
    if (EN_LEFT == g_snake[nSnakeIndex].enDirection
     || EN_RIGHT == g_snake[nSnakeIndex].enDirection)  //在水平方向的时候按左右键没有反应
     break;
    g_snake[nSnakeIndex].enDirection = EN_RIGHT;
    break;
   default:
    break;
  }
}
return TRUE;
}

BOOL clean()
{
int nSnakeIndex = 0;
int nIndex = 0;

for (nSnakeIndex = 0; nSnakeIndex< g_nSnakeLen; nSnakeIndex++)
{
  for (nIndex = 0; nIndex < g_snake[nSnakeIndex].nSnakeLen; nIndex++)
  {
   changeCursor(g_snake[nSnakeIndex].snake[nIndex].nX, g_snake[nSnakeIndex].snake[nIndex].nY);
    printf ("  ");
  }
}
return TRUE;
}

BOOL step()
{
int nIndex = 0;
int nSnakeIndex = 0;

for (nSnakeIndex = 0; nSnakeIndex< g_nSnakeLen; nSnakeIndex++)
{
  for (nIndex = 0; nIndex < g_snake[nSnakeIndex].nSnakeLen-1; nIndex++)
  { //后一个坐标移到前一个坐标
   g_snake[nSnakeIndex].snake[nIndex].nX = g_snake[nSnakeIndex].snake[nIndex+1].nX;  //下标为1的坐标移到下标为0的坐标
   g_snake[nSnakeIndex].snake[nIndex].nY = g_snake[nSnakeIndex].snake[nIndex+1].nY;
  }
  switch (g_snake[nSnakeIndex].enDirection)
  {
  case EN_UP:
    g_snake[nSnakeIndex].snake[g_snake[nSnakeIndex].nSnakeLen - 1].nY -= 1;
   break;
  case EN_DOWN:
    g_snake[nSnakeIndex].snake[g_snake[nSnakeIndex].nSnakeLen - 1].nY += 1;
   break;
  case EN_LEFT:
    g_snake[nSnakeIndex].snake[g_snake[nSnakeIndex].nSnakeLen - 1].nX -= 2;
   break;
  case EN_RIGHT:
    g_snake[nSnakeIndex].snake[g_snake[nSnakeIndex].nSnakeLen - 1].nX += 2;
   break;
  }
  
  //touch frame   计算貌似还是有点问题
  if (g_snake[nSnakeIndex].snake[g_snake[nSnakeIndex].nSnakeLen - 1].nY >= g_snake[nSnakeIndex].frame.nTop + g_snake[nSnakeIndex].frame.nHeight-1
   ||g_snake[nSnakeIndex].snake[g_snake[nSnakeIndex].nSnakeLen - 1].nY < g_snake[nSnakeIndex].frame.nTop
   ||g_snake[nSnakeIndex].snake[g_snake[nSnakeIndex].nSnakeLen - 1].nX > g_snake[nSnakeIndex].frame.nLeft + g_snake[nSnakeIndex].frame.nWidth - 2
   ||g_snake[nSnakeIndex].snake[g_snake[nSnakeIndex].nSnakeLen - 1].nX < g_snake[nSnakeIndex].frame.nLeft)
  {
   g_snake[nSnakeIndex].bContinue = FALSE;
  // changeCursor(14, 12);
   printf ("YOU ARE LOST");
  // init ();
  // printf ("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
  // return FALSE;
  }
}
return TRUE;
}

BOOL draw()
{
int nIndex = 0;
int nSnakeIndex = 0;
for (nSnakeIndex = 0; nSnakeIndex< g_nSnakeLen; nSnakeIndex++)
{
  for (nIndex = 0; nIndex < g_snake[nSnakeIndex].nSnakeLen; nIndex++)
  {
   changeCursor(g_snake[nSnakeIndex].snake[nIndex].nX, g_snake[nSnakeIndex].snake[nIndex].nY);
    printf ("■");
  }

}
return TRUE;
}
回复

使用道具 举报

6#
ID:156587 发表于 2017-2-7 22:31 | 只看该作者
这个贴子真是厉害啊,慢慢研究
回复

使用道具 举报

7#
ID:227363 发表于 2017-8-13 09:35 | 只看该作者
太棒了
回复

使用道具 举报

8#
ID:227363 发表于 2017-8-13 09:35 | 只看该作者
值得一看
回复

使用道具 举报

9#
ID:244671 发表于 2017-10-31 19:14 | 只看该作者
感谢楼主
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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