您当前的位置:首页 > IT编程 > C++
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

自学教程:C++ tell_player函数代码示例

51自学网 2021-06-03 08:43:38
  C++
这篇教程C++ tell_player函数代码示例写得很实用,希望能帮到您。

本文整理汇总了C++中tell_player函数的典型用法代码示例。如果您正苦于以下问题:C++ tell_player函数的具体用法?C++ tell_player怎么用?C++ tell_player使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。

在下文中一共展示了tell_player函数的30个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。

示例1: delete_received

 void delete_received(player *p,char *str) {   int number,count=0;   int *make,*scan;   char *oldstack;   note *deleted;   number=atoi(str);   if (number<=0) {     tell_player(p,"Format: delete <mail number>/n");     return;   }   if (!(p->saved)) {     tell_player(p,"You have no save information, and therefore no mail either./n");     return;   }   scan=p->saved->mail_received;   if (!scan) {     tell_player(p,"You have recieved no mail to delete./n");     return;   }   oldstack=stack;   align(stack);   make=(int *)stack;   for(number--;number;number--)      if (*scan) {       *make++=*scan++;       count++;     }     else break;   if (!*scan) {     tell_player(p,"Not that many pieces of mail./n");     stack=oldstack;     return;   }   deleted=find_note(*scan++);   while(*scan) {     *make++=*scan++;     count++;   }   *make++=0;   count++;   if (p->saved->mail_received) FREE(p->saved->mail_received);   if (count!=1) {     p->saved->mail_received=(int *)MALLOC(sizeof(int)*count);     memcpy(p->saved->mail_received,stack,sizeof(int)*count);   }   else p->saved->mail_received=0;   if (deleted) {     deleted->read_count--;     if (!(deleted->read_count)) unlink_mail(deleted);   }   tell_player(p,"Mail deleted..../n");   stack=oldstack; }
开发者ID:talkers,项目名称:ew-too,代码行数:54,


示例2: intercom_unbanish_name

void intercom_unbanish_name(player * p, char *str){  nameban *prev, *scan;  char *oldstack;  if (!*str)  {    tell_player(p, "Format: intercom unbanish_name <name>/n");    return;  }  if (p->flags & BLOCK_SU)  {    tell_player(p, "Please go on duty to do that./n");    return;  }  scan = nameban_anchor;  prev = 0;  while (scan)  {    if (scan->name[0] && !strcasecmp(scan->name, str))    {      if (scan->type == 1)	tell_player(p, " Name unbarred./n");      else	tell_player(p, " Name unbanished./n");      oldstack = stack;      sprintf(oldstack, "-=> %s allows the name '%s' to use the "	      "intercom./n", p->name, str);      stack = end_string(oldstack);      su_wall(oldstack);      stack = oldstack;      if (prev)	prev->next = scan->next;      else	nameban_anchor = scan->next;      if (scan->type == 2)	sync_banish_names();      FREE(scan);      return;    }    prev = scan;    scan = scan->next;  }  tell_player(p, " That name is not in the banished list./n");  return;}
开发者ID:talkers,项目名称:pgplus,代码行数:54,


示例3: show_exits

void            show_exits(player * p, char *str){   if (p->saved_flags & SHOW_EXITS)   {      tell_player(p, " You won't see exits when you enter a room now./n");      p->saved_flags &= ~SHOW_EXITS;   } else   {      tell_player(p, " When you enter a room you will now see the exits./n");      p->saved_flags |= SHOW_EXITS;   }}
开发者ID:talkers,项目名称:summink,代码行数:12,


示例4: reset_session

void reset_session(player * p, char *str){  char *oldstack = stack;  player *scan;  if (config_flags & cfNOSWEAR)    str = filter_rude_words(str);  if (strlen(str) > 55)  {    tell_player(p, " Too long a session name .../n");    stack = oldstack;    return;  }  if (*str)  {    if (strstr(str, "^"))      sprintf(session, "%s^N", str);    else      sprintf(session, "%s", str);    sprintf(stack, " You reset the session message to be '%s^N'/n", str);    stack = end_string(stack);    tell_player(p, oldstack);    /* reset comments */    for (scan = flatlist_start; scan; scan = scan->flat_next)      strncpy(scan->comment, "", MAX_COMMENT - 3);    stack = oldstack;    sprintf(stack, "%s resets the session to be '%s'/n", p->name, str);    stack = end_string(stack);    command_type |= EVERYONE;    for (scan = flatlist_start; scan; scan = scan->flat_next)      if (scan != p && !(scan->custom_flags & YES_SESSION))	tell_player(scan, oldstack);    stack = oldstack;    p_sess = p;    strcpy(sess_name, p->name);    sprintf(stack, "%s- %s", p->name, session);    stack = end_string(stack);    log("session", oldstack);    stack = oldstack;  }  session_reset = 0;  tell_player(p, " Session timer reset./n");}
开发者ID:talkers,项目名称:pgplus,代码行数:52,


示例5: intercom_unbar_name

void intercom_unbar_name(player * p, char *str){  nameban *scan, *prev;  char *oldstack;  if (!*str)  {    tell_player(p, " Format: intercom unbar_name <name>./n");    return;  }  if (p->flags & BLOCK_SU)  {    tell_player(p, "Please go on duty to do that./n");    return;  }  scan = nameban_anchor;  prev = 0;  while (scan)  {    if (scan->name[0] && !strcasecmp(scan->name, str))    {      if (scan->type == 2)      {	tell_player(p, " They are banished, you need to use intercom "		    "unbanish_name to re-permit them./n");	return;      }      tell_player(p, " Name unbanished./n");      oldstack = stack;      sprintf(oldstack, "-=> %s allows the name '%s' to use the "	      "intercom./n", p->name, str);      stack = end_string(oldstack);      su_wall(oldstack);      stack = oldstack;      if (prev)	prev->next = scan->next;      else	nameban_anchor = scan->next;      FREE(scan);      return;    }    prev = scan;    scan = scan->next;  }  tell_player(p, " No such name in the intercom barred lists./n");  return;}
开发者ID:talkers,项目名称:pgplus,代码行数:52,


示例6: pager

void            pager(player * p, char *text, int page){   ed_info        *e;   int             length = 0, lines = 0;   char           *scan;   if (p->saved_flags & NO_PAGER && !page)   {      tell_player(p, text);      return;   }   if (p->edit_info)   {      tell_player(p, " You are currently already in the pager/editor!/n");      return;   }   /* scan whole of string, if its a newline then increase lines, and inc      length -again-??       Of course - this routine below can't actually cope with overwrapping       lines */   for (scan = text; *scan; scan++, length++)   {      if (*scan == '/n')         lines++;   }   if (lines > (TERM_LINES + 1))   {      e = (ed_info *) MALLOC(sizeof(ed_info));      if(e==NULL) {         tell_player(p, " Eeek, can't enter pager right now./n");         return;      }      memset(e, 0, sizeof(ed_info));      p->edit_info = e;      e->buffer = (char *) MALLOC(length+1);      if(e->buffer==NULL) {         tell_player(p, " Eeek, can't enter pager right now./n");         free(e);         return;      }      memset(e->buffer, 0, length+1);      strncpy(e->buffer, text, length);      e->current = e->buffer;      e->max_size = lines;      e->size = 0;      e->input_copy = p->input_to_fn;      e->flag_copy = p->flags;      p->input_to_fn = pager_fn;      p->flags &= ~PROMPT;   }   draw_page(p, text, 1);}
开发者ID:talkers,项目名称:sensisummink,代码行数:52,


示例7: add_intercom_server

void add_intercom_server(player * p, char *str){  char *name, *abbr, *addr, *port, *oldstack;  name = str;  abbr = 0;  addr = 0;  port = 0;  if (*name)  {    abbr = strchr(name, ':');    if (abbr)    {      *abbr++ = '/0';      if (*abbr)      {	addr = strchr(abbr, ':');	if (addr)	{	  *addr++ = '/0';	  if (*addr)	  {	    port = strchr(addr, ':');	    if (port)	      *port++ = '/0';	  }	}      }    }  }  if (!port || !*port || !*addr || !*abbr || !name || !*name)  {    tell_player(p, "Format: add_server "		"<name>:<abbreviation>:<address>:<port>/n");    return;  }  oldstack = stack;  sprintf(oldstack, " Sending request to intercom to add %s to the database, "	  "at address %s %s, abbreviated to %s./n", name, addr, port, abbr);  stack = end_string(oldstack);  tell_player(p, oldstack);  stack = oldstack;  send_to_intercom(p, "%c%s:%s:%s:%s:%s:O",		   ADD_NEW_LINK, p->name, name, abbr, addr, port);  return;}
开发者ID:talkers,项目名称:pgplus,代码行数:52,


示例8: toggle_quiet_edit

void toggle_quiet_edit(player *p,char *str){  restore_flags(p);  if (!strcmp("off",str)) p->saved_flags &= ~QUIET_EDIT;  else if (!strcmp("on",str)) p->saved_flags |= QUIET_EDIT;  else p->saved_flags ^= QUIET_EDIT;    if (p->saved_flags&QUIET_EDIT)     tell_player(p,"You will block tells and shouts upon editing./n");  else    tell_player(p,"You won't block shouts and tells on editing./n");  save_flags(p);}
开发者ID:talkers,项目名称:ew-too,代码行数:13,


示例9: cmd_read

cmd_read(int x){  if(!x){    tell_player(THISP, "/n~~~ Table of Contents ~~~/n ");    cmd_dir();    tell_player(THISP, "/n~~~ Usage: read <#> ~~~");  }  else {    x = x-1;    mixed f = get_dir(to_string(CONTENT));    if(x < sizeof(f)){      THISP->more_string( read_file(to_string(CONTENT) + f[x]));      tell_room(ENV(THISP), PNAME+" studies a book carefully./n", ({THISP}));    }
开发者ID:nhaskins,项目名称:eotl,代码行数:13,


示例10: intercom_banish

void intercom_banish(player * p, char *str){  if (!*str)  {    tell_player(p, " Format: banish <name|alias>/n");    return;  }  if (p->flags & BLOCK_SU)  {    tell_player(p, "Please go on duty to do that./n");    return;  }  send_to_intercom(p, "%c%s:%s", BANISH_SITE, p->name, str);  return;}
开发者ID:talkers,项目名称:pgplus,代码行数:15,


示例11: intercom_bar_name

void intercom_bar_name(player * p, char *str){  nameban *new_var;  char *oldstack;  if (!*str)  {    tell_player(p, " Format: intercom bar_name <name>./n");    return;  }  if (p->flags & BLOCK_SU)  {    tell_player(p, "Please go on duty to do that./n");    return;  }  if (strlen(str) > MAX_NAME - 1)    str[MAX_NAME - 1] = 0;  if (check_intercom_banished_name(str))  {    tell_player(p, " That name is already barred./n");    return;  }  new_var = (nameban *) MALLOC(sizeof(nameban));  memset(new_var, 0, sizeof(nameban));  if (nameban_anchor)    new_var->next = nameban_anchor;  nameban_anchor = new_var;  strcpy(new_var->name, str);  new_var->type = 1;  oldstack = stack;  sprintf(oldstack, " The name '%s' is now barred from the intercom./n", str);  stack = end_string(oldstack);  tell_player(p, oldstack);  sprintf(oldstack, "-=> %s bars the name '%s' from using the intercom./n",	  p->name, str);  stack = end_string(oldstack);  su_wall(oldstack);  stack = oldstack;  return;}
开发者ID:talkers,项目名称:pgplus,代码行数:48,


示例12: draw_page

/* the dreaded pager B-)  */int             draw_page(player * p, char *text, int drawme){   int             end_line = 0, n;   float perc;   ed_info        *e;   char           *oldstack;   oldstack = stack;   for (n = TERM_LINES + 1; n; n--, end_line++)   {      while (*text && *text != '/n')         *stack++ = *text++;      if (!*text)         break;      *stack++ = *text++;   }   *stack++ = 0;      if(drawme)     tell_player(p, oldstack);        if (*text && p->edit_info)   {      e = p->edit_info;      end_line += e->size;      perc = (((float)end_line/(float)e->max_size)*100);      sprintf(oldstack,               "(Pager: lines %d-%d of %d (%d%%)) p/N/f/l/r/q/?: "	      ,e->size+1, end_line, e->max_size, (int) perc);      stack = end_string(oldstack);      do_prompt(p, oldstack);   }   stack = oldstack;   return *text;}
开发者ID:talkers,项目名称:sensisummink,代码行数:36,


示例13: edit_forward_line

void edit_forward_line(player *p,char *str){  char *c;  ed_info *e;  e=p->edit_info;  c=e->current;  if (!*c) {    tell_player(p,"Can't go forward, bottom of buffer./n");    return;  }  while(*c && *c!='/n') c++;  if (*c) c++;  e->current=c;  if (!*c) tell_player(p,"Reached bottom of buffer./n");  else edit_view_line(p,0);}
开发者ID:talkers,项目名称:ew-too,代码行数:16,


示例14: edit_stats

void edit_stats(player *p,char *str){  int words=0,lines=0,blip=0;  char *scan,*oldstack;  oldstack=stack;  for(scan=p->edit_info->buffer;*scan;scan++) {    switch(*scan) {    case ' ':      if (blip) words++;      blip=0;      break;    case '/n':      if (blip) words++;      blip=0;      lines++;      break;    default:      blip=1;    	    }  }  sprintf(oldstack,"Used %d bytes out of %d, in %d lines and %d words./n",	  p->edit_info->size,p->edit_info->max_size,lines,words);  stack=end_string(stack);  tell_player(p,oldstack);  stack=oldstack;}
开发者ID:talkers,项目名称:ew-too,代码行数:26,


示例15: draw_page

int draw_page(player *p,char *text){  int end_line=0,n;  ed_info *e;  char *oldstack;  oldstack=stack;  for(n=TERM_LINES-3;n;n--,end_line++) {    while(*text && *text!='/n') *stack++=*text++;    if (!*text) break;    *stack++=*text++;  }  *stack++=0;  tell_player(p,oldstack);  if (*text && p->edit_info) {    e=p->edit_info;    end_line+=e->size;    sprintf(oldstack,"(Pager: lines %d to %d, from a total %d)",	    e->size,end_line,e->max_size);    stack=end_string(oldstack);    do_prompt(p,oldstack);  }  stack=oldstack;	  return *text;}
开发者ID:talkers,项目名称:ew-too,代码行数:25,


示例16: phase4

void phase4( object arg ){    tell_player( arg, "There is definitely something shifting "      "down in the darkness. You can make out a huge dark shape."    );    call_out( "phase5", 5, THISP );}
开发者ID:smokeless,项目名称:eotl,代码行数:7,


示例17: phase5

void phase5( object arg ){    tell_player( arg, "You hit the ground with a resounding thud. "      "Your limbs twist and contort." );    THISP->move_player( "&&", FROOM "pit", 1 );    arg->DeathSequence( arg, "fell too far" );}
开发者ID:smokeless,项目名称:eotl,代码行数:7,


示例18: cmd

mixed cmd(string str) {    object target;    if(!str || str == "") str = "me";    if(str == "me") str = this_player()->GetKeyName();    if(!target = present(str, environment(this_player()))){        write("They're not here.");        return 1;    }    if(!living(target)) {        write("That's not a living thing.");        return 1;    }    if(creatorp(target) && !archp(this_player()) &&            target != this_player()){        write("That's impolite.");        tell_player(target,capitalize(this_player()->GetKeyName())+                " just tried to anglicize you.");        return 1;    }    target->SetNativeLanguage("English");    if(target == this_player()) str = "yourself";    else str = capitalize(str);    write("You anglicize "+str+".");    if(target != this_player())         tell_object(target, capitalize(this_player()->GetKeyName())+" anglicizes you.");    return 1;}
开发者ID:Elohim,项目名称:FGmud,代码行数:30,


示例19: send_to_intercom

void send_to_intercom(player * p, const char *fmt,...){  va_list varlist;  char *oldstack;  oldstack = stack;  if (p && intercom_fd < 1)  {    tell_player(p, " The intercom is currently down./n");    return;  }  va_start(varlist, fmt);  vsprintf(stack, fmt, varlist);  va_end(varlist);  if (oldstack[strlen(oldstack) - 1] == (char) INCOMPLETE_MESSAGE ||      oldstack[strlen(oldstack) - 1] == (char) END_MESSAGE)    stack = end_string(oldstack);  else  {    stack = strchr(oldstack, 0);    *stack++ = (char) END_MESSAGE;    *stack++ = '/0';  }  if (intercom_fd > 0)    write(intercom_fd, oldstack, strlen(oldstack));  stack = oldstack;}
开发者ID:talkers,项目名称:pgplus,代码行数:31,


示例20: sub_command

void sub_command(player *p,char *str,struct command *comlist){  char *oldstack,*rol;  void (*fn)();  oldstack=stack;    while(comlist->text) {    if ((!comlist->level) || ((p->residency)&(comlist->level))) {      rol=do_match(str,comlist);      if (rol) {	last_com=comlist;	stack_check=stack;        fn=comlist->function;        (*fn)(p,rol);	if (stack!=stack_check) bad_stack();	sys_flags &= ~(FAILED_COMMAND|PIPE|ROOM_TAG|FRIEND_TAG|EVERYONE_TAG);	command_type=0;        return;      }    }    comlist++;  }  rol=str;  while(*rol && !isspace(*rol)) rol++;  *rol=0;  sprintf(oldstack,"Cannot find sub command '%s'/n",str);  stack=end_string(oldstack);  tell_player(p,oldstack);  stack=oldstack;}
开发者ID:talkers,项目名称:ew-too,代码行数:30,


示例21: exit_mail_mode

void exit_mail_mode(player *p,char *str){    if (p->input_to_fn != mail_command) return;    tell_player(p,"Leaving mail mode./n");    p->input_to_fn=0;    p->flags|=PROMPT;}
开发者ID:talkers,项目名称:ew-too,代码行数:7,


示例22: dest_note

void dest_note(player *p,char *str){  note *n;  if (!*str) {    tell_player(p,"Format: dest_note <number>/n");    return;  }  n=find_note(atoi(str));  if (!n) {    tell_player(p,"Can't find note with that number./n");    return;  }  remove_any_note(n);  tell_player(p,"Note removed/n");}
开发者ID:talkers,项目名称:ew-too,代码行数:16,


示例23: list_all_notes

void list_all_notes(player *p,char *str){    char *oldstack;    int count=0,hash;    note *scan;    oldstack=stack;    strcpy(stack," All notes --/n");    stack=strchr(stack,0);    for (hash=0;hash<=NOTE_HASH_SIZE;count=0,hash++) {	for (scan=n_hash[hash];scan;scan=scan->hash_next) count++;	sprintf(stack,"%3d notes in bucket %2d",count,hash);	stack=strchr(stack,0);	if (hash&1)	    strcpy(stack,"   --   ");	else	    strcpy(stack,"/n");	stack=strchr(stack,0);    }    strcpy(stack," --/n");    stack=strchr(stack,0);    stack++;    tell_player(p,oldstack);    stack=oldstack;}
开发者ID:talkers,项目名称:ew-too,代码行数:26,


示例24: report_idea

void report_idea(player * p, char *str){  if (!*str)  {    tell_player(p, " Format: idea <whatever you thought of>/n");    return;  }  if (strlen(str) > 480)  {    tell_player(p, " Please make it a little smaller./n");    return;  }  TELLPLAYER(p, "%s%s/n%s ... logged as idea, thank you./n", LINE, str, LINE);  LOGF("idea", "%s - %s ", p->name, str);  SW_BUT(p, " -=*> Idea log from %s: %s/n", p->name, str);}
开发者ID:talkers,项目名称:pgplus,代码行数:16,


示例25: match_commands

void            match_commands(player * p, char *str){   struct command *comlist;   char           *rol, *oldstack, *space;   void            (*fn) ();   oldstack = stack;   while (*str && *str == ' ')      str++;   space = strchr(str, 0);   space--;   while (*space == ' ')      *space-- = 0;   if (!*str)      return;   if (isalpha(*str))      comlist = coms[((int) (tolower(*str)) - (int) 'a' + 1)];   else      comlist = coms[0];   while (comlist->text)   {      if (((!comlist->level) || ((p->residency) & (comlist->level))) &&	  ((!comlist->andlevel) || ((p->residency) & (comlist->andlevel))))      {    rol = do_match(str, comlist);    if (rol)    {       last_com = comlist;       stack_check = stack;       fn = comlist->function;       (*fn) (p, rol);       if (stack != stack_check)          bad_stack();       sys_flags &= ~(FAILED_COMMAND | PIPE | ROOM_TAG | FRIEND_TAG | EVERYONE_TAG);       command_type = 0;       return;    }      }      comlist++;   }   p->antipipe++;/*   if (p->antipipe > 30)   {      quit(p, 0);      return;   }*/   rol = str;   while (*rol && !isspace(*rol))      rol++;   *rol = 0;   sprintf(oldstack, " Cannot find command '%s'/n", str);   stack = end_string(oldstack);   tell_player(p, oldstack);   stack = oldstack;}
开发者ID:talkers,项目名称:summink,代码行数:59,


示例26: edit_back_line

void edit_back_line(player *p,char *str){  char *c;  ed_info *e;  e=p->edit_info;  c=e->current;  if (c==e->buffer) {    tell_player(p,"Can't go back any more, top of buffer./n");    return;  }  c-=2;  while(c!=e->buffer && *c!='/n') c--;  if (c==e->buffer) tell_player(p,"Reached top of buffer./n");  else c++;  e->current=c;  edit_view_line(p,0);}
开发者ID:talkers,项目名称:ew-too,代码行数:17,


示例27: read_scroll

void read_scroll(){        tell_player(this_player(), "/nThe scroll crumbles into dust.../n");    this_player()->eventMoveLiving("/domains/diku-alfa/room/30.zon/3001.c",                                   this_player()->GetName()+" disappears!",                                    this_player()->GetName()+" appears in the middle of the room.");    this_object()->eventDestruct();}
开发者ID:LashMUD,项目名称:DikuMud-to-Dead-Souls-Port,代码行数:8,


示例28: start

int start( object arg ){    string player = arg->query_real_name();    if( !find_player( player ) )      return 0;    tell_player( arg, "The air starts to get hotter." );    call_out( "phase2", 5, THISP );}
开发者ID:smokeless,项目名称:eotl,代码行数:8,


示例29: intercom_update_servers

void intercom_update_servers(player * p, char *str){  tell_player(p, " Requesting talker lists from all connected talkers./n");  send_to_intercom(p, "%c", REQUEST_SERVER_LIST);  return;}
开发者ID:talkers,项目名称:pgplus,代码行数:8,


示例30: set_comment

void set_comment(player * p, char *str){  char *oldstack;  player *scan;  oldstack = stack;  if (!*str)  {    tell_player(p, " You reset your session comment./n");    strncpy(p->comment, "", MAX_COMMENT - 3);    return;  }  if (p->custom_flags & YES_SESSION)  {    tell_player(p, " You are ignoring sessions - type /"muffle session/" to toggle./n");    return;  }  if (strstr(str, "^"))  {    tell_player(p, " Sorry, but you can't have colour in your session comment./n");    return;  }  if (strstr(str, "&"))  {    tell_player(p, " Sorry, but you can't have dynatext in your session comment./n");    return;  }  if (config_flags & cfNOSWEAR)    str = filter_rude_words(str);  strncpy(p->comment, str, MAX_COMMENT - 3);  sprintf(stack, " You set your session comment to be '%s'/n", p->comment);  stack = end_string(stack);  tell_player(p, oldstack);  stack = oldstack;  /* Inform everyone else who is listening to session information */  for (scan = flatlist_start; scan; scan = scan->flat_next)    if (scan != p && !(scan->custom_flags & YES_SESSION))      TELLPLAYER(scan, " -=*> %s sets %s session comment to be '%s'/n", p->name, gstring_possessive(p), p->comment);}
开发者ID:talkers,项目名称:pgplus,代码行数:45,



注:本文中的tell_player函数示例整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。


C++ temp函数代码示例
C++ tell_object函数代码示例
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。