【C语言/C++】期末课设——点灯游戏,轻松搞定期末课设,零基础也能写!

序言

一提到开发游戏,很多人都会觉得要很高深的技术,有一种望尘莫及的感觉。其实要编一款小游戏也没有想象的那么难,下面跟着小编一起来看看C语言是如何一步步制作游戏的。

本文的代码下载地址在文章末尾,有需要的同学自取。

《点灯游戏》是一款益智小游戏,游戏的规则十分简单,是时下一款简单易上手的数字小游戏,但又十分虐心。

编译环境:

vs 2019+easyx2019

刚开始学习C语言或者没接触过easyx的伙伴,拿到代码之后肯定有很多的错误,这就是所谓的给了源码也不能运行,所以配置环境和查看报错也是作为编程学习者,必须要掌握的技能。

游戏规则:

只需要点击一个格子,然后以点击的格子为十字中心,周围的格子的状态会发生改变(只有两种状态,亮,灭),你需要把全部的格子点亮,就能赢得游戏的胜利。

开发思路:

第一步,创建一个漂亮的开始界面;
第二步,画出游戏界面;
第三步,定义地图数组,与界面建立联系;
第四步,获取鼠标点击信息,对格子进行处理;
第五步,游戏的胜负判断。

【源码获取】:

源码在C语言/C++交流②群:967051845!资料共享在群文件里面,有需要的可以自行添加获取~

如果对代码有任何建议,都可以添加小编的学习交流群,欢迎大家来讨论~

话不多说,源码展示:


#include<stdio.h>
#include<graphics.h>
#include<conio.h>
#include<mmsystem.h>
#pragma comment(lib,"winmm.lib")
#define WIN_WIDTH 640
#define WIN_HEIGHT 480
#define GRID_NUM 4  //每一行每一列的格子数
#define GRID_WIDTH 30//格子宽度
struct Grid //格子
{
  int top; //上面一条线的x坐标
  int down;//下面一条线的x坐标
  int left;//左边一条线的y坐标
  int right;//右边边一条线的y坐标
  int foot; //步数
  int map[GRID_NUM][GRID_NUM];
  POINT mouse; //鼠标点击的格子的下标
}grid;
MOUSEMSG msg;
IMAGE img;
//开始界面
void Welcome()
{
//播放音乐
  mciSendString("open ./slhxq.mp3 alias a", 0, 0, 0);
  mciSendString("play a repeat", 0, 0, 0);
  //显示背景图片
  loadimage(&img, "./bk.jpg",640,480);
  putimage(0, 0, &img);
  setbkmode(TRANSPARENT);
  settextcolor(GREEN);
  settextstyle(64, 0, "黑体");
  outtextxy(70, 50, "涂格子小游戏");
  settextcolor(RED);
  settextstyle(16, 0, "宋体");
  outtextxy(100, 200, "每点一个格子,上下左右的格子也会做出于现状相反的动作");
  outtextxy(100, 240, "总共11关,左键填色,右键重来,中键退出");
  outtextxy(400, 320, "作者:顽石老师");
  settextstyle(16, 0, "黑体");
  outtextxy(400, 340, "^V^");
  
  while (!_kbhit())
  {
    settextcolor(RGB(0, rand()%256, 0));
    outtextxy(280, 400, "按任意键继续!");
    Sleep(200);
  }
  _getch();//按任意键继续
}
void GameInit()
{
  // 游戏区域大小,屏幕中心位置x,y,减去总格子宽度的一半
  grid.left = WIN_WIDTH/2 - GRID_WIDTH * GRID_NUM / 2;
  grid.right = WIN_WIDTH /2 + GRID_WIDTH * GRID_NUM / 2;
  grid.top = WIN_HEIGHT / 2 - GRID_WIDTH * GRID_NUM / 2;
  grid.down = WIN_HEIGHT / 2 + GRID_WIDTH * GRID_NUM / 2;
  grid.foot = 0;
  for (int i = 0; i < GRID_NUM; i++)
  {
    for (int k = 0; k < GRID_NUM; k++)
    {
      grid.map[i][k] = 1;
    }
  }
}
void GameDraw()
{
  cleardevice();
  putimage(0, 0, &img);
  // 绘制格子
  setlinecolor(RGB(0, 200, 0));
  //循环画格子
  for (int x = grid.left; x <= grid.right; x += GRID_WIDTH)
  {
    line(x, grid.top, x, grid.down);
  }
  for (int y = grid.top; y <= grid.down; y += GRID_WIDTH)
  {
    line(grid.left, y, grid.right, y);
  }
  // 外边框
  for (int x = 20; x > 10; x--)
  {
    line(grid.left - x, grid.top - x, grid.right + x, grid.top - x); //画上面的线
    line(grid.left - x, grid.down + x, grid.right + x, grid.down + x);//画下面的线
    line(grid.left - x, grid.top - x, grid.left - x, grid.down + x);//画左面的线
    line(grid.right + x, grid.top - x, grid.right + x, grid.down + x);//画右面的线
  }
  //绘制格子颜色
  int x, y;
  for (int i = 0; i < GRID_NUM; i++)
  {
    for (int k = 0; k < GRID_NUM; k++)
    {
      x = i * GRID_WIDTH + grid.left;
      y = k * GRID_WIDTH + grid.top;
      if (grid.map[i][k] == 1)
      {
        setfillcolor(BLACK);
        solidrectangle(x + 1, y + 1, x + GRID_WIDTH - 1, y + GRID_WIDTH - 1);//加1减一是为了让每个格子的边框显示出来
      }
      else if (grid.map[i][k] == -1)
      {
        setfillcolor(RGB(0, 150, 0));
        solidrectangle(x + 1, y + 1, x + GRID_WIDTH - 1, y + GRID_WIDTH - 1);//加1减一是为了让每个格子的边框显示出来
      }
    }
  }
  char foot[20] = "";
  sprintf(foot, "步数:%d", grid.foot);
  settextcolor(WHITE);
  outtextxy(10, 10, foot);
}
void GameControl()
{
  if (MouseHit())
  {
    msg = GetMouseMsg();
    if (msg.uMsg == WM_LBUTTONDOWN)
    {  //鼠标点击位置在游戏区域时
      if (msg.x > grid.left && msg.x<grid.right && msg.y>grid.top && msg.y < grid.down)
      {      
        grid.mouse.x = (msg.x - grid.left) / GRID_WIDTH;
        grid.mouse.y = (msg.y - grid.top) / GRID_WIDTH;
        grid.map[grid.mouse.x][grid.mouse.y] = -grid.map[grid.mouse.x][grid.mouse.y];//点击的变色
        if (grid.mouse.x >= 0 && grid.mouse.x < GRID_NUM - 1)grid.map[grid.mouse.x+1][grid.mouse.y] = -grid.map[grid.mouse.x+1][grid.mouse.y];//右面的变色
        if (grid.mouse.x > 0 && grid.mouse.x <= GRID_NUM - 1)grid.map[grid.mouse.x-1][grid.mouse.y] = -grid.map[grid.mouse.x-1][grid.mouse.y];//左面变色
        if (grid.mouse.y >= 0 && grid.mouse.y < GRID_NUM - 1)grid.map[grid.mouse.x][grid.mouse.y+1] = -grid.map[grid.mouse.x][grid.mouse.y+1];//下边变色
        if (grid.mouse.y > 0 && grid.mouse.y <= GRID_NUM - 1)grid.map[grid.mouse.x][grid.mouse.y-1] = -grid.map[grid.mouse.x][grid.mouse.y-1];//上边变色
        grid.foot++;
      }
    }
  }

}
int GameJudge()
{
  for (int i = 0; i < GRID_NUM; i++)
  {
    for (int k = 0; k < GRID_NUM; k++)
    {
      if (grid.map[i][k] == 1)
      {
        return 0;
      }
    }
  }
  return 1;
}
int main()
{
  initgraph(640, 480);
  Welcome();
  GameInit();
  BeginBatchDraw();
  while (1)
  {      
    
    GameControl();
    GameDraw();
    FlushBatchDraw();
    if (GameJudge())
    {
      HWND hwd = GetHWnd();
      MessageBox(hwd, "你赢了~", "提示:", MB_OK);
      exit(666);
    }
  }
  return 0;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小编。

另外本程序还需要一部分头文件,想要领取可以添加小编的C语言/C++交流②群:967051845,源码在群文件里

福利来咯~

学习过程很“痛苦”,但是结果大家一定会对自己很满意!

如果觉得学习资料难找的话,可以添加小编的C语言/C++交流群:967051845! 学习资料已经共享在群里了,期待你的加入~

image

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,386评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,142评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,704评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,702评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,716评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,573评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,314评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,230评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,680评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,873评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,991评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,706评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,329评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,910评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,038评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,158评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,941评论 2 355