0.C语言写回合制
梦开始的地方是我学完第一门编程语言之后心血来潮想做一款类似于洛克王国的基于宠物回合制战斗的游戏. 但残酷的现实很快就泼了我一盆冷水,怎么才能让电脑显示我的小精灵呢?等等,在此之前似乎还有许多问题无法解决吧,游戏登录怎么解决?游戏账号怎么解决?创建角色怎么解决?玩家对战怎么解决?..(我只会个printf和scanf/(ㄒoㄒ)/~~) ok,潜意识告诉我先不用管那些我们大可由简到繁一点一点来,洛克王国的玩法核心是宠物的回合制对战,基于C语言的逻辑功能和输入输出至少可以文字实现这种对战逻辑.我算是个资深的回合制游戏玩家,回合制机制我硬熟于心.
**用c语言写简单的回合制游戏**
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
void writeFile(char* fileStr);
int founction (int t);
void boss (int *p);
int back;
int main (){
system("time /t") ;
system("color 3F");
int a[3],pick,hp0=6,f0=2,d0=0,instruct,count=0;
printf ("请选择你想要的精灵\n");
printf ("1-火神,2-喵喵,3-水灵\n");
printf ("请输出它的序号\n");
scanf ("%d",&pick);
switch (pick){
case 1 :a[0]=8;a[1]=3;a[2]=0;break;
case 2 :a[0]=12;a[1]=2;a[2]=0;break;
case 3 :a[0]=8;a[1]=2;a[2]=1;break;
}
printf ("你已经选择好了你的精灵!\n");
printf ("糟糕!你遇到了危机!一只巡逻的小怪发现了你!快指挥你的精灵击败它!\n");
while (hp0>0&&a[0]>0){
printf("轮到你的精灵出击!\n");
printf("请选择是让你的精灵攻击(1)还是防守(2)\n");
scanf ("%d",&instruct);
if (instruct==1){
hp0=hp0-(a[1]-d0);
printf ("你的精灵发起了进攻,小怪hp变为%d.\n",hp0);
if (hp0<=0) break;
}
else {
count=founction ( count );
if (count%3==0){
a[1]=a[1]+4;
printf ("太好了!你的精灵hp增加至%d!\n",a[0]);}
else {
printf ("真可惜!你的精灵hp增加失败!\n");}
}
printf("轮到小怪出击!\n");
a[0]=a[0]-(f0-a[2]);
printf("小怪对你的精灵发起了攻击!你的精灵hp变为%d.\n",a[0]);
}
if (hp0<=0){
printf("你的精灵取得了胜利!\n");
system("CLS");
boss (a);
}
else
{
printf("you lose! 你的精灵被打败了!\n");
back=0;
}
system("PAUSE");
writeFile("D:\\战斗记录.txt");
system("PAUSE");
return 0;
return 0;
}
int founction (int t){
srand (time(NULL));
t=rand()%11;
return t;
}
void boss (int *p){
int hp1=20,f1=3,d1=2,count,instruct;
printf ("\n\n它来了!你遇到了最终危机!领主发现了你!\n");
printf ("在与领主战斗的时候,幸运女神会帮护你,你可能得到随机buff\n");
while (p[0]>0&&hp1>0){
count=founction ( 1 );
if (count%3==0){
if (count%2==0) {
p[0]=p[0]+5;
printf ("受到了女神的眷顾!你的精灵hp增加至%d!\n",p[0]);}
else{
p[1]=p[1]+1;
printf ("受到了女神的眷顾!你的精灵攻击力增加至%d!\n",p[1]);}
}
printf("轮到你的精灵出击!\n");
printf("请选择是让你的精灵攻击(1)还是防守(2)\n");
scanf ("%d",&instruct);
if (instruct==1){
hp1=hp1-(p[1]-d1);
printf ("你的精灵发起了进攻,领主hp变为%d.\n",hp1);
if (hp1<=0) break;
}
else {
count=founction ( count );
if (count%3==0){
p[0]=p[0]+4;
printf ("太好了,施法成功!你的精灵hp增加至%d!\n",p[0]);}
else {
p[0]=p[0]+2;
printf ("真可惜,施法失败!你的精灵hp仅增加至%d!\n",p[0]);}
}
printf("轮到领主出击!\n");
p[0]=p[0]-(f1-p[2]);
printf("领主对你的精灵发起了攻击!你的精灵hp变为%d.\n",p[0]);
}
if (hp1<=0)
{
printf("congratulations!你的精灵取得了胜利!你已成功通关!\n");
back=1;
}
else
{
printf("you lose! 你的精灵被打败了!\n");
back=0;
}
system("PAUSE");
}
void writeFile(char* fileStr)
{
FILE *fp;
fp = fopen(fileStr,"a+");
if(fp == NULL)
{
printf ("something was wrong !");
return ;
}
if(back==1)
{
fputs ("victory!",fp);
fputs ("\n",fp);
fclose(fp);
printf ("*********战绩写入成功***********");
}
else
{
fputs ("defeat!",fp);
fputs ("\n",fp);
fclose(fp);
printf ("*********战绩写入成功***********");
}
}
这是我当时保存的版本,使用的编译器是DevC++,原本没有bug不过当我写这篇回顾的时候我在vs2022运行了一遍发现出了bug,scanf和writeFile()等函数存在不安全性需要更改,不得不说编程这方面永远在推陈出新. 一下是vs2022可运行的代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
void writeFile(char* fileStr);
int founction(int t);
void boss(int* p);
int back;
int main() {
system("time /t");
system("color 3F");
int a[3], pick, hp0 = 6, f0 = 2, d0 = 0, instruct, count = 0;
printf("请选择你想要的精灵\n");
printf("1-火神,2-喵喵,3-水灵\n");
printf("请输出它的序号\n");
scanf_s("%d", &pick);
switch (pick) {
case 1:a[0] = 8; a[1] = 3; a[2] = 0; break;
case 2:a[0] = 12; a[1] = 2; a[2] = 0; break;
case 3:a[0] = 8; a[1] = 2; a[2] = 1; break;
}
printf("你已经选择好了你的精灵!\n");
printf("糟糕!你遇到了危机!一只巡逻的小怪发现了你!快指挥你的精灵击败它!\n");
while (hp0 > 0 && a[0] > 0) {
printf("轮到你的精灵出击!\n");
printf("请选择是让你的精灵攻击(1)还是防守(2)\n");
scanf_s("%d", &instruct);
if (instruct == 1) {
hp0 = hp0 - (a[1] - d0);
printf("你的精灵发起了进攻,小怪hp变为%d.\n", hp0);
if (hp0 <= 0) break;
}
else {
count = founction(count);
if (count % 3 == 0) {
a[1] = a[1] + 4;
printf("太好了!你的精灵hp增加至%d!\n", a[0]);
}
else {
printf("真可惜!你的精灵hp增加失败!\n");
}
}
printf("轮到小怪出击!\n");
a[0] = a[0] - (f0 - a[2]);
printf("小怪对你的精灵发起了攻击!你的精灵hp变为%d.\n", a[0]);
}
if (hp0 <= 0) {
printf("你的精灵取得了胜利!\n");
system("CLS");
boss(a);
}
else
{
printf("you lose! 你的精灵被打败了!\n");
back = 0;
}
system("PAUSE");
writeFile((char *)"D:\\战斗记录.txt");
system("PAUSE");
return 0;
return 0;
}
int founction(int t) {
srand(time(NULL));
t = rand() % 11;
return t;
}
void boss(int* p) {
int hp1 = 20, f1 = 3, d1 = 2, count, instruct;
printf("\n\n它来了!你遇到了最终危机!领主发现了你!\n");
printf("在与领主战斗的时候,幸运女神会帮护你,你可能得到随机buff\n");
while (p[0] > 0 && hp1 > 0) {
count = founction(1);
if (count % 3 == 0) {
if (count % 2 == 0) {
p[0] = p[0] + 5;
printf("受到了女神的眷顾!你的精灵hp增加至%d!\n", p[0]);
}
else {
p[1] = p[1] + 1;
printf("受到了女神的眷顾!你的精灵攻击力增加至%d!\n", p[1]);
}
}
printf("轮到你的精灵出击!\n");
printf("请选择是让你的精灵攻击(1)还是防守(2)\n");
scanf_s("%d", &instruct);
if (instruct == 1) {
hp1 = hp1 - (p[1] - d1);
printf("你的精灵发起了进攻,领主hp变为%d.\n", hp1);
if (hp1 <= 0) break;
}
else {
count = founction(count);
if (count % 3 == 0) {
p[0] = p[0] + 4;
printf("太好了,施法成功!你的精灵hp增加至%d!\n", p[0]);
}
else {
p[0] = p[0] + 2;
printf("真可惜,施法失败!你的精灵hp仅增加至%d!\n", p[0]);
}
}
printf("轮到领主出击!\n");
p[0] = p[0] - (f1 - p[2]);
printf("领主对你的精灵发起了攻击!你的精灵hp变为%d.\n", p[0]);
}
if (hp1 <= 0)
{
printf("congratulations!你的精灵取得了胜利!你已成功通关!\n");
back = 1;
}
else
{
printf("you lose! 你的精灵被打败了!\n");
back = 0;
}
system("PAUSE");
}
void writeFile(char* fileStr)
{
FILE* fp;
fopen_s(&fp,(char*)fileStr, "a+");
if (fp == NULL)
{
printf("something was wrong !");
return;
}
if (back == 1)
{
fputs("victory!", fp);
fputs("\n", fp);
fclose(fp);
printf("*********战绩写入成功***********");
}
else
{
fputs("defeat!", fp);
fputs("\n", fp);
fclose(fp);
printf("*********战绩写入成功***********");
}
}
这段代码确实实现了回合制对战逻辑(同时附加了文件读写),我当时倍感欣慰,又觉得自己可以了.😂之后我又写了一些纯文字的游戏,比如用到了rand函数的猜数字小游戏,这里就不细说了. 值得一提的是回想到代码中文件读写函数在我必修课本中并没有,是我当时辛辛苦苦百度捞针然后反复研究才get到的(在网上搜到的解决方案大多是很久以前的,这对于有快速更新属性的问题很不友好!),有类似经历的同志大概能体会到其中的不太简单.当时的我并没有意识到,以后这种百度捞针将时常发生! 段末附上运行截图:
1.Easy X图形库
在此之后我迫切的想要让自己的游戏呈现画面,我了解到想让编程语言有呈现画面的功能必须为其添加图形库,C和C++语言是不自带图形库的,当时我碰巧正在必修Java,Java自带图形库,接下来用Java吧,自带图形库用起来或许要方便许多,不过我十分舍不得C和C++,我想继续发展我的C和C++,集中一点的性格让我留了下来,最终我找到了C的第三方图形库—Easy X,其实我找到了很多第三方图形库,不过我最终选择了Easy X. 图形库让我兴奋不已,我仔细阅读Easy X的官方API文档,最后在上文回合制游戏代码的基础上首次实现了"编程语言实现图形",我将其做成安装包(这个程序实现安装包当时花了我不少功夫)发给我的同学试玩,后来我又为其追加了bgm和image,目的是让我的游戏有声有色,不过有一位前辈在尝试了我的作品之后批评道:“你的bgm似乎有点喧宾夺主了”,比起同学对我至少出于礼貌的夸赞,这句批评对我更加重要,不是bgm太好了,而是画面太low了,仅仅通过图形库勾勒的图画完全达不到基本的游戏画面标准.而且我意识到,完全凭借vs编译器写出来的游戏极难复杂化,比如写五子棋容易可是写象棋就极难.若想提高游戏质量,我必须另寻良方! 值得一提的是,基于Easy X我接连创作出"猜数字",“无敌井字棋”,“五子棋”,但这些游戏数据我现在已经找不到了.我不刻意保存它们的理由很让当时的自己信服,具体是什么现在的我不想提,我只想说:"对于自己努力得到的成果,即使将来已然过时,还是备份起来好,对自己而言它永远是无价之物.我推荐有使用C图形库需求的读者们不妨尝试Easy X,这是它的官网链接:https://easyx.cn/
2.Cocos2d-x
后来我了解到编写游戏是要用到专业的游戏编译平台的.我找到的第一款平台是Cocos2d-x,Cocos2d-x令我很不满意,在安装它的时候我就遇到很多不好解决的版本问题(它的安装流程并不是普通的安装包形式),但我尽力克服了安装困难,并坚持学习了一段时间,我很是惊讶于专业游戏设计平台功能的强大,我以前感觉PS够强了,这居然比PS更diao,虽然他们用处不同不该相提并论.我惊艳于游戏编译平台的强大,但Cocos2d-x为我带来的不少问题都极难解决,我忙碌其中,却毫无生产,我不得不放弃它.并最终寻觅到我使用至今的另一款游戏开发平台—Unity. 我与Cocos2d-x也有一种时运不济的感觉,当时我的专业课是四年里最多的时候,相比以往我没有太多时间用于游戏创作.不过使用Cocos2d-x令我大开眼界,同时也是我十分重要的一个转折点,由高级语言编译器到真正游戏开发平台的转变.这次转变表明了我必须学会游戏设计的决心,也为后来我能够设计出真正像样的游戏奠定基础,另外从其中学到的平台操作基础也令我后来受益匪浅.我还是由衷感谢Cocos2d-x.
3.Unity
全平台(包括PC/主机/移动设备)所有游戏中有超过一半都是使用Unity创作的. Unity让我很舒心,有种落魄小鸟终于找到归宿的感觉,它不仅拥有超强的且不限于游戏创作的功能,还拥有相当成熟的学习平台,大量高质量而又免费的学习资源和创作素材足以满足一位无论多么饥渴的初学者.这里我列举一些当时我用于入门的一些官方免费资源(它们尽在官网Asset Store之中):
-
Creator Kit: RPG -
-
2D Game Kit -
-
3D Game Kit -
7.LEGO Microgame
Unity的脚本编写部分是使用的C#,C#并不在我专业课程之内,于是我上网自学了C#,得益于C#与C++十分相似,学习过程十分顺利. 现在回想从图形库到游戏平台的转变花费了我半年多的时间,我终于再次开始创作游戏了. 这些问题与刚开始的我而言无处下手,于现在的我而言已然有迹可循! 我首先写出了象棋.
我曾谈过一段恋爱为我的对象专门写了一款生日礼物.
之后发现Unity不仅可以写游戏,他还可以胜任我的一门有关数据库的课程设计,于是我便用Unity半个晚上取得了其他同学花费一星期才取得的成果—一款访问数据库的图书管理系统.
我付出时间最长的是一款名为"黄金矿工"的游戏,这是我小时候在4399上最喜欢的一款游戏,我决定将其复刻出来并加以改进."黄金矿工"虽然游戏规则与操作都很简单,但我却在用脚本实现它们的时候曾多次通宵达旦,现在回想起来我真是可怜我的电脑呀.
之后我花费一定时间尝试进入网络联机领域,收获不多,因为网络联机的教学资源相对太少了.
如今我有更重要的事情去做,闲暇时光已离我而去,我的大学游戏设计计划到此为止,我为热爱付出过.我相信这段独特的历程尤其是编写逻辑严格而又联系紧密的游戏脚本的头脑训练对我的将来必有帮助.
|