把C语言的知识融合起来做一个练手的小游戏项目,将自己掌握到的数据结构、数组、函数、宏定义等知识综合利用,增加对语法的熟练程度。

操作系统: windows 10 x64

编译IDE : VS2015

  // 实现一个能在屏幕上自由移动的坦克.cpp : 定义控制台应用程序的入口点。

#include "stdafx.h"
#include <windows.h>
#include <conio.h> //方向宏定义
#define UP 0
#define DOWN 1
#define LEFT 2
#define RIGHT 3 //全局数组,画地图用
int g_map[40][40] = { 0 }; //坦克数据结构
typedef struct _TANKINFO
{
unsigned int nNosX; //坦克X坐标
unsigned int nNosY; //坦克Y坐标
unsigned int nLevel; //坦克等级
unsigned int nMaxHP; //坦克最大血值
unsigned int nCurlHP; //坦克当前血值
unsigned int nOldSpeed; //坦克原始速度
unsigned int nSpeed; //坦克当前速度
unsigned int nDirection; //坦克方向
unsigned int nGodirection; //坦克想要改变的方向
unsigned int nKill; //坦克杀敌数
unsigned int nDie; //坦克死亡数
unsigned int wColor; //坦克颜色
unsigned int nIndex; //坦克在数组中的数值
unsigned int nBulletType; //初始坦克的子弹类型
bool bSubSpeed; //是否被减速
char* szForm; //坦克组成的样子
char* szBuff; //状态
}TANKINFO,*PTANKINFO; TANKINFO tank; //坦克样式结构,上下左右方向
int tankstyle[4][3][3] =
{
//方向向上的坦克
{
{0,1,0},
{1,1,1},
{1,0,1} }, //方向向下的坦克
{
{1,0,1},
{1,1,1},
{0,1,0}
}, //方向向左的坦克
{
{0,1,1},
{1,1,0},
{0,1,1}
}, //方向向右的坦克
{
{1,1,0},
{0,1,1},
{1,1,0}
}
}; //血量绘画
char *m_blood[10] = {" ①","②","③","④","⑤","⑥","⑦","⑧","⑨","⑩" }; //按键接收
char KeyBoardMonitor()
{
char ch;
if (_kbhit())
{
ch = _getch();
}
else
{
return 0;
}
return ch;
} //画图函数
void writeChar(int High, int Wide, char * pszChar, WORD wArr)
{
//设置光标属性
CONSOLE_CURSOR_INFO cci;
cci.dwSize = 1; // 光标百分比厚度(1~100)
cci.bVisible = FALSE; //是否显示光标
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);
//设置坐标
COORD loc;
loc.X = Wide * 2; //X的值是Wide的2倍;
loc.Y = High;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), wArr);
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), loc);
printf(pszChar); //打印时需要注意有些特殊字符是占2个字节
} //清除坦克
void clsTank()
{
for (unsigned int y = tank.nNosY - 1,i=0; y <= tank.nNosY + 1; y++,i++)
{
for (unsigned int x = tank.nNosX-1,j=0;x<= tank.nNosX+1;x++,j++)
{
//用坦克的方向对照坦克模型数组,把坦克在界面上画出来
writeChar(y, x, " ",FOREGROUND_GREEN); }
}
} //绘画坦克
void DrawTank()
{
for (unsigned int y = tank.nNosY - 1, i = 0; y <= tank.nNosY + 1; y++, i++)
{
for (unsigned int x = tank.nNosX - 1, j = 0; x <= tank.nNosX + 1; x++, j++)
{
//用坦克的方向对照坦克模型数组,把坦克在界面上画出来
writeChar(y, x, tankstyle[tank.nDirection][i][j] == 1 ? "█" : " ", FOREGROUND_RED); }
}
} //坦克撞墙检测
bool allowMove()
{
if ((tank.nNosX <= 1)
||
(tank.nNosX >= 38) //画图边界判断
||
(tank.nNosY <= 2)
||
(tank.nNosY >= 38)
)
{
return false;
}
return true;
} //移动坦克
void moveTank()
{ clsTank(); //碰撞检查
if (allowMove() == false)
{
MessageBoxA(0, "撞墙啦!", "扑街", 0);
clsTank();
DrawTank();
} if (tank.nDirection != tank.nGodirection)
{
tank.nDirection = tank.nGodirection; //根据键盘获取到的键盘赋值到现有的方向
}
else
{ switch (tank.nGodirection)
{
case UP:
{
tank.nNosY--;
break;
} case DOWN:
{
tank.nNosY++;
break;
} case LEFT:
{
tank.nNosX--;
break;
} case RIGHT:
{
tank.nNosX++;
break;
}
}
} DrawTank(); } //画出地图
void DrawMap()
{
//遇到四周,那么写入1
for (int row = 0; row < 40; row++)
{
for (int col = 0; col < 40; col++)
{
if ((row == 0)
||
(row == 39)
||
(col == 0)
||
(col == 39)
)
{
g_map[row][col] = 1;
}
else
{
g_map[row][col] = 0; }
}
}
//输出所有的地图
for (int row = 0; row < 40; row++)
{
for (int col = 0; col < 40; col++)
{
if (g_map[row][col] == 1)
{
printf("■");
}
else
{
printf(" ");
}
}
printf("\n");
} } int main()
{
//给坦克赋值
tank.nNosX = 10;
tank.nNosY = 10; //画出地图
DrawMap();
//画出坦克
DrawTank(); char ch;
while(true)
{
ch = KeyBoardMonitor();
if (ch == 0)
{
continue;
}
if (ch == VK_ESCAPE)
{
break;
}
switch (ch)
{
case 'w':
{
tank.nGodirection = UP;
}
break;
case 's':
{
tank.nGodirection = DOWN;
}
break;
case 'a':
{
tank.nGodirection = LEFT;
}
break;
case 'd':
{
tank.nGodirection = RIGHT;
}
break;
}
moveTank();
} return 0;
}

运行效果

C语言练手游戏-控制台输出一个会移动的坦克的更多相关文章

  1. C/C++编程笔记:C语言写推箱子小游戏,大一学习C语言练手项目

    C语言,作为大多数人的第一门编程语言,重要性不言而喻,很多编程习惯,逻辑方式在此时就已经形成了.这个是我在大一学习 C语言 后写的推箱子小游戏,自己的逻辑能力得到了提升,在这里同大家分享这个推箱子小游 ...

  2. C语言练手自己编写学生成绩管理系统

    #include<stdio.h> #include<stdlib.h> /*定义学生结构体*/ struct Student { ]; ]; float Mark1; flo ...

  3. python3 练手实例6 做一个简单日历

    import calendar year = int(input('请输入要查询的年份:')) month = int (input('请输入要查询的月数:')) print (calendar.mo ...

  4. python3 练手实例5 做一个简单电子时钟

    import time,sys,os while(1): t = time.strftime('%Y-%m-%d\n%H:%M:%S',time.localtime(time.time())) pri ...

  5. 推荐:一个适合于Python新手的入门练手项目

    随着人工智能的兴起,国内掀起了一股Python学习热潮,入门级编程语言,大多选择Python,有经验的程序员,也开始学习Python,正所谓是人生苦短,我用Python 有个Python入门练手项目, ...

  6. WEBGL学习笔记(七):实践练手1-飞行类小游戏之游戏控制

    接上一节,游戏控制首先要解决的就是碰撞检测了 这里用到了学习笔记(三)射线检测的内容了 以鸟为射线原点,向前.上.下分别发射3个射线,射线的长度较短大概为10~30. 根据上一节场景的建设,我把y轴设 ...

  7. Cocos2d—X游戏开发之VS2010 控制台输出中文,模拟器中文乱码问题解决

    首先,先解决第一个问题,我们使用VS2010开发的时候,调试的时候,中文打印出来都是乱码,这个问题很纠结. 如下图: CCLOG("cclog: 测试使用标签的自动换行和个别字体大写&quo ...

  8. 练手项目:利用pygame库编写射击游戏

    本项目使用pygame模块编写了射击游戏,目的在于训练自己的Python基本功.了解中小型程序框架以及学习代码重构等.游戏具有一定的可玩性,感兴趣的可以试一下. 项目说明:出自<Python编程 ...

  9. Xamarin入门,开发一个简单的练手APP

    之前周末用Xamarin练手做了个简单APP,没有啥逻辑基本就是个界面架子,MVVM的简单使用,还有Binding,Command的简单使用,还有一个稍微复杂点两个界面交互处理(子页面新增后关闭,父页 ...

随机推荐

  1. 【dp专题】NOIP真题-DP专题练习

    这里学习一下DP的正确姿势. 也为了ZJOI2019去水一下做一些准备 题解就随便写写啦. 后续还是会有专题练习和综合练习的. P1005 矩阵取数游戏 给出$n \times m$矩阵每次在每一行取 ...

  2. 【转】用emWin进度条控件做个表盘控件,效果不错

    @2018-08-09 用emWin进度条控件做个表盘控件,效果不错

  3. 【转】cJSON 使用笔记

     缘      起       最近在stm32f103上做一个智能家居的项目,其中选择的实时操作系统是 rt_thread OS v1.2.2稳定版本,其中涉及到C和java(android)端数据 ...

  4. 洛谷 P2725 邮票 Stamps 解题报告

    P2725 邮票 Stamps 题目背景 给一组 N 枚邮票的面值集合(如,{1 分,3 分})和一个上限 K -- 表示信封上能够贴 K 张邮票.计算从 1 到 M 的最大连续可贴出的邮资. 题目描 ...

  5. I/O多路复用详解

    要想完全理解I/O多路复用,需先要了解I/O模型: 一.五种I/O模型 1.阻塞I/O模型 最流行的I/O模型是阻塞I/O模型,缺省情形下,所有套接口都是阻塞的.我们以数据报套接口为例来讲解此模型(我 ...

  6. SpringMvc的Url映射和传参案例

    Springmvc的基本使用,包括url映射.参数映射.页面跳转.ajax和文件上传 以前学习的时候写的代码案例,今天整理笔记的时候找到了,很久没有来园子了,发上来当个在线笔记用吧,免的时间长了又忘了 ...

  7. POJ 1459 Power Network / HIT 1228 Power Network / UVAlive 2760 Power Network / ZOJ 1734 Power Network / FZU 1161 (网络流,最大流)

    POJ 1459 Power Network / HIT 1228 Power Network / UVAlive 2760 Power Network / ZOJ 1734 Power Networ ...

  8. A1050. String Subtraction

    Given two strings S1 and S2, S = S1 - S2 is defined to be the remaining string after taking all the ...

  9. MATLAB:图像二值化、互补图(反运算)(im2bw,imcomplement函数)

    图像二值化.反运算过程涉及到im2bw,imcomplement函数,反运算可以这么理解:原本黑的区域变为白的区域,白的区域变为黑的区域. 实现过程如下: close all; %关闭当前所有图形窗口 ...

  10. springboot项目中jdk版本的问题

    几经周折,在idea中修改了多次jdk编译为1.8,可是一编译就恢复到默认的1.7版本. 在经过多次这个博客的修改内容: https://blog.csdn.net/li396864285/artic ...