页面

core war的一些笔记

core war的wiki页: core war
大学里看过这游戏, 忘得差不多了. 做一个备忘.

Mars的特点

1. 地址是循环的, 就是一个Ring.
    假设内存大小是8000的话,则第一个内存的地址是0,最后一个是7999,它的下一个又是0.

2.没有绝对地址,只有相对地址.
   当前指令的地址是0,下一个是1,前面一个单位的地址是-1.

3. 存储的最小单位不是Byte,而是指令.
  Mars里,所有指令的大小都是1.

4. Mars是多任务的
   Mars内部有一个pqueue (process queue).
   一个进程可以SPL(fork). eg. A战士有3个进程A1,A2,A3,了只有一个B1
  则在pqueue的排列是 A1 B1 A2 B1 A3 B1 ...

5. 传统的Mars初始时每一个内存都是DAT #0,#0

6.胜负条件是有一方所有进程退出.
   程序执行了非法指令(DAT)会退出.

Redcode的语法

label opr A field, B field.

寻址方式

1. 立即寻址 #.
MOV  #7, 1
将7(数字)移动到下一条指令的B field.

2. 直接寻址, $, ($可以省略)
MOV 0,  1
将本条指令(整个) copy到下一个位置

3. A Field 间接寻址*
   同B Field间接寻址.

4. B Field间接寻址 @
   DAT   #0, #4
   MOV  0,  @-1 (下一条要执行的语句)
   将当前指令copy到后面第4条指令的位置.

5. < -- B-field indirect with predecrement
   这个同间接寻址, 只是在这之前会先把算出来的地址减1, 同时本身减1. (没讲清楚,看下面的链接)


6. 还有3个与<类似的寻址方式
>,{,}

redcode的经典文章: http://vyznev.net/corewar/guide.html

Example

1. imp
最经典的战士,只有一行:

;name imp
;assert 1
MOV 0, 1

很好懂, 将自身copy到下一个指令, 如此循环下去. 没有攻击性,除非其它战士执行非法指令退出.
杀伤力为0.

2. Gate
专门针对上面说到的imp
;name gate
;strategy ...

gate EQU wait - 10
wait  JMP 0, <gate
END wait

EQU和END是宏指令, 不是真的redcode.
END表明程序从wait开始.
JMP 0, <gate的意思是程序一直跳到当前行, 同时将-10的B Field减1.
当imp来到gate时, 会被变成 MOV 0, 0 imp执行MOV 0,0后,会执行下一个非法的指令而退出.
MOV 0, 0
DAT  #0, #0

redcode集锦: http://www.koth.org/planar/by-date/idx.htm

指令集


DAT 存放数据用的.


MOV


ADD,SUB,MOD,MUL,DIV


JMP, JMN, JMZ,SPL



没有评论: