标题:大家一起来,打地鼠
取消只看楼主
pycansi
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:5
帖 子:418
专家分:1060
注 册:2012-7-26
结帖率:100%
 问题点数:0 回复次数:3 
大家一起来,打地鼠
无聊编了个打地鼠的字符简易小游戏,与大家一起分享
这个游戏需要 SDL 的支持,用 SDL 检测按键还有定时器确是比较方便阿(不过这个小游戏只用到了定时器)
还有一个小缺陷,因为是个简易版就懒得搞了,就是按键之后还得再按下回车,不过“有条件的同学”可以把 getchar 换成 getch 就 OK 了
还有 clear_screen,windows 下的同学需要修改一下 system ("cls");
小游戏,结构简单,不多说了,上代码

程序代码:
#include "stdlib.h"
#include "stdio.h"
#include "SDL2/SDL.h"

struct map
{
        char state[3][3];               //state of every cave
};
struct map map = {{0, 0, 0, 0, 0, 0, 0, 0, 0}};

void clear_screen (void)
{
        system ("clear");               //clear the screen, can't use gotoxy
}

void draw_map (struct map *map)         //use pointer can save space
{
        clear_screen ();

        int i,j;
        for (i=0; i<3; i++)
        {
                for (j=0; j<3; j++)
                {
                        if ((*map).state[i][j])                 //map[y][x]
                        {
                                printf ("%c ", '$');            //use $ represent mouse
                        }
                        else
                        {
                                printf ("%c ", '0');
                        }
                }
                printf ("\n");
        }
}

void change_state (struct map *map, int pos)            //pos range [0, 8]
{
        int x, y;
        x = pos%3;
        y = pos/3;

        (*map).state[y][x] = !(*map).state[y][x];
}

int get_state (struct map *map, int pos)                //pos range [0, 8]
{
        int x, y;
        x = pos%3;
        y = pos/3;

        return (*map).state[y][x];
}

int judge (struct map *map)
{
        int i,j;
        for (i=0; i<3; i++)
        {
                for (j=0; j<3; j++)
                {
                        if ((*map).state[i][j])
                        {
                                return 1;
                        }
                }
        }

        return 0;
}

void over (void)
{
        printf ("Game Over");
        exit (0);
}

Uint32 SDL_callback (Uint32 interval, struct map *map)
{
        if (judge(map))
        {
                over ();
        }
        else
        {
                change_state (map, rand()%9);
                draw_map (map);
                return interval;
        }
}

/* change         7 8 9 to 1 2 3

 *                4 5 6    4 5 6

 *                1 2 3    7 8 9

 */
void change_key (int *key)              //change the key to adapt the program
{
        switch (*key)
        {
                case 7: *key=1; break;
                case 8: *key=2; break;
                case 9: *key=3; break;
                case 1: *key=7; break;
                case 2: *key=8; break;
                case 3: *key=9; break;
        }
}

int main (void)
{
        int key;
        SDL_TimerID timer;

        SDL_Init (SDL_INIT_TIMER);

        change_state (&map, rand()%9);
        draw_map (&map);

        timer = SDL_AddTimer (2000, (SDL_TimerCallback)SDL_callback, &map);

        while (key = getchar ())
        {
                //handle the key
                if ((key<'1') || (key>'9'))
                {
                        continue;
                }
                key -= 0x30;
                change_key (&key);
                key -= 1;

                if (get_state (&map, key))
                {
                        change_state (&map, key);
                        draw_map (&map);
                }
        }

        SDL_RemoveTimer (timer);
        return 0;
}



不足之处,敬请指正

[ 本帖最后由 pycansi 于 2014-9-13 15:50 编辑 ]
搜索更多相关主题的帖子: windows 小游戏 system 打地鼠 定时器 
2014-09-13 15:44
pycansi
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:5
帖 子:418
专家分:1060
注 册:2012-7-26
得分:0 
回复 2 楼 网络小白
请参考: tjumyk.


莫问前尘有愧,但求今生无悔
2014-09-16 13:01
pycansi
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:5
帖 子:418
专家分:1060
注 册:2012-7-26
得分:0 
回复 3 楼 rjsp
高,学习了

想起 b版 了,也是一手优雅的位操作


莫问前尘有愧,但求今生无悔
2014-09-16 14:51
pycansi
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:5
帖 子:418
专家分:1060
注 册:2012-7-26
得分:0 
"\n" + (i%3 != 2)
巧妙运用了字符串末尾的 0 ,漂亮


莫问前尘有愧,但求今生无悔
2014-09-16 15:27



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-436035-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023540 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved