◣入门级源码◥ printf 也能写游戏!

到百度贴吧首页
新闻   网页   贴吧   知道   MP3   图片   视频   百科
    吧内搜索 | 帮助

转贴次数:2

◣入门级源码◥ printf 也能写游戏!

1楼

/*很多人都觉得编游戏很高深...其实不然...以下是我初学C时写个一个九格游戏
涉及的知识只有函数,各种流程控制和从老师那里问来的几个非常有用的函数.
当然,当时我连一点图形的知识都没有.
我只想说明一个问题:不要觉得你C语言学得不够多,只是,你没有充分利用你所学到的*/
/*
以下代码在 TC2 + winXP 通过.
作者:文曦畅
QQ:375020128
*/

2楼

#include <stdio.h>
#include <stdlib.h>    /*使用其中的int random(int a):
产生一个在0到a-1之间的整数 
和 randomize():复位随机发生器*/
#include <conio.h>    /*使用其中的gotoxy(int x,int y):
把光标移动到屏幕的x(1~80),y(1~25/50)处*/
/*和clrscr():清屏*/
int num[]={1,2,3,4,5,6,7,8,0};    /*方块的数字*/

main(){
    char key=0;    /*键盘码*/
    int pos;    /*九格中,空格的位置*/
    clrscr();    /*清屏*/
    randomize();    /*初始化随机发生器*/
    newGame();
    for(;;){
        key=getch();    /*获得键盘输入*/
        if(key==0) continue;
        pos=GetTheNull();    /*得到空格*/
        switch(key){        /*测试按键*/
            case 72:    /*按下*/
                if(pos<=5) change(pos,pos+3);
                break;
            case 80:    /*按上*/
                if(pos>=3) change(pos,pos-3);
                break;
            case 77:    /*按左*/
                if(pos%3!=0) change(pos,pos-1);
                break;
            case 75:    /*按右*/
                if(pos%3!=2) change(pos,pos+1);
                break;
            case 110:    /*按下‘n’新建游戏*/
                newGame();
        }
        update();    /*更新*/
        if(isSuccess()){    /*看是否游戏成功*/
            gotoxy(26,10);    /*成功了,输出一个写有Well done!的外框*/
            printf("\332\304\304\304\304\304\304\304\304\304\304\304\304\267");
            gotoxy(26,11);
            printf("\263            \272");
            gotoxy(26,12);
            printf("\263 Well Done! \272");
            gotoxy(26,13);
            printf("\263            \272");
            gotoxy(26,14);
            printf("\324\315\315\315\315\315\315\315\315\315\315\315\315\274\n");
            getch();
            newGame();    /*新游戏*/
        }
        if(key==27) break;    /*退出*/
    }
    clrscr();    /*清屏*/
}

3楼

newGame(){    /*新建游戏,实际上就是把有数字的八个方格打散,
这种效果的实现就是随机的两两交换,而怎么不与空的那个交换呢?
这涉及有没有解的问题
不管怎么样,九格游戏最后的结果只有两个:
123 | 123
456 | 456
78  | 87    (证明从略)
而要两两交换而始终有解的话,(从原序列开始)必须:相邻交换的次数为偶
但我们用一种更有效的方法:
每一个总与其下第二个交换.
第7,8个与0,1交换,只要交换次数多,仍可获得相同的效果.
而这些的前提是其中的0不能与其第奇数个作奇数次交换.
为了省事,不处理0...
其中产道理,请自己思考
*/
    int i,a,b;
    for(i=0;i<8;i++) num[i]=i+1;
    num[8]=0;    /*将数组复原*/
    for(i=0;i<300;i++){
        a=random(8);    /*产生随机数*/
        b=(a+2)%8;    /*得到下第二个的数组下标*/
        change(a,b);    /*交换*/
    }
    update();
}

update(){    /*在屏幕上画出整个九格图像,关于定位的问题自己分析*/
    int i,j;
    for(i=0;i<=2;i++){
        gotoxy(24,8+i*3);
        for(j=0;j<=2;j++){
            if (num[j+i*3]!=0)
                printf("\332\304\304\304\304\267");
            else
                printf("      ");
        }
        gotoxy(24,9+i*3);
        for(j=0;j<=2;j++){
            if (num[j+i*3]!=0)
                printf("\263 %d  \272",num[j+i*3]);
            else
                printf("      ");
        }
        gotoxy(24,10+i*3);
        for(j=0;j<=2;j++){
            if (num[j+i*3]!=0)
                printf("\324\315\315\315\315\274");
            else
                printf("      ");
        }
        printf("\n");
    }

}

int isSuccess(){    /*判断是否游戏*/
    int i,ret=1;
    for(i=0;i<8;i++)
        ret=ret&&(num[i]==(i+1));
    return ret;
}

int GetTheNull(){    /*获得空格的位置*/
    int i;
    for(i=0;i<=8;i++){
        if (num[i]==0)
            return i;

    }
}

change(int a,int b){    /*交换num[a],num[b]*/
    int temp;
    temp=num[a];
    num[a]=num[b];
    num[b]=temp;
}

/*游戏,就这么简单!*/

4楼

另外我想说明一个:
/324/315...之类的东西,代表的是ASCII表中的制表符.
当然,它是八进制的.

5楼

注意:三楼开头有一 newGame(){ 
不要以为是注释!

60.30.226.*

6楼

不错呀,可是看得不太懂,我们现在刚学,等过一阵子估计我就看懂了。
218.19.34.*

7楼

顶一下,这个东西让我对C语言充满希望...

8楼

哥们,你真牛啊!佩服!!!!!
不过,你觉得学C语言有是用啊!现在编游戏都不用这个啦!这么麻烦·!是吧!所以希望你能告诉小弟我,学C语言的用处!因为我不知道是不是啊学它啊!谢谢啦!

61.176.25.*

9楼

太差了
221.229.242.*

10楼

老兄把printf函数发挥得太极致了,佩服!
221.234.208.*

11楼

[B][fts=4]佩服楼主的创新和钻研精神。!!!!!!!!!![/B][/ft]
61.167.60.*

12楼

c++下编译不通,在n多warning下这个程序被咔嚓了,执行不了。
还有都什么年代了,还在使TC,鄙视。

221.199.188.*

13楼

我运行了一下,没错误,可是同样运行不了。
提示说,(未定义)……好象有7个

221.199.188.*

14楼

楼上是我,我用的是 tc 3.0
59.64.71.*

15楼

楼主的钻研精神
令后来者佩服
!!!!!!!!!!!!!!!

222.34.162.*

16楼

不错,对我这样的初学者有很大帮助
61.144.54.*

17楼

文本界面想做游戏,就只能用clrscr()和gotoxy()了
219.218.158.*

18楼

这个程序在将.OBJ连接成.exe的时候不能连接,忘记调用库函数了,我也赞同13楼的哥们。
哥们,我现在是百思不得其解啊
忘在坐的哥们给我一个合理的解释
我给你们留个邮箱
 sunqinglong120@sina.com

219.148.133.*

19楼

tc2+winxp没有错误,可以运行,但是不是想看到的运行结果!
61.136.188.*

20楼

我还没开始学!
不过有那么些打算学,但是我具体不希望怎么样研制游戏,是用在实际管理大范围的管理控制方面应该学些什么呢?

61.140.253.*

21楼

我位玩过九格游戏,能不能说一下游戏的玩法,这样一有助理解.谢谢
58.48.157.*

22楼

太强....

23楼

不错
218.59.44.*

24楼

ding shang qu
60.0.129.*

25楼

8楼的兄弟,学C语言目的并不是为了以后用这个编大型游戏,你问C语言有什么用?其实C语言就是所有高级语言的基础,几乎所有的语言都是由C语言发展来的,如果你C语言学的很好,那么几天可能就精通asp,如果学习JAVA语言或者VC,C#会相当轻松,很多脚本语言也是C语言的一部分,比如暴雪公司的游戏魔兽争霸的地图脚本jass语言,会C语言的加上一个jass库函数功能说明可能瞬间掌握jass语言,并且C语言的思路很复杂可以锻炼你的编程思路,这种思路锻炼出来对所有语言思路大体上都是差不多的.
218.6.241.*

26楼

change(int a,int b){ /*交换num[a],num[b]*/ 
 int temp; 
 temp=num[a]; 
 num[a]=num[b]; 
 num[b]=temp; 

ERROR!

222.30.24.*

27楼

在VC上用不了gotoxy和clrscr命令,链接时显示undeclared identifier,怎么回事

28楼

到现在差不多学了两个月的C了,但是只懂几个简单的单词而已,其它的什么都不懂.
都不知道即使学了,会用吗?
哎呀........

219.139.115.*

29楼

case 72: /*按下*/ 
 if(pos<=5) change(pos,pos+3); 
 break; 
 case 80: /*按上*/ 
 if(pos>=3) change(pos,pos-3); 
 break; 
 case 77: /*按左*/ 
 if(pos%3!=0) change(pos,pos-1); 
 break; 
 case 75: /*按右*/ 
 if(pos%3!=2) change(pos,pos+1); 
 break; 

 if(pos<=5) change(pos,pos+3); 
 if(pos%3!=2) change(pos,pos+1); 
 if(pos%3!=0) change(pos,pos-1); 

我理解不了,谁能告诉我??~~~~8424801

219.139.115.*

30楼

if(pos<=5) change(pos,pos+3); 
 if(pos%3!=2) change(pos,pos+1); 
 if(pos%3!=0) change(pos,pos-1); 

我理解不了,谁能告诉我??~~~~8424801

发表回复

内 容:
用户名:
  
©2010 Baidu 贴吧协议  意见反馈