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

a04a0ff9e069ce9e9f6d6d1ee2cf6727.png

序言

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

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

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

e675e0e8a02bc4a71a3e2eba1ee456b2.png

编译环境:

vs 2019+easyx2019

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

游戏规则:

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

开发思路:

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

【源码获取】:

点击此处,获取文章源码​jq.qq.com

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

话不多说,源码展示:

#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;
}

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

另外本程序还需要一部分头文件,想要领取可以点击下面链接进群获取:

点击此处,获取文章源码​jq.qq.com

78c3ef4c08991e920055b71b5be401e7.png

如果你对程序员这份工作满怀热爱,如果你乐意走在技术的最前沿,不妨加入

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值