|
|
发表于 22-11-2007 04:47 PM
|
显示全部楼层
geekman兄,你只是把我想说的话说出来而已,而且以你的经验和资历,绝对比我更有资格说这话 |
|
|
|
|
|
|
|
|
|
|
发表于 22-11-2007 06:19 PM
|
显示全部楼层
谢谢。。本来我都打算放弃做游戏的念头了。
哈。现在又提起劲了。。
我在尝试做那些游戏,有什么问题再问。。
关于TicTacToe...如何不让玩家输入重复的地方?
还有Array是char还是int? |
|
|
|
|
|
|
|
|
|
|
发表于 22-11-2007 06:41 PM
|
显示全部楼层
刚刚从头再看完所有的帖子,觉得或许我应该补充一些基本的概念,希望能够对刚学习电脑语言的朋友们有所帮助。
虽然我是学 C 出身的,后来为了进入 windows 的世界而自修了 C++,不过接下来所说的应该对各种语言都通用(至少C/C++,C#,Flash应该都通用)。
首先来说说电脑语言里的各种数据种类:
int 全名 integer,也就是整数,数据可以是负数(negative,简写为 -ve )、零(零是没有正负属性的,不过一般都把0当作正数)以及正数(positive,简写为 +ve )。int 的大小视乎该软件运行的作业系统而定,例如当初DOS/Win3.11时代,int 的大小为16位元(bit),在现在WinXP时代为 32 bit,在UNIX等64 bit 系统则为 64 bit (这方面我的记忆有点模糊,如果有错商请指正,也别尽信 <-无责任言论,哈哈。。。)
16 bit 的 int 可代表 -32768 到 +32767。int 也可以是 unsigned 的,也就是说 int 的整个空间都用来代表正数,这么一来可代表的数值就增加一倍,不过就无法代表负数值,适用于没有负数的情况。unsigned int (16 bit) 可代表 0 到 65535。Windows 也把 int 另行宣告为 WORD (大写,可以在windows.h这个档案里面找到,这个档案在任何有支援Windows编程系统的IDE都有,如Visual C++)
char (character) 类似 int,不过 char 只是 8 bit (在 UNIX 系统 char 是 16 bit)。同样的,char 也是有 unsigned 版本的。char 之所以被这么称呼是因为当初设定的电脑文字符号就只占用 8 bit ,所以一个 char 就代表一个字母/数字/符号,字符在英文里面也称为character。和 int 一样,char 也被 windows 定义为 BYTE 或者 CHAR。
long 也就是 long integer,是 int 的两倍大的整数。
float 也就是鼎鼎大名的 floating point,浮点。用来储存有小数点的数字。一般上float的格式是 int.int 也就是小数点前一个 int,小数点后一个 int,也就是 (16 bit 的情形下)可代表 -32768.0 到 +32767.65535 (小数点没有正负之分)(unsigned 的情形下 0.0 到 +65535.65535)<-再一次,可能有错,无责任言论,哈哈哈。。。
double 是 float 的两倍空间版。
String/AnsiString string 本身严格来说并不是一个数据种类,而是一连串的char组合起来形成的,String 本身其实是指整个字串的第一个字的位置(也就是 char pointer)。AnsiString 是指符合 ANSI 标准的 String 格式。
void 这是一个特殊的数据种类,原意是指“没有固定格式的数据种类”,如果没记错的话 void 应该是一个 int pointer ,也就是该个数据的在记忆里的位置。
struct 也就是 structure ,指的是一个“一群各种基本数据组合起来的结构”,基本数据就是上面所提到的数据种类。
array 一组相同的数据总类组合在一起的数据种类。
暂时就写这么多。 |
|
|
|
|
|
|
|
|
|
|
发表于 22-11-2007 09:19 PM
|
显示全部楼层
哈哈, geek 兄说的很好又详细。。
那我也来补充
int 基本上有 short 或 long 两种。。
short 呢 ,基本上就是 2 bytes (16 bits)
long 呢, 在32 bit 的window 上呢 就是 4 bytes (32bits)
我们所用的 pointer 其实 就是 long integer, 它hold 的 value 其实
就是 memory 的 address
每个variable都会占memory. 每一块memory都有自己的一个地址。。
每块 memory 的单位是一byte。他们的地址都用一个long integer 来refer。 比如说 0x00001234 那它隔壁那一byte 的地址就是 0x00001235
有些variable 很肥,一个人就要两个单位。。。
就拿个简单的例子来说明好了。。
258 这个short int 牵涉两 bytes
00000001 00000010
说到, memory address又有两种的system
一种是, big endian 一种是 little endian
这个关系到 byte order, 就是 byte 的排法
1 X 256 + 2
就以顺序来看 memory
在 big endian 的 system 里呢,
它就会先排 0x01 然后才 0x02
在 little endian 的 system 里呢
它是先 0x02 然后才 0x01
[ 本帖最后由 tensaix2j 于 22-11-2007 09:34 PM 编辑 ] |
|
|
|
|
|
|
|
|
|
|
发表于 23-11-2007 08:39 AM
|
显示全部楼层
原帖由 xFreaKx 于 22-11-2007 06:19 PM 发表 
谢谢。。本来我都打算放弃做游戏的念头了。
哈。现在又提起劲了。。
我在尝试做那些游戏,有什么问题再问。。
关于TicTacToe...如何不让玩家输入重复的地方?
还有Array是char还是int?
我也曾做过 tic tac toe,
我记得,当时我的做法是
先把 该有的component 的functions 写下来
例如
这个负责填而已, 可以填,就填, 然后return 0, 不可以填就return -1
int mark(board b, position x, player p);
这个负责计算该填哪里, 但没负责填。。
int compute(board b, player p);
compute 里用的algorithm 如下:
1. 测试一到九,若有空 and 一填下去就会制胜的话, return 那格的position。若没,继续以下
2. 测试一到九,若有空 and 若对手一填下去对手就会制胜的话, return 那格的position。 若没,继续以下
3. 测试中间那格,若有空, return 那格的position。 若没,继续以下
4. 测试四个corner,若有空,
看看两个adjacent 的corner,若都是对手棋子,break loop 继续以下
若任何一个不是对手棋子, return 那格的position。
若没,继续以下
5. 测试剩下的格,若有空, return 那格的position。
return -1
[ 本帖最后由 tensaix2j 于 23-11-2007 08:44 AM 编辑 ] |
|
|
|
|
|
|
|
|
|
|
发表于 23-11-2007 08:48 AM
|
显示全部楼层
我也分享下我做tic tac toe的心得.
那时候是学校的project,我并没有为游戏加上AI, 所以电脑的填格是随机的.
现在有了一些经验,觉得可以加强的地方有.
1)除了为电脑加上基本的AI外,还要随机让电脑出错.
2)tic tac toe 的游戏介面可以通过directx的运用得到加强,那时候纯粹写了一个console app 就交上去了.
3)整个tic tac toe 的架构可以更干净些,那时候如果写好好来的话,或许以后什么游戏都可以建立在这个interface 上了. |
|
|
|
|
|
|
|
|
|
|
发表于 23-11-2007 09:06 AM
|
显示全部楼层
慢慢来。。
2D 的画面, 先从, windows 基本的 GDI 下手。。。。
这样新手会比较容易明白。。。 |
|
|
|
|
|
|
|
|
|
|
发表于 23-11-2007 11:12 AM
|
显示全部楼层
原帖由 xFreaKx 于 22-11-2007 06:19 PM 发表 
(前略)
关于TicTacToe...如何不让玩家输入重复的地方?
还有Array是char还是int?
Array 并没有硬性的规定它是任何种类,只要是基本数据种类都可以组成 array,例如:
int myArray[3];
就是表示你向编译器(compiler)宣告你要一组以3个integer组成的 array,而
float myOtherArray[10];
就表示你的这个 array 是由10个浮点组成的。
array 的定义是“由一组种类相同的数据组成的组合”。如果你要使用 array 里面的任何一个个别数据,你可以使用[n]这个operator,[]里面的n代表该个数据在这组合里面的位子,也就是index,第一个位置是0,第二个是1,第三个是2,以此类推:
第一个数据 myArray[0];
第二个数据 myArray[1];
第三个数据 myArray[2];
...
至于你的另一个问题,有好几种方法,例如我在我的上面网址里的例子所使用的方法就是检查该个格子的状态,如果它不是处在其初始化的状态(_currentframe 大于 1),那就表示它已经接受过输入,就会直接退出function,不做任何处理。
不然就是使用一个3x3的array
int tictactoe[3][3];
然后侦测玩家点的是哪一格(计算鼠标在画面的位置,不然就是像我的设计那样,用Click-able object来自行侦测鼠标位置,然后检查array里面的数据状态,例如0代表还没有输入,1代表圆圈,2代表交叉。
其实以上两个方法都大同小异,只是一个是直接采用Flash里面的Frame来当作侦测数据,另一个是使用了array,多了一层功夫要做(不过当要运算人工智能时会比较方便)。 |
|
|
|
|
|
|
|
|
|
|
发表于 23-11-2007 04:48 PM
|
显示全部楼层
我就做副导师好了。。 :)
array 跟 pointer ,有着密切的关系,
但并不代表他们是一样。。
例子
1. unsigned char a[100];
2. unsigned char *a= (char *)malloc(100);
在这里,他们看起来好像是一样 (就一个Pointer to 一个100 bytes 的memory, 100 个单位,每个单位各1 byte)
都可以用subscript 去access 各个element
例如:
a[0], a[1], a[23] ....etc
都可以做 pointer arithmetic 来 address offset
例如
a+ 3 , a+ 4 ..
但请注意:
你只可以做 a++ for pointer but not for array. |
|
|
|
|
|
|
|
|
|
|
发表于 27-11-2007 08:39 AM
|
显示全部楼层
接下来,我们在来聊聊。。
variable pointer,
array of pointers,
function pointer,
还有 callback functions.
哈哈。。。从游戏讨论区变成新手的 C 教学去了。。。。 |
|
|
|
|
|
|
|
|
|
|
发表于 3-12-2007 06:41 PM
|
显示全部楼层
原帖由 tensaix2j 于 23-11-2007 04:48 PM 发表 
我就做副导师好了。。 :)
array 跟 pointer ,有着密切的关系,
但并不代表他们是一样。。
例子
1. unsigned char a[100];
2. unsigned char *a= (char *)malloc(100);
在这里,他们 ...
等等。。等等。。别酱快啦。。吸收不来。。。
不是很明白 malloc 那边。。因为我才刚学Pointer..
unsigned char *a= (char *)malloc(100); <---这个是什么意思??
pai seh......我是新手。。。 |
|
|
|
|
|
|
|
|
|
|
发表于 3-12-2007 07:31 PM
|
显示全部楼层
原帖由 xFreaKx 于 3-12-2007 06:41 PM 发表 
等等。。等等。。别酱快啦。。吸收不来。。。
不是很明白 malloc 那边。。因为我才刚学Pointer..
unsigned char *a= (char *)malloc(100);
malloc 是 memory allocation 的意思。
基本上是要求系统给你 memory 用,如果有剩,它就会给,如果没有它就不给。。
因为基本上你不能自己乱乱assign memory的。
unsigned char *a= (char *)malloc(100);
你要求 100 个byte. 这 100 个byte 被 a 指着。 |
|
|
|
|
|
|
|
|
|
|
发表于 3-12-2007 08:23 PM
|
显示全部楼层
大概明白了。。
就和Array用法差不多,但不能 ++ 而已。。。
我再去参考参考一些网站。。。
谢谢!! |
|
|
|
|
|
|
|
|
|
|
发表于 4-12-2007 12:33 AM
|
显示全部楼层
想問一下 return 的做用是甚麼..return 0 是甚麼意識?? 不能放其他數字嗎? |
|
|
|
|
|
|
|
|
|
|
发表于 4-12-2007 12:33 AM
|
显示全部楼层
想問一下 return 的做用是甚麼..return 0 是甚麼意識?? 不能放其他數字嗎? |
|
|
|
|
|
|
|
|
|
|
发表于 4-12-2007 12:36 AM
|
显示全部楼层
|
想問一下return是做甚麼用的??return 0 是甚麼意識?我不能放其他的數字嗎?? |
|
|
|
|
|
|
|
|
|
|
发表于 4-12-2007 09:06 AM
|
显示全部楼层
原帖由 xFreaKx 于 3-12-2007 08:23 PM 发表 
大概明白了。。
就和Array用法差不多,但不能 ++ 而已。。。
我再去参考参考一些网站。。。
谢谢!!
或你可以想, array 就好象 constant pointer 那样, 现在它指着 某address,就 不能 突然 跑去指 别的address. 所以不能++
而 free pointer, 你可以 现在 指 某address 等下 又可以指 另某address.. |
|
|
|
|
|
|
|
|
|
|
发表于 4-12-2007 09:11 AM
|
显示全部楼层
原帖由 anileS 于 4-12-2007 12:33 AM 发表 
想問一下 return 的做用是甚麼..return 0 是甚麼意識?? 不能放其他數字嗎?
function 的基本你明白吗。
function 就好象 一个 black box..
Input 进去----> 【 黑箱 】 -----> output 出来
你丢进去一些 inputs , 它做完 processing 后, 就还你一个 output, 所以return 就是 还你那个 output的意思
int myfunction( 第一个input , 第二个 input 。。。第n 个input)
{
。。。
。。。
return output;
}
人家通常拿 0 做 成功 的意思, -1 就做出状况的 error code。。。 |
|
|
|
|
|
|
|
|
|
|
发表于 6-12-2007 08:06 PM
|
显示全部楼层
回复 #79 tensaix2j 的帖子
所以說那個數值是為了方便我們編輯自己放的對嗎?
他並不會造成影響.
謝謝 |
|
|
|
|
|
|
|
|
|
|
发表于 7-12-2007 09:48 AM
|
显示全部楼层
那要看你怎么用了。。。
main 的return code 人家都用来做 exit status
so that, 倘若你有做scriting 或 automation的话,
你可以知道上个 executable 是否有成功执行。。。 若没,又是什么情况下死掉。。都有不同errorcode..
在 bash 通常是用 $? 来拿 exit status |
|
|
|
|
|
|
|
|
| |
本周最热论坛帖子
|