C语言开发简易版扫雷小游戏

前言:

  想起来做这个是因为那时候某天知道了原来黑框框里面的光标是可以控制的,而且又经常听人说起这个,就锻炼一下好了。

  之前就完成了那1.0的版本,现在想放上来分享却发现有蛮多问题的,而且最重要的是没什么注释【果然那时候太年轻】!现在看了也是被那时候的自己逗笑了,就修改了一些小bug,增加了算是详尽而清楚的注释,嗯,MSDN上面对各种函数的解释很详细的【又锻炼一下英语】,顺便让开头和结尾的展示“动”了起来,就当作1.5的版本好了。

  这个只是给出了一个实现的思路,其中肯定也有很多不合理的地方和可优化之处,希望能供大家参考和交流。

过程:

  期间也是遇到了蛮多困惑的。

  1.最先的是怎么知道按了方向键,左查右找,说法有好几个版本呢,就想看能不能自己测试一下自己的好了,再查再找,好了,感谢写了测试方向键的人;

  2.再比如说怎么消除窗口中一行的缓冲,因为不消除就一直在哪,视觉效果不好,翻查了一下资料,就写了delLine()这个来做这个事情了;

  3.设定颜色时,在cmd里面help color知道了颜色的参数,但是通过数字0-9来设定的太暗了,发现有更亮的,比如0A,在setColor()里面用它却说类型不对,于是上MSDN,发现还可以用宏,就想通过如'BACKGROUND_INTENSITY  | BACKGROUND_RED '之类来完成,就想怎么去代替那个宏,觉得每次写一长串好麻烦。然后换了各种类型的参数类型和不定长参数什么的,发现还是不行,后来一想,万一它支持数字10呢,A不就是10么?!一测,成了;

  4.还有一些判断状态的顺序,嗯啊,这些要先想好再下手,不然左改右改很麻烦呢;

  5.别的困惑不怎么记得了。。。

代码:

  下面分别给出LittleMines【好弱的名字】,测试颜色,测试方向键的代码。【反映说有行号不好复制,那取消好了】

/*********************************
* c语言命令行+方向键简易版扫雷
* Author:AnnsShadoW
* Version:1.5
* Time:2015-11-29
********************************/

/********************************
* 运行环境:Windows10-64bit
* 编译环境:Codeblocks-13.12
********************************/

//用到的都导进去吧
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include <windows.h>

//定义各种判断状态的ASCII码
//MINE是定义翻开格子中的‘*'号
#define MINE   42
#define ESC    27
#define ENTER   13
#define SPACE   32
#define UP    72
#define DOWN   80
#define LEFT   75
#define RIGHT   77

//定义类型状态,方便后续判断
#define bool int
#define true 1
#define false 0
#define ROW    10
#define COLUMN   10
#define ALL_MINES  15

//当前位置的结构体
typedef struct currentPosition_struct
{
 int x;
 int y;
} currentPosition;

//每一个小格的结构体
typedef struct blockCondition_struct
{
 //是否被覆盖了
 bool beCovered;
 //以它为中心周围的雷数
 int minesNum;
} blockCondition;

//光标的位置数组
currentPosition cursorPos[ROW][COLUMN];
//雷区地图的数组
blockCondition minesMap[ROW][COLUMN];
//剩下的格子数
int leftBlocksNum = ROW * COLUMN;
//光标在光标位置、雷区地图中的下标
int index_x = 0, index_y = 0;

//设置窗口前后背景色
void setColor(unsigned short color);
//开头的欢迎“动画”
void welcomeToMyGame();
//游戏地图初始化
void gameInitailize();
//以某格子为中心计算惊天雷数量
void countMines();
//获取键盘的输入
void keyBoardInput();
//指定光标的位置
void setCurPos(int y, int x);
//移动光标的位置
void moveCursor(int y, int x);
//检测每一步的结果
bool checkResult(int y, int x);
//输出游戏界面
void printMap();
//游戏退出后的“动画”
void gameOver(char *str);
//删除窗口中一行的缓冲
void delLine(int y);

int main()
{
 setColor(10);
 system("cls");
 welcomeToMyGame();
 gameInitailize();
 countMines();
 printMap();

 for(;;)
 {
  setCurPos(cursorPos[index_y][index_x].y, cursorPos[index_y][index_x].x);
  keyBoardInput();
 }

 return EXIT_SUCCESS;
}

void setColor(unsigned short color)
{
 HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);
 //对设置之后的输出有效
 SetConsoleTextAttribute(hCon, color);
};

void welcomeToMyGame()
{
 int i = 0;
 char introductions0[] = "LittleMines";
 char introductions1[] = "--";
 char introductions2[] = "Version 1.5";
 char introductions3[] = "Author:AnnsShadow,thank you ╮( ̄▽ ̄)╭";

 //控制台窗口默认大小是80*25,所以能达到最大的位置是[79,24]
 for(i = 0; i <= 5; ++i)
 {
  //每次输出之前都清屏,就会有看起来是动的效果
  system("cls");
  //纵坐标不断加,形成向下效果
  setCurPos(i, (80 - strlen(introductions0)) / 2);
  printf("%s", introductions0);
  //缓冲一下,太快了看不到呢
  Sleep(50);
 }

 //为了对称,从边边78开始到中间39好了
 for(i = 78; i >= 39; --i)
 {
  //上面用了5行了,大于它吧
  setCurPos(7, i);
  printf("%s", introductions1);
  setCurPos(7, 78 - i);
  printf("%s", introductions1);
  Sleep(40);
 }

 //从左边一步步进入屏幕中间
 for(i = 0; i <= (80 - strlen(introductions2)) / 2; ++i)
 {
  //要删除这一行缓冲的原因:
  //上一次循环的输出会影响到下一次,如输出VVVVVVVVVVersion1.0
  //换成中文就不会,中文要两个字节才能显示完整呀
  delLine(9);
  //这里就会有闪闪发亮的效果哦
  Sleep(10);
  setCurPos(9, i);
  printf("%s", introductions2);
  Sleep(50);
 }

 //从底部进入
 for(i = 24; i >= 12; --i)
 {
  setCurPos(i, (80 - strlen(introductions3)) / 2);
  printf("%s", introductions3);
  Sleep(20);
  //删除上一次的缓冲,不加1的话最后一行就会残留,其它都不见了
  delLine(i + 1);
  Sleep(50);
 }

 Sleep(500);
 char help0[] = "动啊:←↑↓→╮(╯▽╰)╭";
 char help1[] = "点击啊:Space / Enter (ΘェΘ)";
 char help2[] = "不玩啦:Esc (>﹏<)";
 char help3[] = "<<愿你玩的开心 _(:з」∠)_>>";
 setCurPos(14, (80 - strlen(help0)) / 2);
 setColor(14);
 printf("%s", help0);
 setCurPos(15, (80 - strlen(help1)) / 2);
 printf("%s", help1);
 setCurPos(16, (80 - strlen(help2)) / 2);
 printf("%s", help2);
 setCurPos(17, (80 - strlen(help3)) / 2);
 setColor(15);
 printf("%s", help3);
 getch();
}

void gameInitailize()
{
 int i = 0, j = 0;
 int allMines = ALL_MINES;
 //设置随机值
 srand((unsigned int)time(NULL));

 //雷区地图初始化
 for(i = 0; i < ROW; ++i)
 {
  for(j = 0; j < COLUMN; ++j)
  {
   minesMap[i][j].beCovered = true;
   minesMap[i][j].minesNum = 0;
  }
 }

 //放置惊天雷!
 while(allMines)
 {
  i = rand() % ROW;
  j = rand() % COLUMN;

  if(minesMap[i][j].minesNum == 0)
  {
   //这个‘-1'就作为判断惊天雷的依据了
   minesMap[i][j].minesNum = -1;
   --allMines;
  }
 }

 //光标位置初始化
 for(i = 0; i < ROW; ++i)
 {
  for(j = 0; j < COLUMN; ++j)
  {
   cursorPos[i][j].x = j * 6 + 3;
   cursorPos[i][j].y = i * 2 + 1;
  }
 }
}

void countMines()
{
 int i = 0, j = 0, m = 0, n = 0;
 //以格子为中心周围的雷数
 int minesNum = 0;

 for(i = 0; i < ROW; ++i)
 {
  for(j = 0; j < COLUMN; ++j)
  {
   //遇到惊天雷就放弃统计吧
   if(minesMap[i][j].minesNum == -1)
    continue;
   minesNum = 0;
   //九宫格嘛,那3次好了
   for(m = -1; m <= 1; ++m)
   {
    //行溢出了没,不能算没有的哦
    if(i + m < 0 || i + m >= ROW)
    {
     continue;
    }

    for(n = -1; n <= 1; ++n)
    {
     //这次就是看列溢出了没
     if(j + n < 0 || j + n >= COLUMN)
     {
      continue;
     }
     //周边有惊天雷赶紧加起来
     if(minesMap[i + m][j + n].minesNum == -1)
     {
      ++minesNum;
     }
    }
   }
   minesMap[i][j].minesNum = minesNum;
  }
 }
}

void keyBoardInput()
{
 bool lose;
 int key1 = getch();

 /*****************************
 测试之后才知道方向键两个字节
 第一个字节ASCII 0x00e0 224
 第二个字节分别是:
 上:0x0048 72
 下:0x0050 80
 左:0x012b 75
 右:0x012d 77
 *****************************/

 if(key1 == 224)
 {
  int key2 = getch();

  switch(key2)
  {
  case UP:
   moveCursor(index_y - 1, index_x);
   break;

  case DOWN:
   moveCursor(index_y + 1, index_x);
   break;

  case LEFT:
   moveCursor(index_y, index_x - 1);
   break;

  case RIGHT:
   moveCursor(index_y, index_x + 1);
   break;

  default:
   break;
  }
 }
 else
 {
  switch(key1)
  {
  case ENTER:
  case SPACE:
   lose = checkResult(index_y, index_x);
   system("cls");
   printMap();

   if(lose)
   {
    setColor(13);
    printf("|    诶哟,还差一点点哦! ╥﹏╥     |\n");
    printf("|     按\"r\"重玩,Esc不玩啦。     |\n");
    printf("[%c]-------------------------------------------------------[%c]\n", MINE, MINE);
    setColor(10);
    Sleep(1000);
    char key3 = getch();

    if(key3 == 'r' || key3 == 'R')
    {
     //重来,跟main中过程是一样的
     setColor(10);
     gameInitailize();
     countMines();
     printMap();
    }
   }
   //剩余的格子比雷还要多,可以继续玩
   else if(leftBlocksNum > ALL_MINES)
   {
    setColor(13);
    printf("|     哎哟,挺不错哦~ ( ̄0  ̄)    |\n");
    printf("[%c]-------------------------------------------------------[%c]\n", MINE, MINE);
    setColor(10);
   }
   //来到这你已经赢了
   else
   {
    setColor(13);
    printf("|     哟,恭喜你赢了(/≧▽≦/)    |\n");
    printf("|     按\"r\"重玩,Esc就不玩啦。     |\n");
    printf("[%c]-------------------------------------------------------[%c]\n", MINE, MINE);
    setColor(10);
    Sleep(1000);
    char key3 = getch();

    if(key3 == 'r' || key3 == 'R')
    {
     setColor(10);
     gameInitailize();
     countMines();
     printMap();
    }
   }

   break;

  case ESC:
   system("cls");
   gameOver("\t\t\t啦啦啦~很逗很扯吧~最后感谢你的玩耍呀(≧Д≦)\n\n\n\n\n\n\n\n");

  default:
   break;
  }
 }
}

void setCurPos(int y, int x)
{
 //在窗口缓冲中定义每个位置的状态
 COORD currentPosition;
 currentPosition.Y = y;
 currentPosition.X = x;
 //所以现在的位置是在{y,x}
 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), currentPosition);
}

void moveCursor(int y, int x)
{
 //限定能走的地方
 if((x >= 0 && x < COLUMN) && (y >= 0 && y < ROW))
 {
  setCurPos(cursorPos[y][x].y, cursorPos[y][x].x);
  index_x = x;
  index_y = y;
 }
}

bool checkResult(int y, int x)
{
 int i = 0, j = 0;

 //检测有没有溢出地图了
 if(x < 0 || x >= COLUMN || y < 0 || y >= ROW)
 {
  return false;
 }

 //就是你了!被选中的格子!
 minesMap[y][x].beCovered = false;

 //被惊天雷炸了
 if(minesMap[y][x].minesNum == -1)
 {
  minesMap[y][x].minesNum = 9;
  return true;
 }

 //如果没有雷,就当作空格吧
 if(minesMap[y][x].minesNum > 0 && minesMap[y][x].minesNum < 9)
 {
  return false;
 }

 //九宫格,3x3咯
 for(i = -1; i <= 1; ++i)
 {
  //检查一下在这一行溢出了没吧
  if(y + i < 0 || y + i >= ROW)
  {
   continue;
  }

  for(j = -1; j <= 1; ++j)
  {
   //这次就到列了吧
   if(x + j < 0 || x + j >= COLUMN)
   {
    continue;
   }
   //如果下一个是没开过的,就检查它吧
   if(minesMap[y + i][x + j].beCovered)
   {
    minesMap[y + i][x + j].beCovered = false;
    checkResult(y + i, x + j);
   }
  }
 }

 return false;
}

void printMap()
{
 system("cls");
 char help0[] = "←↑↓→";
 char help1[] = "动啊";
 char help2[] = "Space / Enter";
 char help3[] = "点击啊";
 char help4[] = "Esc 不玩啦";
 //因为要输出提示,所以地图不能太大了,10x10就差不多了
 setColor(14);
 setCurPos(4, 62);
 printf("%s", help0);
 setCurPos(6, 62);
 printf("%s", help1);
 setCurPos(9, 62);
 printf("%s", help2);
 setCurPos(11, 62);
 printf("%s", help3);
 setCurPos(14, 62);
 printf("%s", help4);
 setCurPos(0, 0);
 setColor(10);

 int i = 0, j = 0, k = 0;
 leftBlocksNum = 0;
 setColor(11);
 printf("[开]--");
 setColor(10);

 for(k = 1; k < COLUMN - 1; ++k)
 {
  printf("+-----");
 }
 setColor(11);
 printf("+--[心]\n");
 setColor(10);

 for(i = 0; i < ROW; ++i)
 {
  for(j = 0; j < COLUMN; ++j)
  {
   if(minesMap[i][j].beCovered)
   {
    ++leftBlocksNum;
    //这个输出的就是格子被覆盖的时候输出的图形,可以换成1-6试试
    //1-4是正方形的4个角,5-6是双竖线和双横线
    printf("| %c ", 3);
   }
   else if(minesMap[i][j].minesNum == -1 || minesMap[i][j].minesNum == 9)
   {
    printf("| %c ", MINE);
   }
   else if(minesMap[i][j].minesNum == 0)
   {
    printf("| %c ", ' ');
   }
   else
   {
    printf("| %d ", minesMap[i][j].minesNum);
   }
  }

  printf("|\n");

  if(i < ROW - 1)
  {
   for(k = 0; k < COLUMN; ++k)
   {
    printf("+-----");
   }

   printf("+\n");
  }
 }
 setColor(11);
 printf("[就]--");
 setColor(10);

 for(k = 1; k < COLUMN - 1; ++k)
 {
  printf("+-----");
 }
 setColor(11);
 printf("+--[好]\n");
 setColor(10);
}

void gameOver(char *str)
{
 setColor(12);
 system("cls");
 setCurPos(10, 0);
 int i = 0;

 do
 {
  //逐字输出
  printf("%c", str[i]);
  Sleep(60);
 }
 while(str[i++]);
 setColor(15);
 system("pause");
 //随意终止程序并返回给OS,0是正常的
 exit(0);
}

void delLine(int y)
{
 HANDLE hOutput;
 //窗口缓存信息
 CONSOLE_SCREEN_BUFFER_INFO sbi;
 DWORD len, nw;
 //用MSDN上的TCHAR类型跪了,换成char就好
 char fillchar = ' ';
 //定位光标
 COORD startPosition = {0, y};
 //获取输出句柄
 hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
 //获取窗口缓冲中的信息
 GetConsoleScreenBufferInfo(hOutput, &sbi);
 //窗口缓冲的位置,这里取得X值
 len = sbi.dwSize.X;
 //从特定的位置用特定的字符去填充窗口的缓冲特定次数
 //成功返回非0值,一般都成功,就不判断了
 FillConsoleOutputCharacter(hOutput, fillchar, len, startPosition, &nw);
}

测试颜色:

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

void setColor(unsigned short color)
{
 HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);
 //对设置之后的输出有效
 SetConsoleTextAttribute(hCon, color);
};

int main()
{
 //测试颜色啊~~
 for(int i = 0; i <= 255; i++)
 {
  setColor(i);
  printf("%d\n", i);
  system("pause");
 }
 return 0;
}

测试方向键:

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

int main()
{
 unsigned short int k;

 while(1)
 {
  _sleep(100);

  if(_kbhit())
  {
   k = _getch();

   if(0 == k)
    k = _getch() << 8;

   _cprintf("key:0x%04x pressed\r\n", k);
  }
 }
 system("pause");
 return 0;
}

运行截图:图片不会动啦,在自己机子跑起来就看得到动的效果了~~~

后话:

  虽然不是什么很厉害的事情,稍微懂点的都可以自己做出来,不过在实践的过程中还是收获蛮多的,在这分享也算个小小的记录吧,继续加油~

时间: 2015-12-10

C语言实现五子棋小游戏

首先我们先来看一个稍微简单些的实现方式: #include <stdio.h> #include <stdlib.h> #define N 15 int chessboard[N + 1][N + 1] = { 0 }; int whoseTurn = 0; void initGame(void); void printChessboard(void); void playChess(void); int judge(int, int); int main(void) { init

原创的C语言控制台小游戏

最开始左上色块被感染,通过切换颜色,不断感染同色色块.亮点是可以切换图案,设置方块个数和最大限制次数.整体还是比较满意,希望大神指教. #include <stdio.h> #include <windows.h> #include <conio.h> #include <time.h> #include <stdlib.h> int DIFFICULT=44; int count=0 ; int TYPE_SHAPE=2 ; int flag=

基于C语言实现的迷宫游戏代码

本文实例讲述了基于C语言实现迷宫游戏的方法,代码备有较为详尽的注释,便于读者理解.通过该游戏代码可以很好的复习C语言的递归算法与流程控制等知识,相信对于学习游戏开发的朋友有一定的借鉴价值. 完整的实例代码如下: #include <graphics.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> #include <dos.h> #define N 20/*迷宫的大小,可改

C语言实现俄罗斯方块小游戏

C语言实现俄罗斯方块小游戏的制作代码,具体内容如下 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #define TTY_PATH "/dev/tty" #define STTY_ON "stty raw -echo -F" #define STTY_OFF "stty -raw echo -F" int map[21][14]; char

C语言实现汉诺塔游戏

操作就是:A B 号码A的塔顶一层放在号码B的塔顶.如1(空格) 3 回车. 话说有人能把我这C的代码添加到QT界面框架上去么?  代码写的不好 ,维护性不够,只能玩8层的,写完以后发现很难拓展,软件工程,设计模式有待提高.... 里面提示输入等级的装B用了,没有实现,大家随便输入个个位数就可以玩了. stackfunc.c #include"STACK.h" #include<stdio.h> extern ceng CENG[SIZE]; //数据入栈 void pus

C语言控制台版2048小游戏

效果不好,见谅,没事就写了一个!!! /** * @author Routh * @main.c * @date 2014, 4, 26 */ #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <windows.h> // console width #define CONSOLE_WIDTH 80 #define BOX_WIDTH 10 int BOX[4][4] = {

C语言实现2048小游戏

本文实例为大家分享了C语言实现2048小游戏的具体代码,供大家参考,具体内容如下 具有以下特点: 1.linux下完成 2.非堵塞键盘读取 3.随机生成2和4 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #define TTY_PATH "/dev/tty" #define STTY_ON "stty raw -echo -F" #define STTY_O

基于C语言实现五子棋游戏完整实例代码

本文实例讲述了基于C语言实现五子棋游戏的方法,代码备有比较完整的注释,可以帮助读者更好的加以理解. 五子棋游戏代码如下: /* * 使用键盘的上下左右键移动棋盘,空格键表示下棋,ESC键退出程序 */ #include <stdio.h> #include <stdlib.h> #include <bios.h> #include <graphics.h> #include<malloc.h> /* * 对应键盘键的十六进制数字 */ #defi

C语言实现最简单的剪刀石头布小游戏示例

本文实例讲述了C语言实现最简单的剪刀石头布小游戏.分享给大家供大家参考,具体如下: #include<stdio.h> #include<stdlib.h> #include<time.h> /*************\ * 剪刀 石头 布 * * 最简单小游戏 * \*************/ int main(void){ char gesture[3][10] = {"scissor","stone","clo

利用C语言实现2048小游戏的方法

准备工作 首先上一张图,因为这里只是在用C语言验证算法,所以没有对界面做很好的优化,丑是理所应当的. 了解了游戏的工作原理,实际上可以将游戏描述为四个带有方向的同一操作: 1.将所有数字向一个方向移动至中间没有空位 2.将相邻的两个相同的数字加和然后放在更靠近移动方向前部的一个位置上 另外需要判断一下玩家当前输入的内容是否可以执行,如果不可以执行等待用户下一条记录. 同时需要对游戏的进程进行控制,如果可以继续游戏,那么运行玩家继续输入下一条指令,而如果不可以进行,那么提示无法继续游戏的提示. 首

基于C语言实现的贪吃蛇游戏完整实例代码

本文以实例的形式讲述了基于C语言实现的贪吃蛇游戏代码,这是一个比较常见的游戏,代码备有比较详细的注释,对于读者理解有一定的帮助. 贪吃蛇完整实现代码如下: #include <graphics.h> #include <conio.h> #include <stdlib.h> #include <dos.h> #define NULL 0 #define UP 18432 #define DOWN 20480 #define LEFT 19200 #defi

JS实现的贪吃蛇游戏完整实例

本文实例讲述了JS实现的贪吃蛇游戏.分享给大家供大家参考,具体如下: 思想: 1.设计蛇:属性有宽.高.方向.状态(有多少节),方法:显示,跑 2.设计食物:属性宽.高 3.显示蛇:根据状态向地图里加元素 4.蛇跑起来:下一节到前一节的位置,蛇头根据方向变,删除原来的蛇,新建蛇:当出界时,死亡,初始化:当蛇头吃到自己的时候,死亡,初始化 5.食物被吃掉,蛇加一节,去掉原来的食物,生成新的食物 6.添加定时器,绑定按键 完整示例: <!doctype html> <html lang=&q

JavaScript贪吃蛇小组件实例代码

1 写在前面 看来<JavsScript高级编程>,想做一个小demo练练自己的手,选择了贪吃蛇游戏.由于以前都是用c#写的,将贪吃蛇写到一个类里面,然后一个一个小方法的拆分,只向外提供需要提供的方法.这样就可以将贪吃蛇作为一个模块,任何地方都可以复用的.然而,用js进行编写的时候,由于不能很好的利用js语言的特性进行模块化编程,所以第一版的实现完全采用面向过程的方式,将函数中所需要的变量全部声明为全局变量.虽然这样也能够实现功能,但是做不到复用,而且定义非常多的最顶层变量,污染了全局变量.写

Java swing框架实现的贪吃蛇游戏完整示例

本文实例讲述了Java swing框架实现的贪吃蛇游戏.分享给大家供大家参考,具体如下: java是门高级语言,做游戏时适合做后台,但是用它也可以做游戏.闲来无事做的时候可以用来写点小游戏,练习练习预防早衰哈哈! 闲话不说了 下面是以前练习的作品,不怕大家笑话,那个时候用了一个礼拜才做出来的. 源码如下供大家学习. 使用的是java的 swing  Jframe Jpanel JButton   当然你也可以使用awt 先来看看运行效果: 具体代码: package Tcs; /** * * *

C语言链表实现贪吃蛇游戏

阅读学习了源代码,并做了简单的注释和修改,里面只用了链表数据结构,非常适合C语言入门者学习阅读. 程序可在VS2013下编译运行. #include<stdio.h> #include<time.h> #include<windows.h> #include<stdlib.h> #define U 1 #define D 2 #define L 3 #define R 4 //蛇的状态,U:上 :D:下:L:左 R:右 typedef struct SNAK

javascript实现的猜数小游戏完整实例代码

本文实例讲述了javascript实现的猜数小游戏.分享给大家供大家参考,具体如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <

C语言实现贪吃蛇游戏

最近整理下电脑,看到了自己在上个学期打的贪吃蛇游戏的c代码,觉得真的是略微有点冗长,但是实现起来应该也算是比较好理解,于是把自己的代码搬上来,网络上写贪吃蛇的c语言的文章很多,我这篇也仅是给大家作为一个参考而已. 我的代码是在Windows下运行的,因为需要用到windows.h这个库. 然后也做了一个简单的ai模式,这在没有障碍物的情况下前期还是蛮不错的,但是到了后期蛇变长了之后就会有bug了. 好了,直接上代码吧: 1)头文件和宏定义 #include<stdio.h> #include&

基于JavaScript实现贪吃蛇游戏

本文实例为大家分享了JavaScript实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下 1.结构 创建一个盒子box作为蛇的身体,当前盒子中只有一个子元素,代表此时蛇的长度为1. 在创建一个盒子food作为贪吃蛇的食物. <div id="box"> <div></div> </div> <div id="food"></div> 2.CSS 设置蛇和食物的样式,这里注意蛇和食物都是绝对定位

js贪吃蛇游戏实现思路和源码

本文实例为大家分享了js贪吃蛇游戏的相关代码,供大家参考,具体内容如下 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>贪吃蛇小游戏</title> <style> *{margin:0; padding:0;} header { display: block; margin: 0 auto;