- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
<分区>
我有以下文件:ex19.c:
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "object.h"
#include "ex19.h"
//#include "gamemechanics.h"
int main(int argc, char *argv[])
{
// simple way to setup the randomness
srand(time(NULL));
// make our map to work with
Map *game = NEW(Map, "The Hall of the Minotaur.");
/*printf("You enter the ");
game->location->_(describe)(game->location);
while(process_input(game)) {
}*/
return 0;
}
gamemechanics.c:
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "ex19.h"
#include "object.h"
//#include "gamemechanics.h"
int Monster_attack(void *self, int damage)
{
Monster *monster = self;
printf("You attack %s!\n", monster->_(description));
monster->hit_points -= damage;
if(monster->hit_points > 0) {
printf("It is still alive.\n");
return 0;
} else {
printf("It is dead!\n");
return 1;
}
}
int Monster_init(void *self)
{
Monster *monster = self;
monster->hit_points = 10;
return 1;
}
Object MonsterProto = {
.init = Monster_init,
.attack = Monster_attack
};
void *Room_move(void *self, Direction direction)
{
Room *room = self;
Room *next = NULL;
if(direction == NORTH && room->north) {
printf("You go north, into:\n");
next = room->north;
} else if(direction == SOUTH && room->south) {
printf("You go south, into:\n");
next = room->south;
} else if(direction == EAST && room->east) {
printf("You go east, into:\n");
next = room->east;
} else if(direction == WEST && room->west) {
printf("You go west, into:\n");
next = room->west;
} else if(direction == SOUTHWEST && room->southwest) {
printf("You go southwest, into:\n");
next = room->southwest;
} else if(direction == NORTHEAST && room->northeast) {
printf("You go northeast, into: \n");
next = room->northeast;
} else if(direction == NORTHWEST && room->northwest) {
printf("You go northwest, into: \n");
next = room->northwest;
} else if(direction == SOUTHEAST && room->southeast) {
printf("You go southeast, into: \n");
next = room->southeast;
} else {
printf("You can't go that direction.");
next = NULL;
}
if(next) {
next->_(describe)(next);
}
return next;
}
int Room_attack(void *self, int damage)
{
Room *room = self;
Monster *monster = room->bad_guy;
if(monster) {
monster->_(attack)(monster, damage);
return 1;
} else {
printf("You flail in the air at nothing. Idiot.\n");
return 0;
}
}
Object RoomProto = {
.move = Room_move,
.attack = Room_attack
};
void *Map_move(void *self, Direction direction)
{
Map *map = self;
Room *location = map->location;
Room *next = NULL;
next = location->_(move)(location, direction);
if(next) {
map->location = next;
}
return next;
}
int Map_attack(void *self, int damage)
{
Map* map = self;
Room *location = map->location;
return location->_(attack)(location, damage);
}
int Map_init(void *self)
{
Map *map = self;
// make some rooms for a small map
Room *hall = NEW(Room, "The great Hall");
Room *throne = NEW(Room, "The throne room");
Room *arena = NEW(Room, "The arena, with the minotaur");
Room *kitchen = NEW(Room, "Kitchen, you have the knife now");
Room *bathroom = NEW(Room, "The bathroom, place where people shit");
Room *playroom = NEW(Room, "A child's playroom");
Room *dungeon = NEW(Room, "The dungeon with the witch");
Room *jail = NEW(Room, "The jail with crooked criminals");
// put the bad guy in the arena
arena->bad_guy = NEW(Monster, "The evil minotaur");
//ashwini is adding a new monster
dungeon->bad_guy = NEW(Monster,"Witch");
dungeon->bad_guy->hit_points = 20;
// setup the map rooms
hall->north = throne;
throne->west = arena;
throne->east = kitchen;
throne->south = hall;
arena->east = throne;
kitchen->west = throne;
//ashwini's addition to the map
throne->northeast = dungeon;
kitchen->north = dungeon;
dungeon->southwest = throne;
dungeon->south = kitchen;
dungeon->east = jail;
throne->northwest = jail;
arena->north = jail;
jail->southeast = throne;
jail->south = arena;
jail->east = dungeon;
throne->southeast = playroom;
kitchen->south = playroom;
playroom->north = kitchen;
playroom->west = hall;
playroom->northwest = throne;
throne->southwest = bathroom;
arena->south = bathroom;
bathroom->northeast = throne;
bathroom->north = arena;
bathroom->east = hall;
// start the map and the character off in the hall
map->start = hall;
map->location = hall;
return 1;
}
Object MapProto = {
.init = Map_init,
.move = Map_move,
.attack = Map_attack
};
int process_input(Map *game)
{
printf("\n> ");
char ch = getchar();
getchar(); // eat ENTER
int damage = rand() % 4;
switch(ch) {
case -1:
printf("Giving up? You suck.\n");
return 0;
break;
case 'n':
game->_(move)(game, NORTH);
break;
case 'N':
game->_(move)(game,NORTHEAST);
break;
case 's':
game->_(move)(game, SOUTH);
break;
case 'S':
game->_(move)(game,SOUTHWEST);
break;
case 'e':
game->_(move)(game, EAST);
break;
case 'E':
game->_(move)(game,SOUTHEAST);
break;
case 'w':
game->_(move)(game, WEST);
break;
case 'W':
game->_(move)(game,NORTHWEST);
break;
case 'a':
game->_(attack)(game, damage);
break;
case 'l':
printf("You can go:\n");
if(game->location->north) printf("NORTH(n)\n");
if(game->location->south) printf("SOUTH(s)\n");
if(game->location->east) printf("EAST(e)\n");
if(game->location->west) printf("WEST(w)\n");
if(game->location->northeast) printf("NORTHEAST(N)\n");
if(game->location->northwest) printf("NORTHWEST(W)\n");
if(game->location->southeast) printf("SOUTHEAST(E)\n");
if(game->location->southwest) printf("SOUTHWEST(S)\n");
break;
default:
printf("What?: %d\n", ch);
}
return 1;
}
ex19.h
#ifndef _ex19_h
#define _ex19_h
#include "object.h"
struct Monster {
Object proto;
int hit_points;
};
typedef struct Monster Monster;
int Monster_attack(void *self, int damage);
int Monster_init(void *self);
struct Room {
Object proto;
Monster *bad_guy;
struct Room *north;
struct Room *south;
struct Room *east;
struct Room *west;
struct Room *southwest;
struct Room *southeast;
struct Room *northeast;
struct Room *northwest;
};
typedef struct Room Room;
void *Room_move(void *self, Direction direction);
int Room_attack(void *self, int damage);
int Room_init(void *self);
struct Map {
Object proto;
Room *start;
Room *location;
};
typedef struct Map Map;
void *Map_move(void *self, Direction direction);
int Map_attack(void *self, int damage);
int Map_init(void *self);
#endif
对象.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "object.h"
#include <assert.h>
void Object_destroy(void *self)
{
Object *obj = self;
assert(obj != NULL);
if(obj) {
if(obj->description) free(obj->description);
free(obj);
}
}
void Object_describe(void *self)
{
Object *obj = self;
assert(obj!=NULL);
printf("%s.\n", obj->description);
}
int Object_init(void *self)
{
// do nothing really
return 1;
}
void *Object_move(void *self, Direction direction)
{
printf("You can't go that direction.\n");
return NULL;
}
int Object_attack(void *self, int damage)
{
printf("You can't attack that.\n");
return 0;
}
void *Object_new(size_t size, Object proto, char *description)
{
assert(description != NULL);
// setup the default functions in case they aren't set
if(!proto.init) proto.init = Object_init;
if(!proto.describe) proto.describe = Object_describe;
if(!proto.destroy) proto.destroy = Object_destroy;
if(!proto.attack) proto.attack = Object_attack;
if(!proto.move) proto.move = Object_move;
// this seems weird, but we can make a struct of one size,
// then point a different pointer at it to "cast" it
Object *el = calloc(1, size);
assert(el!=NULL);
*el = proto;
// copy the description over
el->description = strdup(description);
// initialize it with whatever init we were given
if(!el->init(el)) {
// looks like it didn't initialize properly
el->destroy(el);
return NULL;
} else {
// all done, we made an object of any type
return el;
}
}
对象.h
#ifndef _object_h //this is if note defined
#define _object_h //checks if there is alread an object_h
//above is usefule if we are including it multiple times, it doesn't reinclude,
//just does it once and keeps refereing back
typedef enum {
NORTH, SOUTH, EAST, WEST, SOUTHWEST, NORTHWEST, SOUTHEAST,NORTHEAST
} Direction;
typedef struct {
char *description;
int (*init)(void *self);
void (*describe)(void *self);
void (*destroy)(void *self);
void *(*move)(void *self, Direction direction);
int (*attack)(void *self, int damage);
} Object;
int Object_init(void *self);
void Object_destroy(void *self);
void Object_describe(void *self);
void *Object_move(void *self, Direction direction);
int Object_attack(void *self, int damage);
void *Object_new(size_t size, Object proto, char *description);
#define NEW(T, N) Object_new(sizeof(T), T##Proto, N)
#define _(N) proto.N
#endif
我正在努力使 ex19.c 使用 gamemechanics.c 中的函数和结构。但是每当我尝试编译时,我都会收到以下错误:
:~/c_learning/ex19_folder$ gcc -c ex19.c gamemechanics.c object.c
In file included from ex19.c:6:0:
ex19.c: In function ‘main’:
ex19.c:17:21: error: ‘MapProto’ undeclared (first use in this function)
Map *game = NEW(Map, "The Hall of the Minotaur.");
^
object.h:26:41: note: in definition of macro ‘NEW’
#define NEW(T, N) Object_new(sizeof(T), T##Proto, N)
^
ex19.c:17:21: note: each undeclared identifier is reported only once for each function it appears in
Map *game = NEW(Map, "The Hall of the Minotaur.");
^
object.h:26:41: note: in definition of macro ‘NEW’
#define NEW(T, N) Object_new(sizeof(T), T##Proto, N)
^
我的问题实际上是如何开始弄清楚到底发生了什么,因为在这一点上,我只是在进行混合和匹配,只是为了看看是什么让它起作用,但这并不能帮助我理解错误的原因正在发生(并且因为它总是失败)。因此,首先为什么我会收到 MapProto 未声明的错误,即使我在 gamemechanics.c 中声明了?我尝试创建 gamemechanics.h 但后来我对依赖项的工作方式感到困惑。这是 ex19 来自 learn c hard way。我可以尝试做一些事情,比如创建一个 gamemechanics.h 来创建函数原型(prototype),但后来我对它应该如何在系统中实现感到困惑。任何建议都会有所帮助。此外,关于如何使这个问题更容易理解的建议也会有所帮助。
tuple :: (Integer a,Fractional b) => (a,b,String) tuple = (18,5.55,"Charana") 所以这是给我的错误 ‘Integer’ is
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 11 年前。 Improve thi
我已经习惯了python和django,但我最近开始学习java。由于工作原因我没有太多时间,所以错过了很多类(class),现在我有点困惑,我必须做作业。 编辑 该程序应该根据每个运动员在自行车和比
这是一个困难的问题,但对专业人士来说很容易。 我在 mysql 中有以下字段:产品名称、mycost、sellprice 和 stock。因为我需要知道每种产品对我的商店的投资有多少,所以我创建了以下
我有 3 个表,其中已包含以下行: TBL_TESTER_LIST id tester_type tester_name 1 LMX LMX-01 2 LMX
我想只使用 GridBagLayout 来布局组件,如图所示。 我已经尝试了几个约束,但它永远不会以预期的结果结束,所以我想知道仅使用 GridBagLayout 是否真的可行。难点在于C1、C2、C
我遇到了以下代码没有结果的问题。但是,如果我取消注释掉指定的行,并注释掉它起作用的 bind_param 行,但这不是破坏了 mysqli 的目的吗?我的 var_dump 给了我的字符串(1)“1”
这个问题在这里已经有了答案: a good python to exe compiler? [closed] (3 个答案) 关闭 9 年前。 有了我之前问题的一些有用答案(见下文),我决定再试一次
我正在使用 Hadoop 分析 GSOD 数据 (ftp://ftp.ncdc.noaa.gov/pub/data/gsod/)。我选择了 5 年来执行我的实验 (2005 - 2009)。我配置了一
我在我的 macOS 应用程序的设置面板中使用 NSGridView。我是这样设置的: class GeneralViewController: RootViewController { pr
我正在尝试使用以下代码在 PHP 中自动安装 WordPress 发行版: $base_dir = '/home/username/wordpress_location'; chdir($base_d
在 Node.js 中将图像转换为 Base64 字符串时,我遇到了一个非常令人困惑的问题 这是我的示例代码: app.get('/image', (req, res) => { ServerAP
我在尝试运行我的应用程序时遇到一些错误,这里是 logcat java.lang.RuntimeException: Unable to instantiate activity Componen
基本上,我正在努力创建一个管理团队和球员的 Java 程序。 根据我的理解,我会有一个团队和一个玩家类。在团队类中会有 get 和 set 方法,以及某种形式的集合来正确存储球员,例如数组列表?然后在
我仍在尝试找出 JavaSwing 中的 BorderLayout,这真的很令人沮丧。 我希望能够将一个 Pane 拆分为 3 个包含的子面板,但我不完全确定如何包含它。 这是我的游戏类,它包含面板
下面的表设计(完整的模式见下文)还有很多需要改进的地方,并且已经造成了许多困难,但是我无法找出如何最好地将它们规范化。这些表格的目的是: ICD9-提供CICD9和CDESC组合的主查找。每个组合在I
这是我的表格: AB元组表 C 表,其中包含 A.id 和 B.id 的条目 D 表,其中包含带有 C.id 的条目和一个 bool 字段“open” 我想计算 D 表中“open”= true 且具
我在 YouTube 上跟踪了一个相当旧的教程,在视频中他以这种方式使用了 mysql_result: return (mysql_result($result,0) == 1) ? true : f
我正在尝试创建一个左侧面板的页面。该面板有一个页眉、一个内容区域和一个页脚。主面板包装器 div 应该是页面高度的 100%。页眉和页脚没有指定的高度,因为我只希望它们足够大以容纳其文本和填充,而我希
我有 TreeView ,我想在其中显示用户通过 file_dialog.getOpenFileNames() 选择的文件; file_dialog 是 QFileDialog。我确实创建了模型类:
我是一名优秀的程序员,十分优秀!