Сообщение от
glazastik
Как это чудо прошло мимо меня?
Очень круто =)))
Честно никогда не использовал макросы в этих панелях, но вы заставили меня взглянуть на них с другой стороны, огромное вам спасибо за это.
Ха!
Так ещё раньше с крестиков ноликов начинал https://owen.ru/forum/showthread.php?t=26783
Собственно игра
Код:
#define SPACE ' '
char matr[3][3] = {
{SPACE, SPACE, SPACE},
{SPACE, SPACE, SPACE},
{SPACE, SPACE, SPACE}
} ;
char done;
int t;
initial();
memcpy(matrix, matr, sizeof(matr));
done = SPACE;
PRINTF("This is the game of Tic-Tac-Toe.\n");
PRINTF("You will be playing against the OWEN's SP3xx.\n");
PRINTF("\n\n\nPress any key to start GAME ");
GETCH();
CLRSCR();
PRINTF("You start first, your figure is a cross - (X)\n");
do {
disp_matrix();
get_player_move();
done = check();
if (done!=SPACE) break;
t = get_computer_move();
done=check();
} while((done==SPACE) && (t == 0));
CLRSCR();
if (t != 0) PRINTF("Draw!!!\n");
else if(done=='X') PRINTF("You won!!!\n");
else PRINTF("OWEN SP3xx won!!!\n");
disp_matrix();
PRINTF("\n--- G A M E O W E R ----\n");
PRINTF("Press any key to Exit ");
GETCH();
GOTOXY(0, lTotal);
t = 10;
while(t--) {
PUTCHAR('\n');
Delay(100);
}
GOTOXY(0,8);
PRINTF("Bye-bye take care of yourself!!!\n");
PRINTF(" :)");
И
Глобальные макросы, т.е. пользовательские функции
В частности ввод с клавиатуры и вывод на экран(т.е. функции консоли)
Код:
#include <stdarg.h>
//--------------To Console ----------------
void INITIAL(void);
void CLRSCR(void);
void GOTOXY(int xpos, int ypos);
int GETCH(void);
int GETCHE(void);
int PUTCHAR(int cb);
int PRINTF(char *format, ...);
//-------- To GAME ----------------------
#define SPACE ' '
int get_computer_move(void);
void get_player_move(void);
void disp_matrix(void);
char check (void);
char matrix[3][3];
void get_player_move(void)
{
int x, y;
char ch[2];
ch[1] = 0;
PRINTF("Enter coordinates for your X.\n");
PRINTF("Row? ");
// scanf ("%d", &x);
ch[0] = GETCHE();
x = atoi(ch);
PRINTF("\nColumn? ");
// scanf("%d", &y);
ch[0] = GETCHE();
y = atoi(ch);
PRINTF("\n");
x--; y--;
if (x<0 || y<0 || x>2 || y>2 || matrix[x] [y] !=SPACE) {
PRINTF("Invalid move, try again.\n");
get_player_move();
}
else matrix[x][y]='X';
return;
}
int get_computer_move(void)
{
register int t;
char *p;
CLRSCR();
PRINTF("It is SP3xx responding move\n");
p = (char *) matrix;
for (t=0; *p!=SPACE && t<9; ++t) p++;
if(t==9)
{
return t;
}
else *p = 'O';
return 0;
}
void disp_matrix(void)
{
int t;
PRINTF(" 1 2 3\n");
for(t=0; t<3; t++) {
PRINTF("%d %c | %c | %c", t+1,matrix[t][0], matrix[t][1], matrix[t][2]);
if(t!=2) PRINTF("\n ---|---|---\n");
}
PRINTF("\n");
return;
}
char check(void)
{
int t;
char *p;
for(t=0; t<3; t++) {
p = &matrix[t] [0];
if (*p==* (p+1) && * (p+1)==*(p+2)) return *p;
}
for(t=0; t<3; t++) {
p = &matrix[0][t];
if(*p==*(p+3) && *(p+3)==*(p+6)) return *p;
}
if(matrix[0] [0]==matrix [1] [1] && matrix[1] [1]==matrix [2] [2] )
return matrix[0][0];
if(matrix[0][2]==matrix[1][1] && matrix[1][1]==matrix[2] [0])
return matrix[0][2];
return SPACE;
}
//-------------------------------------------------------------------------------
//--------------To Console ----------------
#define Input PSW[136]
#define dwInput *(DWORD*)(PSW + 136)
#define BuffScr PSW[ScrAddr]
//----------------------
#define KbdStatus PSW[135]
#define ReversBit(reg, bitno) ((reg) ^= (1 << (bitno)))
#define GetKbdStatus(bitno) ((KbdStatus) & (1 << (bitno)))
#define ResetKbdStatus(bitno) ((KbdStatus) &= ( ~ (1 << ((bitno)))))
#define SetKbdStatus(bitno) ((KbdStatus) |= ( 1 << ((bitno))))
//----------------------------
#define Shift 0
#define Ctrl 1
#define Repead 2
#define Caps 3
#define ru 4
#define en 5
#define ClrScreen 6
#define ReversPSB(PSB_No) PSB[(PSB_No) / 8] ^= (1 << ((PSB_No) % 8))
const int lTotal = 18;
const int cTotal = 80;
const int tabs = 8;
const int SIZE_Scr = lTotal * cTotal;
static int cCount, lCount;
static char savMark;
static BOOL init;
static BYTE *pBuffScr;
static int ScrAddr;
//------------------------------------
void initial(void)
{
init = TRUE;
KbdStatus = 32;
dwInput = 0;
ScrAddr = PSW[10] - SIZE_Scr/2;
PSW[138] = ScrAddr;
CLRSCR();
return;
}
//------------------------------------------------
void CLRSCR(void)
{
memset(&BuffScr, ' ', cTotal * lTotal); //
lCount = cCount = 0;
pBuffScr = (BYTE *)&BuffScr;
savMark = ' ';
return;
}
//---------------------------------------------
void GOTOXY(int xpos, int ypos)
{
lCount = Min(Max(ypos, 0), (lTotal - 1));
cCount = Min(Max(xpos, 0), (cTotal - 1));
*pBuffScr = savMark = ' ';
pBuffScr = (BYTE *)&BuffScr + lCount * cTotal + cCount;
savMark = *pBuffScr;
return;
}
//-------------------------------------
int GETCH(void)
{
register int ch;
do {
Delay(5);
ch = dwInput;
if (GetPSBStatus(4)) *pBuffScr = '_'; //
else *pBuffScr = savMark; //
} while(ch == NULL);
if (GetKbdStatus(Ctrl) && isalpha(ch) && (ch <= 0xFF)) ch = ch & 0x1F;
else {
if (GetKbdStatus(Caps) && (ch <= 0xFF)) {
if ((ch >= 0xE0) || isalpha(ch)) ReversBit(ch, 5);
else if (ch == 0xB8) ReversBit(ch, 4);
}
if (GetKbdStatus(Shift) && (ch <= 0xFF)) {
if (isupper(ch)) ch = tolower(ch);
else if (islower(ch)) ch = toupper(ch);
else if ((ch == 0xB8) || (ch == 0xA8)) ReversBit(ch, 4);
else if (ch >= 0xC0) ReversBit(ch, 5);
else if (ch == '1') ch = '!';
else if ((ch == '2') && GetKbdStatus(ru)) ch = '\"';
else if (ch == '2') ch = '@';
else if ((ch == '3') && GetKbdStatus(ru)) ch = 0xB9;
else if (ch == '3') ch = '#';
else if ((ch == '4') && GetKbdStatus(ru)) ch = ';';
else if (ch == '4') ch = '$';
else if (ch == '5') ch = '%';
else if ((ch == '6') && GetKbdStatus(ru)) ch = ':';
else if (ch == '6') ch = '^';
else if ((ch == '7') && GetKbdStatus(ru)) ch = '?';
else if (ch == '7') ch = '&';
else if (ch == '8') ch = '*';
else if (ch == '9') ch = '(';
else if (ch == '0') ch = ')';
else if (ch == '-') ch = '_';
else if (ch == '=') ch = '+';
else if (ch == '\'') ch = '\"';
else if (ch == '[') ch = '{';
else if (ch == ']') ch = '}';
else if (ch == '\\') ch = '|';
else if (ch == ';') ch = ':';
else if ((ch == '/') && GetKbdStatus(en)) ch = '?';
else if ((ch == ';') && GetKbdStatus(en)) ch = ':';
else if (ch == ',') ch = '<';
else if ((ch == '.') && GetKbdStatus(ru)) ch = ',';
else if (ch == '.') ch = '>';
else if (ch == '`') ch = '~';
}
}
if (! GetKbdStatus(Repead)) {
dwInput = 0;
ResetKbdStatus(Ctrl);
ResetKbdStatus(Shift);
}
else Delay(100);
*pBuffScr = savMark;
return ch;
}
//-------------------------------------------
int GETCHE(void)
{
int ch;
ch = GETCH();
PUTCHAR(ch);
return ch;
}
//-------------------------------------------
int PUTCHAR(int cb)
{
union pw {
int i;
char ch[4];
};
register int count, tmp, i;
union pw blck;
blck.i = cb;
count = strlen(blck.ch);
if ((count == 3) && (blck.ch[0] == 0x1B)) { //Escape
*pBuffScr = savMark;
tmp = MAKEWORD(blck.ch[2], blck.ch[1]);
switch (tmp) {
case 0x5B41: //Up
if (lCount != 0) {
lCount--;
pBuffScr = pBuffScr - cTotal;
}
break;
case 0x5B42: //Down
if (lCount != lTotal -1) {
lCount++;
pBuffScr = pBuffScr + cTotal;
}
break;
case 0x5B44: //Left
if (cCount != 0) {
cCount--;
pBuffScr --;
}
break;
case 0x5B43: //Right
if (cCount != cTotal - 1) {
cCount++;
pBuffScr++;
}
break;
case 0x5B48: //Home
lCount = 0;
cCount = 0;
pBuffScr = (BYTE *)&BuffScr;
break;
case 0x5B4B: //End
*pBuffScr = ' ';
memset(pBuffScr, ' ', cTotal - cCount);
break;
}
savMark = *pBuffScr;
}
else {
for (i=0; i<count; i++) {
*pBuffScr = savMark;
switch (blck.ch[i]) {
case 0x07: //Bell - (ctrl+G)
Beep();
break;
case 0x8: //backspace - (ctrl+H /Delete)
if (cCount != 0) {
cCount--;
pBuffScr--;
}
break;
case 0x9: //Tab - (ctrl+I)
if (cCount < (cTotal - tabs)) {
tmp = tabs - cCount % tabs;
cCount = cCount + tmp;
pBuffScr = pBuffScr + tmp;
}
else {
tmp = cTotal -1 - cCount;
cCount = cTotal-1;
pBuffScr = pBuffScr + tmp;
}
break;
case 0xA: //LF - line feed (ctrl+J)
lCount++;
pBuffScr = pBuffScr + cTotal - cCount;
cCount = 0;
break;
case 0xD: //CR - carriage return (ctrl+M /Enter)
pBuffScr = pBuffScr - cCount;
cCount = 0;
break;
case 0x03: //ETX - end of text (ctrl+C)
case 0x04: //EOT - end of transmission (ctrl+D)
case 0x1A: //ctrl+Z (SUB -substitute)
default:
*pBuffScr = blck.ch[i];
pBuffScr++;
cCount++;
break;
}
savMark = *pBuffScr;
}
}
if (cCount >= cTotal) {
cCount =0;
lCount++;
}
if (lCount >= lTotal) {
memmove(&BuffScr, &BuffScr + cTotal/2, ((lTotal-1) * cTotal));
lCount=lTotal-1;
memset(&BuffScr+(lTotal-1) * cTotal/2, ' ', cTotal);
savMark = ' ';
pBuffScr = (BYTE *)&BuffScr + lCount * cTotal + cCount;
}
return cb;
}
//--------------------------------
int PRINTF(char *format, ...)
{
char buf[1440];
char *p;
int len;
va_list ptr;
va_start(ptr, format);
len = vsnprintf (buf, sizeof(buf) - 1, format, ptr);
va_end(ptr);
buf[len] = '\0';
p = buf;
for (; *p; p++) PUTCHAR(*p);
return len;
}