/Othello

Primary LanguageVHDL

Othello

Part 1: 新增功能

一,介绍

  • void DrawScore(int score, int turn), 此函数可以用来绘制黑白双方的实时得分。
  • void DrawMenu(), 此函数可以用来绘制出右侧的最基本菜单。
  • void DrawStatus(int status),此函数可以用来绘制出不同游戏模式下的代号,显示在右下角的菜单中,其中status值和模式对应关系为:
Status Game Mode 图案
0 New/Stopped 0
1 Computer-1 C1
2 Computer-2 C2
3 Computer-3 C3
4 Player-vs-Player P
  • MenuDraw.c 文件中还提供了其他的一些Draw函数,但一般不需要你们来调用,你们只要去使用最顶层的那两个函数即可。

二,使用方法

  • 要使用这两个函数,首先必须保证你使用的是最新版的 user_logic.v,并且已经编译产生了最新的bit文件。然后,将 MenuDraw.hMenuDraw.c 放入你的SDK源码工程中,然后在你的主函数所在c文件的最上部加入
import "MenuDraw.h"
  • 当你在改变Whit_numBlack_num的取值之时,都应该调用DrawScore()函数。正如我在本个项目的 lab_gobang_2.c 文件中所展示的一样,在键入enter键后:
if (RxBuffer == 0x5A) { // 0x5A这个值对应的应该是确定键,也就是enter键
				if (win_status != -1)
					return 0;
				if (board_state[x_cur][y_cur] == 4) {
					EraseLittleChess();
					DrawChess(x_cur, y_cur, turn);
					if (turn == 0) {
						White_num++;
					} else {
						Black_num++;
					}
					board_state[x_cur][y_cur] = turn;
					flip(x_cur, y_cur, turn);
					win_status = check_win();
					if (win_status != -1) { // 若有一方胜利了,本轮游戏结束
						DrawScore(White_num, 0);
						DrawScore(Black_num, 1);
						Draw_win(win_status);//画出显示胜利的棋盘形状
						//						xil_printf("\r\nPlayer %x wins!\r\n", turn + 1);
						//						return 0;

					} else {
						turn = 1 - turn; // 轮换黑白次序
						if (!FindAvailable(turn)) {//一方五子可下时换另一方下
							turn = 1 - turn;
							FindAvailable(turn);
						}
						DrawAvailable(turn);
					}
				}
				DrawScore(White_num, 0);
				DrawScore(Black_num, 1);

			}

在最下方调用了两次DrawScore(),绘制了黑白双方的分数。

  • DrawMenu()函数用于初始化右边的整个menu,在DrawMenu()函数中,我们已经调用了
DrawScore(2, 0); // 初始化显示出白棋的分数
DrawScore(2, 1); // 初始化显示出黑棋的分数

这两句,所以正如正如我在本个项目的 lab_gobang_2.c 文件中所展示的一样:

DrawBoard();
DrawChess(3, 3, 1); // 根据黑白棋的规则,初始化出几个旗子和更新board_state[][]数组
board_state[3][3] = 1;
DrawChess(3, 4, 0);
board_state[3][4] = 0;
DrawChess(4, 3, 0);
board_state[4][3] = 0;
DrawChess(4, 4, 1);
board_state[4][4] = 1;
Black_num = 2;
White_num = 2;
FindAvailable(turn);
DrawAvailable(turn);
DrawChess(x_cur, y_cur, 3); // 画出初始的旗子所在处的颜色,其中3这个参数代表的颜色应该是移动的光标的颜色
DrawMenu();

在初始化整个界面的最后,加上了DrawMenu()初始化右边Menu的操作,便可以了。

  • 根据传入的status值不同,DrawStatus()函数可在右下方Menu中绘制出不同的Game Mode Figure。举个例子,在 lab_gobang_2.c 中,在进入主循环之前,我们也使用了这个函数:
int boardStatus = 4;
DrawStatus(boardStatus);
while (1) { // 进入了主循环之中,游戏开始!

因为本个项目中的程序为人人对战,所以此处将status值设为4,传入DrawStatus()函数中,并绘制出相应图形。
所以说,在实际操作中,每当你要切换模式的时候,可以调用一下这个函数,便可以将之前的模式图形抹掉,并绘制出新模式的图形。

Part 2: BUG修正

void EraseCursor(int x_pos, int y_pos, int turn) {
	if (turn == 1 && board_state[x_pos][y_pos] == 4)
		DrawChess(x_pos, y_pos, 5);
	else
		DrawChess(x_pos, y_pos, board_state[x_pos][y_pos]);
}

这样在光标移动过之后,不会把黑色小圆点还原成白色小圆点。
(之前的话,因为在Draw黑色小圆点的时候,board_state[][]数组在那一点的取值仍为4,在EraseCursor()经过后会被还原成白色小圆点。)