⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 renjumain.c

📁 嵌入式linux下面五子棋游戏代码
💻 C
📖 第 1 页 / 共 2 页
字号:
//---------- DO NOT EDIT or MOVE THIS LINE: added by calog at Mon Aug 09 15:57:09 2004
	//added by calog
//uncoment the following line to close call log	//added by calog
//define NO_CALOG	//added by calog
#include "calog.h"	//added by calog
/*
 * Copyright (c) 2003,2004 Jing Cheng Tong Wireless Technology (ShenZhen) Ltd.
 * All rights reserved.
 * 
 * Filename: RenjuMain.c
 * Description: <FIXME>
 * 
 * Author: Liu Zhi <Zhi.LIU@JCTMobile.COM>
 * Department: R&D Center, JCTCD
 * Creation: <UNKNOWN>
 *
 * History:  2004/05/26,YZB  add copyright and file header.
 *           2004/05/26,XXX  
 */

/* $Id: RenjuMain.c,v 1.26 2004/09/01 06:17:52 hulei Exp $ */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "jctime.h"
#include "resource.h"
#include "message.h"
#include "Renju.h"
#include "smtPublic.h"

#define   RENJU_TEXT_COLOR		COLOR_BLACK  //定义文本颜色 

#define   IDC_CTRL1				0x1001

#define   ID_LEVEL_1			0x1030
#define   ID_LEVEL_2			0x1031
#define   ID_LEVEL_3			0x1032
#define   ID_LEVEL_4			0x1033

#define   ID_NEW_AGAIN			0x1034
#define   ID_MAN_GO 			0x1035
#define   ID_MACHINE_GO			0x1036
#define   ID_RENJU_EXIT			0x1038


#define   MSG_MACHINE_GO		0x1010
#define   MSG_CHESS_END			0x1011
 
#define   X_OFF                 21    // 棋盘起点 X 坐标 
#define   Y_OFF                 88    // 棋盘起点 Y 坐标  
#define	  GRID_WIDTH            18    // 棋盘栅格宽度 
#define	  GRID_HEIGHT  		  	18    // 棋盘栅格高度 
#define	  CHESS_SIZE  		  	16     // 棋子大小     

#define  CHESS_AREA             16    //以棋子为中心的正方形的半径 //aj
#define  TEXT_HEIGHT            56    //定义棋盘上方文本的高度 //aj

#define  SCREEN_X  240   //aj 
#define  SCREEN_Y  320   //aj

char *level_str[8];

extern const unsigned char chess_white[];
extern const unsigned char chess_black[];
extern const unsigned char cursor_white[];
extern const unsigned char cursor_black[];
extern const unsigned char win_white[];
extern const unsigned char win_black[];
extern const unsigned char renju_resmain[];

extern unsigned char  global_who_go;
extern unsigned char  global_game_level;
extern unsigned char  global_game_step;
extern CHESS_POINT lineChessman[5];


CHESS_POINT currpoint;
T_GUI_Bitmap *chessbmp[10];
T_GUI_Bitmap BitmapRenjuMain;

extern CHESS_OBJECT  *chess_object;

unsigned char *copyrect = NULL, *saverect = NULL;
unsigned char *copychessboard = NULL;

static int speed = 0.5 * GUI_TIMER_FACTOR; //可能是棋子移动的速度,或者是难度

T_WORD cursor = FALSE;

T_GUI_HMENU menuMain;

extern T_WORD fnGAME_MessageBox (T_GUI_HWND hParentWnd, T_CONST T_BYTE* pszText,
                      T_CONST T_BYTE* pszCaption, T_UWORD dwStyle);

void Renju_CreatPopMenu(T_GUI_HWND hWnd)
{
	CALOG_ENT();	//added by calog

    T_GUI_MenuItemInfo mii;
	
    memset (&mii, 0, sizeof(T_GUI_MenuItemInfo));
    mii.type        = 0;
    mii.id          = 0;
    mii.TypeData    = (T_UWORD)"功能";
    menuMain = fnGUI_CreatePopupMenu (&mii);//创建弹出式菜单。输入参数pmii:弹出式菜单所依附的菜单项目信息结构


    mii.type        = 0;
    mii.state       = 0;
    mii.id          = ID_NEW_AGAIN;
    mii.TypeData    = (T_UWORD)W1401005;	//新游戏
    fnGUI_InsertMenuItem(menuMain, 1, TRUE, &mii);  //函数说明 在指定索引(或ID)的菜单项目后添加新的项目
 //输入参数 hmnu:被添加项目的菜单句柄;item:指定的索引或(ID);
 //flag:项目添加的方式标志,为TRUE则按索引添加,为FALSE,则按ID添加;pmii:新添加的项目信息结构指针。


    
    mii.type        = 0;
    mii.state       = 0;
    mii.id          = ID_LEVEL_1;
    mii.TypeData    = (T_UWORD)W1401001;	//初级
    fnGUI_InsertMenuItem(menuMain, 2, TRUE, &mii);

    mii.type        = 0 ;
    mii.state       = 0;
    mii.id          = ID_LEVEL_2;
    mii.TypeData    = (T_UWORD)W1401002;	//中级
    fnGUI_InsertMenuItem(menuMain, 3, TRUE, &mii);

    mii.type        = 0 ;
    mii.state       = 0;
    mii.id          = ID_LEVEL_3;
    mii.TypeData    = (T_UWORD)W1401003;	//高级
    fnGUI_InsertMenuItem(menuMain, 4, TRUE, &mii);

    mii.type        = 0 ;
    mii.state       = 0;
    mii.id          = ID_LEVEL_4;
    mii.TypeData    = (T_UWORD)W1401004;	//特级
    fnGUI_InsertMenuItem(menuMain, 5, TRUE, &mii);

    mii.type        = 0 ;
    mii.state       = 0;
    mii.id          = ID_MAN_GO;
    mii.TypeData    = (T_UWORD)W1401006;	//人先走
    fnGUI_InsertMenuItem(menuMain, 6, TRUE, &mii);

    mii.type        = 0 ;
    mii.state       = 0;
    mii.id          = ID_MACHINE_GO;
    mii.TypeData    = (T_UWORD)W1401007;	//机先走
    fnGUI_InsertMenuItem(menuMain, 7, TRUE, &mii);

    mii.type        = 0 ;
    mii.state       = 0;
    mii.id          = ID_RENJU_EXIT;
    mii.TypeData    = (T_UWORD)W1303003;	//退出
    fnGUI_InsertMenuItem(menuMain, 8, TRUE, &mii);


	return;	//added by calog
}


void Renju_DisplayString(T_GUI_HWND hWnd,T_WORD x, T_WORD y,unsigned char *buffer,T_WORD color)
{
	CALOG_ENT();	//added by calog

    T_GUI_HDC hdc;
	int i;

	i = strlen(buffer) * 6;  //aj
    hdc = fnGUI_GetClientDC (hWnd);
    
	fnGUI_SetTextColor(hdc, color);

	fnGUI_FillBoxWithBitmapPart(hdc, x, y, i, 12, 0, 0, &BitmapRenjuMain, x, y);//aj


	fnGUI_SetBkMode(hdc, BM_TRANSPARENT);
    fnGUI_TextOut (hdc, x, y, buffer);
	fnGUI_UpdateWindow(hWnd,0);
    fnGUI_ReleaseDC (hdc);
	

	return;	//added by calog
}



void Renju_DrawRenjuBoard(T_GUI_HWND hWnd)
{
	CALOG_ENT();	//added by calog

    T_GUI_HDC hdc;
    T_WORD i;
	T_WORD ret;

    hdc = fnGUI_GetClientDC (hWnd);

	//fnGUI_FillBoxWithBitmap(hdc,X_OFF,Y_OFF,128-2*X_OFF,160-Y_OFF, &Bitmap);

	//fnGUI_SetBkMode(hdc, BM_TRANSPARENT);
    //fnGUI_TextOut(hdc, 20, 7, "-= 五 子 棋 =-");
	
    // 画边框
	fnGUI_SetPenColor (hdc, fnGUI_RGB2Pixel(hdc, 254, 237, 157));
	fnGUI_Rectangle(hdc, X_OFF-8, Y_OFF-8, X_OFF+((CHESS_LEN_X-1)*GRID_WIDTH)+8, Y_OFF+((CHESS_LEN_Y-1)*GRID_HEIGHT)+8);
	fnGUI_Rectangle(hdc, X_OFF, Y_OFF, X_OFF+((CHESS_LEN_X-1)*GRID_WIDTH), Y_OFF+((CHESS_LEN_Y-1)*GRID_HEIGHT));

	
	// 画棋格
	for (i=1; i<CHESS_LEN_X; i++)
	{
		fnGUI_Rectangle(hdc, X_OFF, Y_OFF+i*GRID_HEIGHT , X_OFF+(CHESS_LEN_X-1)*GRID_WIDTH, Y_OFF+i*GRID_HEIGHT);
		fnGUI_Rectangle(hdc, X_OFF+i*GRID_WIDTH, Y_OFF , X_OFF+i*GRID_WIDTH, Y_OFF+(CHESS_LEN_Y-1)*GRID_HEIGHT);
	
	}

	
    fnGUI_ReleaseDC (hdc);

	return;	//added by calog
}

void Renju_DisplayWhoGo(T_GUI_HWND hWnd,T_WORD x, T_WORD y)
{
	CALOG_ENT();	//added by calog

	unsigned char buffer[10];

	if (global_who_go < MAN) return;

	if (global_who_go == MAN)
		sprintf (buffer, W1401006);	//人先走
	if (global_who_go == MACHINE)
		sprintf (buffer, W1401007);	//机先走
	
	Renju_DisplayString(hWnd,x,y,buffer,RENJU_TEXT_COLOR);

	return;	//added by calog
}


void Renju_DisplayLevelTitle(T_GUI_HWND hWnd,T_WORD x, T_WORD y)
{
	CALOG_ENT();	//added by calog

	char buf[100];
	
	sprintf (buf, "%s:", W1401009);	//级别	
	Renju_DisplayString(hWnd,x,y,buf,RENJU_TEXT_COLOR);

	return;	//added by calog
}

void Renju_DisplayStepTitle(T_GUI_HWND hWnd,T_WORD x, T_WORD y)
{
	CALOG_ENT();	//added by calog

	char buf[100];
	
	sprintf (buf, "%s:", W1401010);	//步
	Renju_DisplayString(hWnd,x,y,buf,RENJU_TEXT_COLOR);

	return;	//added by calog
}


void Renju_DisplayLevel(T_GUI_HWND hWnd,T_WORD x, T_WORD y, T_WORD level)
{
	CALOG_ENT();	//added by calog

	unsigned char buffer[10];
	unsigned char *ptr;

	if (level < INIT_LEVEL) level = INIT_LEVEL;
	if (level > MAX_LEVEL) level = MAX_LEVEL;

	ptr = &level_str[level-1][0];
	sprintf (buffer, "%s", ptr);

	Renju_DisplayString(hWnd,x,y,buffer,RENJU_TEXT_COLOR);
	

	return;	//added by calog
}


void Renju_DisplayStep(T_GUI_HWND hWnd,T_WORD x, T_WORD y,T_WORD step)
{
	CALOG_ENT();	//added by calog

	unsigned char buffer[10];

	sprintf (buffer, "%d", global_game_step);

	Renju_DisplayString(hWnd,x,y,buffer,RENJU_TEXT_COLOR);
	

	return;	//added by calog
}


void Renju_DrawChessMan(T_GUI_HWND hWnd,T_WORD x,T_WORD y,T_WORD chessattr)//这个函数主要是用来画棋子,以及闪动光标
{
	CALOG_ENT();	//added by calog

    T_GUI_HDC hdc;

	hdc = fnGUI_BeginPaint(hWnd);

	if (chessattr >= 0 && chessattr <= 5)
		fnGUI_FillBoxWithBitmap(hdc,
			X_OFF+GRID_WIDTH*x-CHESS_SIZE/2, Y_OFF+GRID_HEIGHT*y-CHESS_SIZE/2, 
			CHESS_AREA, CHESS_AREA, chessbmp[chessattr]);

	else
	{
		fnGUI_FillBoxWithBitmapPart(hdc, 
			X_OFF+GRID_WIDTH*x-CHESS_SIZE/2, Y_OFF+GRID_HEIGHT*y-CHESS_SIZE/2,
			CHESS_AREA, CHESS_AREA, 0, 0, &BitmapRenjuMain,
			X_OFF+GRID_WIDTH*x-CHESS_SIZE/2, Y_OFF+GRID_HEIGHT*y-CHESS_SIZE/2);

		fnGUI_SetPenColor (hdc, fnGUI_RGB2Pixel(hdc, 254, 237, 157));
		fnGUI_MoveTo (hdc, X_OFF+GRID_WIDTH*x-CHESS_SIZE/2 + 4, Y_OFF+GRID_HEIGHT*y-CHESS_SIZE/2);
		fnGUI_LineTo (hdc, X_OFF+GRID_WIDTH*x-CHESS_SIZE/2 + 4, Y_OFF+GRID_HEIGHT*y-CHESS_SIZE/2 + 8);
		fnGUI_MoveTo (hdc, X_OFF+GRID_WIDTH*x-CHESS_SIZE/2, Y_OFF+GRID_HEIGHT*y-CHESS_SIZE/2 + 4);
		fnGUI_LineTo (hdc, X_OFF+GRID_WIDTH*x-CHESS_SIZE/2 + 8, Y_OFF+GRID_HEIGHT*y-CHESS_SIZE/2 + 4);
	}

	fnGUI_EndPaint(hWnd,hdc);
	fnGUI_UpdateWindow(hWnd,0);

	return;	//added by calog
}


void Renju_DrawWinLineChessMan(T_GUI_HWND hWnd,T_WORD chessattr)  //主要用来调用上面的函数
{
	CALOG_ENT();	//added by calog

 	T_WORD i;

	for (i=0; i<5; i++)
		Renju_DrawChessMan(hWnd,
			lineChessman[i].x, lineChessman[i].y,
			chessattr);  


	return;	//added by calog
}


void Renju_StarNewGame(T_GUI_HWND hWnd)
{
	CALOG_ENT();	//added by calog

	fnGUI_PutSavedBoxOnScreen(0,0,SCREEN_X,SCREEN_Y,copychessboard);//copychessboard缓存地址

	Renju_InitChess();
	Renju_DisplayWhoGo(hWnd,15,TEXT_HEIGHT);  //aj
	Renju_DisplayLevel(hWnd,55,TEXT_HEIGHT,global_game_level);  //aj
	Renju_DisplayStepTitle(hWnd,83,TEXT_HEIGHT);//aj
	Renju_DisplayStep(hWnd,103,TEXT_HEIGHT,global_game_step);//aj
	if (global_who_go == MACHINE)
		fnGUI_SendMessage(hWnd, MSG_MACHINE_GO, 0, 0);
	else
	{
		currpoint.x = 6;
		currpoint.y = 6;
		if (copyrect != NULL)
			GUI_Free (copyrect);
		copyrect = fnGUI_SaveCoveredScreenBox(X_OFF+GRID_WIDTH*currpoint.x-CHESS_SIZE/2,Y_OFF+GRID_HEIGHT*currpoint.y-CHESS_SIZE/2,CHESS_AREA,CHESS_AREA);//aj
		fnGUI_SetTimer (hWnd, 11, speed);
	}


	return;	//added by calog
}


void Renju_LoadChessManBitmap(T_GUI_HWND hWnd)
{
	CALOG_ENT();	//added by calog

    T_GUI_HDC hdc;
 	T_WORD ret;
	T_MODULE T_GUI_Bitmap	bmp_chess_black,
							bmp_chess_white,
							bmp_cursor_black,
							bmp_cursor_white,
							bmp_win_black,
							bmp_win_white;

	hdc = fnGUI_GetClientDC(hWnd);
	ret = fnGUI_LoadBitmapFromBmpMemory(hdc,&bmp_chess_black,chess_black);
	ret = fnGUI_LoadBitmapFromBmpMemory(hdc,&bmp_chess_white,chess_white);
	ret = fnGUI_LoadBitmapFromBmpMemory(hdc,&bmp_cursor_black,cursor_black);
	ret = fnGUI_LoadBitmapFromBmpMemory(hdc,&bmp_cursor_white,cursor_white);
	ret = fnGUI_LoadBitmapFromBmpMemory(hdc,&bmp_win_black,win_black);
	ret = fnGUI_LoadBitmapFromBmpMemory(hdc,&bmp_win_white,win_white);
	fnGUI_LoadBitmapFromBmpMemory(hdc, &BitmapRenjuMain, renju_resmain);
	
	fnGUI_FillBoxWithBitmap(hdc, 0, 0, SCREEN_X, SCREEN_Y, &BitmapRenjuMain);

	fnGUI_ReleaseDC(hdc);

	chessbmp[0] = &bmp_chess_black;
	chessbmp[1] = &bmp_cursor_white;
	chessbmp[2] = &bmp_cursor_black;
	chessbmp[3] = &bmp_chess_white;//bmp_cursor_white;
	chessbmp[4] = &bmp_win_black;
	chessbmp[5] = &bmp_win_white;//bmp_cursor_white;
	
	for (ret=1; ret<5; ret++)
#ifdef EMBED
		chessbmp[ret]->uwTransparent = 0xff;
#else
		chessbmp[ret]->uwTransparent = 0xffff;
#endif

	ret = fnGUI_RGB2Pixel(hdc, 124, 94, 44);
	chessbmp[0]->uwTransparent = ret;
	chessbmp[3]->uwTransparent = ret;

	return;	//added by calog
}


void Renju_UnloadChessManBitmap()
{
	CALOG_ENT();	//added by calog

	int i;

	for (i = 0; i < 6; i++)
		//if (i != 3)
			fnGUI_UnLoadBitmap(chessbmp[i]);
	fnGUI_UnLoadBitmap(&BitmapRenjuMain);

	return;	//added by calog
}


T_WORD Renju_ControlWinProc(T_GUI_HWND hWnd, T_WORD message, T_GUI_WPARAM wParam, T_GUI_LPARAM lParam)
{
	CALOG_ENT();	//added by calog

    //T_GUI_Rect client_rect;
    T_BYTE buffer [100];

	T_WORD id   = GUI_LOUHWORD(wParam);
	T_WORD code = GUI_HIUHWORD(wParam);
 	T_WORD ret;
 	int whowin;
	T_WORD pos;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -