中级光能
很多同学反应上次的板块出问题无法复制代码
所以,作者我从新发一遍,特地看了看我的板块准确无误
内容差不多,有一些些改进,希望能帮助到大家哈
废话不多说,正片开始!
很多童鞋想写属于自己游戏代码,毕竟是自己的,玩起来也更好玩(最重要是荣誉感)
那么下面作者推荐几个基**函数
//1、清屏函数
**("cls");
//需要头文件#include <windows.h>
//我知道有不闪烁清屏。。。
//先这个吧,这个简单一点
清屏函数,作者第一个小游戏猜数小游戏就用到了哈
这个函数还是比较实用的,对于文字游戏来说,不想接太长就用这个
或者是写剧情的时候会用这个,比如作者最近发布的模仿超级玛丽的小游戏里面的剧情就有(剧情太狗血了)
这个函数还有一个用法就是可以用于简单的动态游戏
比如作者发布的**小游戏(当然作者会完善,太复杂了都不好**了。。。),缺点就是太闪了(我知道有不闪清屏),闪瞎了我的眼。。。
//2、延时函数
Sleep(x)
//需要头文件#include <windows.h>
//x为数字,1代表1毫秒,1s=1000ms
这个的话基本都能用上
动态游戏用法:
while (true) {
//清屏或覆盖
//代码段
//输出段
Sleep(80);//数字根据自己需要改变
}
//如果不加这个函数,很可能运行窗口关不掉,而且内存超负荷,电脑会很卡
//这个也是控制流畅的关键
文字游戏或剧情延时输出:
void out(st**ng a) {
for (int i=0;i<a.size();i++) {
cout<<a[i];
Sleep(50);//这里是控制延时快慢,数字越大延时越长(单位毫秒)
}
}//我定义的名字叫out,名字随意
//用法呢很简单,看上面的模仿超级玛丽的截屏,里面out就是这个
//out("123456对对对")
//3、键盘处理器
#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)
//看着开头的#define就知道是何头文件放在一起的
//这个是个函数,判断键盘某键是否按下(移动键和回车等是有编号的,作者记得看过,但是目前找不到)
//如果判断字母键很简单的 如KEY_DOWN('W') w按下返回1,w没有按下返回0
这里作者记得KEY_DOWN函数回车什么无法显示的特殊字符是有编号的,但是目前没查到当时那个网站
这里上面的图片是作者**游戏里面的,这里的VK_ESCAPE是Esc键,其余的也是有编号的,如回车,数字键
这里还有一个用法就是文字游戏盒剧情里面会用
按下XX键继续(任意键又一个特殊的一下就能搞定)
while (!KEY_DOWN('Z'));
//这里是按下z继续
//如果需要不同可以改
//4、
void color(int a) {
SetConsoleTextAtt**bute(GetStdHandle(STD_OUTPUT_HANDLE),a);
}
//调整颜色的函数,效果和**("color")一样,但是快
这里是颜色表,找不到原来的表格了。。。
就从上一期截图发一下,不过就是些数字,问题也不打哈
color(7)是原始颜色(如果你调颜色了,那就不是了),用完可以恢复
//5、控制输出位置
void SetPos(COORD a) {
HANDLE out=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleC**sorPosition(out, a);
}
void SetPos(int i, int j) {
COORD pos={i, j};
SetPos(pos);
}
//这个函数控制输出位置,在屏幕上的坐标,用的时候如SetPos(0,0)(初始位置)
//注意一下是先y后x(先列后行)
//这个呢有覆盖特**(两次在同一位置输出,后面输出的会覆盖掉前面的),也可以通过这个实现动态(下面有例子)
例1:构造游戏界面
打游戏的都知道,游戏开始前一般都会有一个高大上的界面(当然在黑框框里面式做不出来的,要做的话到工程里面)
那么基**的界面
作者做了两个效果:
效果1
效果2
首先看一下低配版本(闪瞎你的眼睛)
用**("cls")实现,会很闪(例为效果1)
while (true) {
cout<<"╭══════╮\n";//这个是边界,自己改符号就好
cout<<"║";//边界字符,效果图放出来就晓得了
if (i==1) {
color(14);//效果1例子,是变色版
if (KEY_DOWN('Z')) in_con();//这里是按下z选中,如果是其他的可以改,判断后面放你需要的内容,以下同理
}cout<<" 控制介绍 ";color(7);//这里是效果1,所以恢复
cout<<"║\n";//边界图标
cout<<"║";
if (i==2) {
color(14);
if (KEY_DOWN('Z')) in_cont();
}cout<<" 内容介绍 ";color(7);
cout<<"║\n║";
if (i==3) {
color(14);
if (KEY_DOWN('Z')) ret**n ;
}cout<<" 跳出介绍 ";color(7);
cout<<"║\n";
cout<<"╰══════╯\n";
if (KEY_DOWN('W')&&i-1!=0) i--;//这里是上调w,如果按键变化可以改,其他一般不要改
if (KEY_DOWN('S')&&i+1<=3) i++;//这里i+1<=3的数字3可以根据数目改变,下调s也可以改变
Sleep(100);//延时函数,感觉不顺的可以改(这个版本小了闪瞎你)
}
不闪的版本,通过SetPos的覆盖特**实现(效果2)
while (true) {
SetPos(2,5);cout<<" ";//利用覆盖特**消除箭头
SetPos(2,6);cout<<" ";
SetPos(2,7);cout<<" ";
if (i==1) {
if (KEY_DOWN('Z')) ret**n ;//跟上一个例子基本相同,按下z选中,后面加**需要的东西,以下同理
SetPos(2,5);color(14);cout<<">";color(7);//在合适的位置加上>(这里颜色设置的是**)
}SetPos(3,5); cout<<"开始游戏";//在合适的位置输出字,第2个数字相同(错位了,第二个就不同了)
if (i==2) {
//color(14);
if (KEY_DOWN('Z')) in_con();//不动
SetPos(2,6);color(14);cout<<">";color(7);//删除
}SetPos(3,6);//删除
cout<<"查看介绍";//这里加上color(7)//如果想要通过这种实现效果1,根据if 2里面的注释写
if (i==3) {
if (KEY_DOWN('Z')) update();
SetPos(2,7);color(14);cout<<">";color(7);
}SetPos(3,7); cout<<"更新内容";
if (KEY_DOWN('W')&&i-1>=1) i--;
if (KEY_DOWN('S')&&i+1<=3) i++;//这里和后面一样的,就不多讲了
Sleep(100);
}
例2:SetPos移动示例
#include <bits/stdc++.h>
#include <windows.h>
#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME)&0x8000)?1:0)//判断按键是否按下(前面有)
using name** std;
struct play {//定义一个结构体,看上去好点(实际上没有也行)
int x,y,lx,ly;
}player;//玩家
void SetPos(COORD a)//SetPos
{
HANDLE out=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleC**sorPosition(out, a);
}
void SetPos(int i, int j)
{
COORD pos={i, j};
SetPos(pos);
}
void cont**l() {//控制函数,这里是wsad**作方法,没有限制最大,可以满屏跑
player.ly=player.y;player.lx=player.x;//记录上次的位置,以便覆盖痕迹
if (KEY_DOWN('W')&&player.x-1>=1) player.x--;
if (KEY_DOWN('S')) player.x++;
if (KEY_DOWN('A')&&player.y-1>=1) player.y--;
if (KEY_DOWN('D')) player.y++;
}
int main () {
player.x=9,player.y=9;//初始位置,随便哈
while (true) {
SetPos(player.ly,player.lx);//先覆盖上次的痕迹,为什么?有可能没有动,上次这次在一起,如果先输出这次那不没有东西了?
cout<<" ";//覆盖,看是几个空格的长度,有的可能有两行
SetPos(player.y,player.x);//输出这次玩家的位置
cout<<"1";//这里方便,用1代替,其他字符也是可以的
cont**l();//控制函数
Sleep(50);//延时函数,数字可以改,自己看着舒服就好
}
ret**n 0;
}
先到这里吧,后面作者学会了新的东西再更新
王梓澳在2021-08-04 14:45:30追加了内容
作者发布的时候出现了一点问题,502了,吓**作者了,写了那么久。。。
大部分还是在的,中间一点小问题,纠正一下
1、
几个基本函数
2、
图片为
3、
**小游戏 都不好改了
4、
图片:
5、
**游戏
6、
颜色表
7、
效果1
效果2
**
覆盖特**
王梓澳在2021-08-04 14:48:19追加了内容
图片发不出来。。。
我人都傻了
https://wenda.codingtang.com/questions/13556/
这里面有图片什么的
只是板块不对
大家看一下吧,图片出不来,而且一些字变**了
王梓澳在2021-08-04 14:50:31追加了内容
**图片的话还有是截取代码的
一个是超级玛丽的story函数
还有一个是**游戏的465行的if函数
王梓澳在2021-08-05 08:23:37追加了内容
图1代码
void story() {
color(7);
cout<<"剧情篇\n";
cout<<"按下Z继续\n";
cout<<"按下Q跳过";
while (true) {
if (KEY_DOWN('Z')) break;
if (KEY_DOWN('Q')) ret**n ;
}**("cls");
out("一天你睡觉时,突然梦见你一人站在一个空无一人的地方...\n");
cout<<"按下Z继续\n";
cout<<"按下Q跳过";
while (true) {
if (KEY_DOWN('Z')) break;
if (KEY_DOWN('Q')) ret**n ;
}**("cls");
out("一个声音对你说:你的灵魂已破碎不堪\n你向四周看去,没有任何人\n");
out("接着你醒来了,你去请求神灵,发现梦里的话是真实的...\n");
cout<<"按下Z继续\n";
cout<<"按下Q跳过";
while (true) {
if (KEY_DOWN('Z')) break;
if (KEY_DOWN('Q')) ret**n ;
}**("cls");
out("神灵问:你想要一个完整的灵魂吗?\n你毫不犹豫的回答道:想!\n");
out("“我已将你的灵魂碎片散落在一个地方,你收集到所有碎片才能获得完整的灵魂,当然,这也会有危险,你愿意吗?”\n“我愿意!”");
out("突然你被传送到一个二维世界的地图中...\n");
cout<<"按下Z继续\n";
while (!KEY_DOWN('Z'));
}
图2代码:
if (KEY_DOWN(VK_ESCAPE))
Opening();
颜色表(作者找到了)
/*
<span style="white-**:pre"> </span>字
1 深蓝色
2 深绿色
3 深青色
4 深红色
5 深粉色
6 **
7 深白色
8 灰色
9 浅蓝色
10 浅绿色
11 浅青色
12 浅红色
13 浅粉色
14 浅**
15 浅白色
背景
1~15 黑色
16~31 深蓝色
32~47 深绿色
48~63 深青色
**~79 深红色
80~95 深粉色
**~111 深**
112~127 深白色
128~143 灰色
144~159 浅蓝色
160~175 浅绿色
176~191 浅青色
192~207 浅红色
208~223 浅粉色
224~239 浅**
240~255 浅白色
*/
由于是别人的文章,作者贴上原文网址:https://blog.**dn.net/**rlasting_20141622/article/details/52222006
王梓澳在2021-08-05 08:25:11追加了内容
博客的网址好像打不开。。。
网址都被贴上**了,这个**是什么啊。。。
王梓澳在2021-08-05 08:27:02追加了内容
王梓澳在2021-08-05 11:23:52追加了内容
作 者 在 翻 问答的时候,发现了有人给过KEY_DOWN的表格了
转载一下 ,@
/*
VK_**UTTON 鼠标左键 0x01
VK_RBUTTON 鼠标右键 0x02
VK_CANCEL Ctrl + Break 0x03
VK_MBUTTON 鼠标中键 0x04
VK_BACK Back** 键 0x08
VK_TAB Tab 键 0x09
VK_RET**N 回车键 0x0D
VK_SHIFT Shift 键 0x10
VK_CONTROL Ctrl 键 0x11
VK_MENU Alt 键 0x12
VK_PAUSE P**se 键 0x13
VK_CAPITAL Caps Lock 键 0x14
VK_ESCAPE Esc 键 0x1B
VK_SPACE 空格键 0x20
VK_PRIOR Page Up 键 0x21
VK_NEXT Page Down 键 0x22
VK_END End 键 0x23
VK_HOME Home 键 0x24
VK_LEFT 左箭头键 0x25
VK_UP 上箭头键 0x26
VK_RIGHT 右箭头键 0x27
VK_DOWN 下箭头键 0x28
VK_SNAPSHOT P**nt Screen 键 0x2C
VK_Insert Insert 键 0x2D
VK_Delete Delete 键 0x2E
'0' – '9' 数字 0 - 9 0x30 - 0x39
'A' – 'Z' 字母 A - Z 0x41 - 0x5A
VK_LWIN 左WinKey(104键盘才有) 0x5B
VK_RWIN 右WinKey(104键盘才有) 0x5C
VK_APPS AppsKey(104键盘才有) 0x5D
VK_NUMPAD0 小键盘 0 键 0x60
VK_NUMPAD1 小键盘 1 键 0x61
VK_NUMPAD2 小键盘 2 键 0x62
VK_NUMPAD3 小键盘 3 键 0x63
VK_NUMPAD4 小键盘 4 键 0x**
VK_NUMPAD5 小键盘 5 键 0x65
VK_NUMPAD6 小键盘 6 键 0x66
VK_NUMPAD7 小键盘 7 键 0x67
VK_NUMPAD8 小键盘 8 键 0x68
VK_NUMPAD9 小键盘 9 键 0x69
VK_F1 - VK_F24 功能键F1 – F24 0x70 - 0x87
VK_NUMLOCK Num Lock 键 0x90
VK_SCROLL Sc**ll Lock 键 0x91
*/
王梓澳在2021-08-05 17:23:28追加了内容
界面制作第1个s y s t e m 版本少清屏函数
在while(true)后面加一个s y s t e m ("c l s");(被迫打空格)
游戏界面刷新不了