中国象棋的编程设计
- 格式:pdf
- 大小:186.32 KB
- 文档页数:2
中国象棋程序课程设计一、课程目标知识目标:1. 学生能够理解中国象棋的基本规则,掌握棋谱的阅读和编写方法。
2. 学生能够描述中国象棋程序的编程思路和算法,了解其运作原理。
3. 学生能够运用所学知识,分析和优化中国象棋程序的性能。
技能目标:1. 学生能够运用编程语言,独立编写一个简单的中国象棋程序。
2. 学生能够通过调试和修改程序,提高程序的稳定性和棋力。
3. 学生能够运用逻辑思维和问题分析能力,解决中国象棋程序中出现的问题。
情感态度价值观目标:1. 学生培养对中国传统文化的热爱,增强民族自豪感。
2. 学生通过团队协作和交流,培养合作精神和沟通能力。
3. 学生在面对挑战时,保持积极的心态,勇于尝试和克服困难。
课程性质:本课程为信息技术与传统文化相结合的课程,旨在培养学生的编程能力、逻辑思维和问题解决能力。
学生特点:初中生,具有一定的信息技术基础,对中国象棋有一定的了解,好奇心强,喜欢探索和挑战。
教学要求:结合学生特点,注重理论与实践相结合,强调学生的动手实践和创新能力,提高学生的综合素质。
通过本课程的学习,使学生能够将所学知识应用于实际编程中,培养他们对中国传统文化的兴趣和热爱。
同时,关注学生的学习过程,将课程目标分解为具体的学习成果,便于教学设计和评估。
二、教学内容1. 中国象棋基本规则及棋谱阅读:讲解中国象棋的历史、棋盘布局、棋子走法及胜负判定方法,使学生了解并掌握棋谱的阅读和编写。
教学内容安排:教材第1章“中国象棋概述”2. 编程基础及中国象棋程序设计思路:介绍编程基础知识,如变量、循环、条件判断等,并讲解中国象棋程序的编程思路和算法。
教学内容安排:教材第2章“编程基础”和第3章“中国象棋程序设计”3. 中国象棋程序编写与调试:指导学生运用所学编程知识,编写简单的中国象棋程序,并通过调试和修改,提高程序的稳定性和棋力。
教学内容安排:教材第4章“程序编写与调试”4. 程序优化与性能分析:教授学生如何分析程序性能,介绍优化方法,使学生在实践中提高中国象棋程序的棋力。
中国象棋python代码下面是一个简单的中国象棋的Python 代码示例:# 定义棋盘# 绘制棋盘def draw_board():for row in chessboard:for piece in row:print(piece, end=' ')print()# 判断是否在棋盘内def is_valid_move(x, y):return 0 <= x < 9 and 0 <= y < 10# 判断移动是否合法def is_valid_move(x1, y1, x2, y2):piece = chessboard[y1][x1]target = chessboard[y2][x2]if piece == ' ':return Falseif piece == '車' or piece == '車':if x1 != x2 and y1 != y2:return Falseif x1 == x2:min_y, max_y = (y1, y2) if y1 < y2 else (y2, y1)for y in range(min_y + 1, max_y):if chessboard[y][x1] != ' ':return Falseif y1 == y2:min_x, max_x = (x1, x2) if x1 < x2 else (x2, x1)for x in range(min_x + 1, max_x):if chessboard[y1][x] != ' ':return Falseif piece == '馬' or piece == '馬':dx = abs(x2 - x1)dy = abs(y2 - y1)if (dx == 1 and dy == 2) or (dx == 2 and dy == 1): return Truereturn Falseif piece == '象' or piece == '相':if y2 > 4 and (y2 - y1) % 2 != 0:return Falseif abs(x2 - x1) != 2 or abs(y2 - y1) != 2:return Falseif chessboard[(y1 + y2) // 2][(x1 + x2) // 2] != ' ': return Falseif piece == '士' or piece == '士':if x2 < 3 or x2 > 5:return Falseif y2 < 7 or y2 > 9:return Falseif abs(x2 - x1) != 1 or abs(y2 - y1) != 1: return Falseif piece == '帥' or piece == '将':if x2 < 3 or x2 > 5:return Falseif y2 < 0 or y2 > 2:return Falseif abs(x2 - x1) + abs(y2 - y1) != 1:return Falseif piece == '兵':if y1 < 5 and y2 != y1 - 1:return Falseif y1 >= 5 and (x1 != x2 or y2 != y1 - 1):return Falseif piece == '卒':if y1 > 4 and y2 != y1 + 1:return Falseif y1 <= 4 and (x1 != x2 or y2 != y1 + 1):return Falseif target == '帥' or target == '将':if piece == '卒' or piece == '兵':if y2 > 2:return Falseif piece == '兵' or piece == '卒':if y2 < 7:return Falsereturn True# 移动棋子def move_piece(x1, y1, x2, y2):if is_valid_move(x1, y1, x2, y2):piece = chessboard[y1][x1]chessboard[y2][x2] = piecechessboard[y1][x1] = ' 'else:print("Invalid move!")# 游戏循环def game_loop():while True:draw_board()player_input = input("请输入移动的起始位置和目标位置,以逗号分隔(例如:2,1,2,3):")positions = player_input.split(',')if len(positions) != 4:print("请输入正确的起始位置和目标位置!")continuex1, y1, x2, y2 = map(int, positions)if not is_valid_move(x1, y1) or not is_valid_move(x2, y2):print("请输入正确的起始位置和目标位置!")continuemove_piece(x1, y1, x2, y2)# 启动游戏game_loop()这是一个简单的中国象棋游戏代码示例,包括棋盘的绘制、棋子移动的判断和执行等功能。
中国象棋课程设计java一、课程目标知识目标:1. 掌握中国象棋的基本规则,如棋子的种类、走法、胜负判定等;2. 学会使用Java语言实现中国象棋的基本功能,如棋盘的绘制、棋子的移动、胜负判断等;3. 了解中国象棋的文化背景和起源,提高对传统文化的认识。
技能目标:1. 培养学生的编程能力,使其能够运用Java语言解决实际问题;2. 提高学生的逻辑思维能力,通过编写代码实现中国象棋的规则;3. 培养学生的团队协作和沟通能力,分组合作完成中国象棋程序的编写。
情感态度价值观目标:1. 培养学生对传统文化的热爱,增强民族自豪感;2. 培养学生勇于挑战、克服困难的意志品质,提高自信心;3. 培养学生遵守规则的意识,养成良好的竞技态度。
课程性质:本课程结合了传统文化、编程语言和逻辑思维,旨在提高学生的综合素质。
学生特点:学生处于中学阶段,具有一定的逻辑思维能力和编程基础,对中国象棋有一定了解。
教学要求:注重实践操作,引导学生运用所学知识解决问题,培养学生团队协作能力和创新精神。
将课程目标分解为具体的学习成果,以便在教学过程中进行有效评估和调整。
二、教学内容1. 中国象棋基础知识:介绍中国象棋的起源、发展历程、棋盘结构、棋子种类及走法等,让学生全面了解中国象棋的基本构成。
相关教材章节:第一章《中国象棋概述》2. Java编程基础:回顾Java语言的基本语法、数据类型、控制结构、面向对象编程等知识,为后续编写中国象棋程序打下基础。
相关教材章节:第二章《Java语言基础》3. 棋盘绘制:学习Java图形用户界面(GUI)编程,掌握如何使用Java绘制中国象棋棋盘。
相关教材章节:第三章《Java图形用户界面编程》4. 棋子移动与规则实现:学习如何使用Java实现棋子的移动、判断胜负等规则。
相关教材章节:第四章《Java事件处理》和第五章《Java多线程编程》5. 中国象棋程序设计:分组合作,综合运用所学知识,编写具有基本功能的中国象棋程序。
象棋程序设计1.课程设计目的Java语言是当今流行的网络编程语言,它具有面向对象、跨平台、分布应用等特点。
面向对象的开发方法是当今世界最流行的开发方法,它不仅具有更贴近自然的语义,而且有利于软件的维护和继承,很好的融合了“面向对象”、“跨平台”和“编程简洁”等特性。
随着Java语言的不断发展,它的应用前景将更为宽阔。
本课程设计主要是使用Swing这个Java自带的图形开发工具实现中国象棋棋子及棋盘的绘制,并根据相应的象棋规则,实现在电脑上虚拟出可以供两个人对弈的象棋游戏,从而达到了进一步巩固课堂上所学到的知识,深刻把握Java语言的重要概念及其面向对象的特性,熟练的应用面向对象的思想和设计方法解决实际问题的能力的目的。
2.设计方案论证2.1程序功能象棋是中国一种流传十分广泛的游戏。
下棋双方根据自己对棋局形式的理解和对棋艺规律的掌握,调动车马,组织兵力,协调作战在棋盘--这块特定的战场上进行着象征性的军事战斗。
本程序的功能就是将棋盘和棋子在电脑上模拟出来,双方可以通过鼠标对己方棋子的操作进行对弈。
2.2设计思路象棋,人人会走,把己方的棋子按不同棋子的规则放在棋盘合适的位置上。
象棋包含三个要素:棋盘、棋子和规则。
在本象棋程序的设计上,也大致遵循这三个要素,但是细化为四个方面:棋盘、棋盘上可以走棋的落子点、棋子和象棋规则。
棋盘其实就是一张棋盘的图形,我们要在计算机上的棋盘上落子并不像在现实生活中那么容易,这里说的棋盘充其量只是背景,真正落子的地方必须是我们在图形界面上设定的落子点,不同棋子只能按照各自的规则在这些设定的位置上摆放、搏杀。
2.3设计方法根据前面的细化,程序中分别设计了四个类对应棋盘、落子点、棋子和象棋规则这四个方面。
四个类几乎包括了程序的全部,程序框图如下图所示:图1 程序功能框图2.4详细设计 2.4.1棋子类ChessSwing 中并没有棋子这个组建类,所以我们必须设计一个组件,棋子其实就是圆形 的JLabel ,但Swing 中的JLabel 组件是方形的,没关系,利用JLabel 我们可以创建 圆形的JLabel 组件——Chess 。
java课程设计中国象棋一、课程目标知识目标:1. 让学生掌握中国象棋的基本规则和棋谱表示方法。
2. 帮助学生理解面向对象编程的基本概念,如类、对象、继承、封装等。
3. 引导学生运用Java语言实现中国象棋的基本功能,包括棋子的移动、胜负判断等。
技能目标:1. 培养学生运用Java编写程序解决问题的能力,提高编程技巧。
2. 培养学生对中国象棋的逻辑思考和策略运用能力。
3. 培养学生团队协作、沟通表达的能力,共同完成课程设计任务。
情感态度价值观目标:1. 激发学生对计算机编程和中国象棋的兴趣,提高学习积极性。
2. 培养学生勇于尝试、不断探索的精神,面对困难和挑战时不轻言放弃。
3. 增强学生的民族自豪感,传承和弘扬中华优秀传统文化。
课程性质分析:本课程为Java程序设计课程,结合中国象棋项目,旨在让学生在实践中掌握编程技能,提高解决问题的能力。
学生特点分析:学生处于高中年级,具备一定的编程基础和逻辑思维能力,对中国象棋有一定了解,具备较强的学习能力和团队合作精神。
教学要求:1. 教师应注重理论与实践相结合,引导学生运用所学知识解决实际问题。
2. 关注学生的个体差异,给予个性化指导,提高学生的编程能力。
3. 创设互动、讨论的学习氛围,培养学生的团队协作能力和创新精神。
4. 对课程目标进行分解,明确具体的学习成果,便于教学设计和评估。
二、教学内容1. 中国象棋基本规则及棋谱表示方法- 中国象棋的棋盘、棋子及其走法- 棋谱的记录和表示方式2. 面向对象编程基本概念- 类的定义、对象创建、属性和方法- 继承、封装、多态等特性3. Java编程基础- Java基本语法、数据类型、运算符- 控制结构、数组、字符串等4. 中国象棋程序设计- 设计棋盘类、棋子类、游戏规则类- 实现棋子的移动、胜负判断等功能5. 教学大纲与进度安排- 第一周:中国象棋基本规则及棋谱表示方法学习- 第二周:面向对象编程基本概念复习- 第三周:Java编程基础复习及实践- 第四周:设计棋盘类、棋子类、游戏规则类- 第五周:实现棋子的移动、胜负判断等功能- 第六周:课程设计总结、展示与评价教材章节关联:1. 《Java程序设计》第1-3章:Java基本语法、数据类型、运算符2. 《Java程序设计》第4-6章:面向对象编程基本概念3. 《中国象棋入门与提高》:中国象棋基本规则及棋谱表示方法教学内容组织:以项目为导向,将中国象棋与Java编程知识相结合,分阶段进行教学,逐步实现课程目标。
象棋游戏编程实现象棋游戏是一种古老而受欢迎的策略棋类游戏。
通过编程实现象棋游戏,我们可以让玩家在电脑上享受这种传统游戏的乐趣。
本文将介绍象棋游戏的编程实现过程,包括游戏规则设计、游戏界面设计以及基本功能的实现。
一、游戏规则设计象棋游戏的规则非常复杂,但是通过合理的设计,我们可以简化实现过程。
首先,我们需要确定游戏的棋盘大小和棋子种类。
一般来说,象棋棋盘是一个8×8的方格,棋子包括帅、仕、相、马、车、炮和兵。
其次,我们需要定义每种棋子的移动规则,例如车可以横向、纵向移动任意步数,而相只能沿着斜线移动。
最后,我们需要规定胜利条件,例如帅被吃掉即为输局。
二、游戏界面设计游戏界面是玩家与游戏进行交互的重要部分。
为了使界面整洁美观,我们可以采用图形化的设计方式。
可以使用图像资源来绘制棋盘和棋子,同时添加一些美观的元素,如背景图片和音效。
此外,还可以添加一些用户友好的功能,如悔棋和提示。
三、基本功能的实现实现象棋游戏的基本功能有以下几个方面:1. 棋盘初始化:在游戏开始时,需要将棋盘上的棋子按照规则放置好,以便游戏开始。
2. 棋子移动:玩家通过鼠标点击棋子来选择要移动的棋子,然后再点击目标位置来进行移动,移动过程需要判断是否符合规则。
3. 吃子判断:在棋子移动的过程中,需要判断是否有其他棋子被吃掉,如果有则需要将其移除棋盘。
4. 胜负判断:游戏进行中,需要判断胜利条件是否满足,如果满足则宣布游戏结束。
5. 其他功能:为了增加游戏的趣味性和可玩性,可以添加一些额外功能,如悔棋、提示、保存和读取游戏进度等。
四、代码实现通过选取合适的编程语言和开发工具,我们可以开始实现象棋游戏的编程部分。
在代码中需要定义棋盘和棋子的数据结构,以及实现棋子移动、胜负判断等功能的算法。
同时,通过合理的设计和模块化编程的方式,可以提高代码的可读性和可维护性。
总结:通过上述步骤,我们可以实现一个简单且具有基本功能的象棋游戏。
当然,在实际的开发过程中,还可以根据需求添加更多的功能和优化设计。
funcode课程设计中国象棋一、课程目标知识目标:1. 学生能理解中国象棋的基本规则,掌握棋子的走法和特殊规则。
2. 学生能了解中国象棋的历史起源和发展,理解其在中国文化中的地位。
3. 学生能运用funcode编程软件,编写简单的中国象棋游戏程序。
技能目标:1. 学生通过funcode编程,培养逻辑思维和问题解决能力。
2. 学生能运用所学知识,设计并实现具有基本功能的中国象棋游戏。
3. 学生在团队协作中,提高沟通能力和协作技巧。
情感态度价值观目标:1. 学生培养对中国传统文化的兴趣,增强民族自豪感。
2. 学生在编程过程中,培养耐心和细心的品质,提高面对困难的勇气。
3. 学生通过团队协作,学会尊重他人,培养公平竞争的意识。
课程性质:本课程为信息技术与学科融合的实践课程,旨在通过编程软件funcode,结合中国象棋的学科知识,培养学生的编程能力和跨学科素养。
学生特点:六年级学生具备一定的信息技术基础,对中国象棋有一定了解,好奇心强,喜欢动手实践。
教学要求:课程要求教师以学生为主体,关注个体差异,激发学生兴趣,引导他们主动探索,注重实践操作和团队协作能力的培养。
通过课程学习,使学生在知识与技能、过程与方法、情感态度价值观等方面得到全面提升。
二、教学内容1. 中国象棋基础知识:- 棋盘结构及棋子的摆放- 棋子的走法、吃子规则- 基本术语和战术简介2. 中国象棋历史与文化:- 象棋的起源和发展- 象棋与中华文化的联系- 象棋的竞技与娱乐价值3. funcode编程基础:- funcode软件界面与功能介绍- 编程语言基本语法- 控制结构(顺序、循环、条件)4. 中国象棋游戏编程:- 设计游戏界面和棋盘布局- 编写棋子的走法和规则- 实现简单的胜负判断功能教学大纲安排:第一课时:中国象棋基础知识学习,介绍棋盘和棋子,讲解走法和规则。
第二课时:了解中国象棋的历史与文化,激发学生对传统文化的兴趣。
第三课时:funcode编程基础教学,熟悉软件操作和基本编程语法。
c语言课程设计中国象棋一、教学目标本课程的教学目标是使学生掌握C语言的基本语法和编程技巧,通过中国象棋项目的实践,培养学生运用C语言解决实际问题的能力。
具体目标如下:1.知识目标:–掌握C语言的基本数据类型、运算符、控制结构。
–理解函数的定义和调用。
–学习常用的数据结构和算法,如数组、链表、排序等。
2.技能目标:–能够运用C语言编写简单的程序。
–学会使用调试工具,如GDB,进行程序调试。
–能够独立或合作完成中国象棋项目的开发。
3.情感态度价值观目标:–培养学生的团队合作意识和沟通能力。
–培养学生解决问题、克服困难的决心和勇气。
–培养学生对编程和中国象棋的兴趣和热情。
二、教学内容教学内容将围绕C语言的基本语法、数据结构、算法和中国象棋项目展开。
具体安排如下:1.C语言基本语法:–数据类型、变量和运算符。
–控制结构:条件语句、循环语句。
–函数的定义和调用。
2.数据结构与算法:–数组、链表的基本操作。
–排序算法:冒泡排序、选择排序、插入排序等。
–查找算法:顺序查找、二分查找等。
3.中国象棋项目实践:–中国象棋规则的介绍。
–项目需求分析和设计。
–项目实施和调试。
三、教学方法本课程将采用讲授法、案例分析法、实验法等多种教学方法,以激发学生的学习兴趣和主动性。
1.讲授法:用于讲解C语言的基本语法、数据结构和算法。
2.案例分析法:通过分析典型的中国象棋项目案例,引导学生运用C语言解决实际问题。
3.实验法:让学生亲自动手编写代码、调试程序,提高实际操作能力。
四、教学资源教学资源包括教材、参考书、多媒体资料和实验设备。
1.教材:《C程序设计语言》(K&R)、《C Primer Plus》等。
2.参考书:《数据结构与算法分析:C语言描述》、《算法导论》等。
3.多媒体资料:教学PPT、视频教程、在线编程练习平台等。
4.实验设备:计算机、网络设备、调试工具(如GDB)等。
五、教学评估本课程的教学评估将采用多元化评价方式,全面、客观地评价学生的学习成果。
*--------------------chess.c----------------------*/ #include "dos.h"#include "stdio.h"/*----------------------------------------------------*/ #define RED 7#define BLACK 14#define true 1#define false 0#define SELECT 0#define MOVE 1#define RED_UP 0x1100#define RED_DOWN 0x1f00#define RED_LEFT 0x1e00#define RED_RIGHT 0x2000#define RED_DO 0x3900#define RED_UNDO 0x1000#define BLACK_UP 0x4800#define BLACK_DOWN 0x5000#define BLACK_LEFT 0x4b00#define BLACK_RIGHT 0x4d00#define BLACK_DO 0x1c00#define BLACK_UNDO 0x2b00#define ESCAPE 0x0100#define RED_JU 1#define RED_MA 2#define RED_XIANG 3#define RED_SHI 4#define RED_JIANG 5#define RED_PAO 6#define RED_BIN 7#define BLACK_JU 8#define BLACK_MA 9#define BLACK_XIANG 10#define BLACK_SHI 11#define BLACK_JIANG 12#define BLACK_PAO 13#define BLACK_BIN 14/*----------------------------------------------------*/ int firsttime=1;int savemode;char page_new=0,page_old=0;int finish=false,turn=BLACK,winner=0;int key;int redstate=SELECT,blackstate=SELECT;int board[10][9];/*----------------------------------------------------*/char *chessfile[15]={"","bmp\\rju.wfb", "bmp\\rma.wfb", "bmp\\rxiang.wfb","bmp\\rshi.wfb","bmp\\rjiang.wfb","bmp\\rpao.wfb","bmp\\rbin.wfb","bmp\\bju.wfb", "bmp\\bma.wfb", "bmp\\bxiang.wfb","bmp\\bshi.wfb","bmp\\bjiang.wfb","bmp\\bpao.wfb","bmp\\bbin.wfb"};char *boardfile[10][9]={{"bmp\\11.wfb","bmp\\1t.wfb","bmp\\1t.wfb","bmp\\14.wfb","bmp\\15.wfb","bmp\\16.wfb"," bmp\\1t.wfb","bmp\\1t.wfb","bmp\\19.wfb"},{"bmp\\21.wfb","bmp\\2c.wfb","bmp\\2c.wfb","bmp\\24.wfb","bmp\\25.wfb","bmp\\26.wfb"," bmp\\2c.wfb","bmp\\2c.wfb","bmp\\29.wfb"},{"bmp\\21.wfb","bmp\\3a.wfb","bmp\\3t.wfb","bmp\\34.wfb","bmp\\3t.wfb","bmp\\36.wfb"," bmp\\3t.wfb","bmp\\3a.wfb","bmp\\29.wfb"},{"bmp\\41.wfb","bmp\\4t.wfb","bmp\\4a.wfb","bmp\\4t.wfb","bmp\\4a.wfb","bmp\\4t.wfb","b mp\\4a.wfb","bmp\\4t.wfb","bmp\\49.wfb"},{"bmp\\51.wfb","bmp\\52.wfb","bmp\\5t.wfb","bmp\\54.wfb","bmp\\5t.wfb","bmp\\56.wfb"," bmp\\5t.wfb","bmp\\58.wfb","bmp\\59.wfb"},{"bmp\\61.wfb","bmp\\62.wfb","bmp\\6t.wfb","bmp\\64.wfb","bmp\\6t.wfb","bmp\\66.wfb"," bmp\\6t.wfb","bmp\\68.wfb","bmp\\69.wfb"},{"bmp\\71.wfb","bmp\\7t.wfb","bmp\\7a.wfb","bmp\\7t.wfb","bmp\\7a.wfb","bmp\\7t.wfb","b mp\\7a.wfb","bmp\\7t.wfb","bmp\\79.wfb"},{"bmp\\81.wfb","bmp\\8a.wfb","bmp\\8t.wfb","bmp\\84.wfb","bmp\\85.wfb","bmp\\86.wfb"," bmp\\8t.wfb","bmp\\8a.wfb","bmp\\89.wfb"},{"bmp\\91.wfb","bmp\\9t.wfb","bmp\\9t.wfb","bmp\\9t.wfb","bmp\\95.wfb","bmp\\9t.wfb","b mp\\9t.wfb","bmp\\9t.wfb","bmp\\99.wfb"},{"bmp\\101.wfb","bmp\\102.wfb","bmp\\102.wfb","bmp\\104.wfb","bmp\\105.wfb","bmp\\10 6.wfb","bmp\\108.wfb","bmp\\108.wfb","bmp\\109.wfb"}};char cursor[14][14]={0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,255,255,255,255,255,255,255,0,0,1,1,1,1,0,255,255,255,255,255,255,0,0,1,1,1,1,1,0,255,255,255,255,255,255,0,0,1,1,1,1,1,0,255,255,255,255,255,255,255,0,0,1,1,1,1,0,255,255,255,255,255,255,255,255,0,0,1,1,1,0,255,255,255,255,255,255,255,255,255,0,0,1,1,0,255,255,0,255,255,255,255,255,255,255,0,0,1,0,255,0,1,1,0,255,255,255,255,255,255,255,0,0,0,1,1,1,1,0,255,255,255,255,255,0,1,0,1,1,1,1,1,1,0,255,255,255,0,1,1,1,1,1,1,1,1,1,1,0,255,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1};struct pos{int x;int y;}position[10][9],redcurpos,redtemppos,redoldpos,blackcurpos,blacktemppos,blackoldpos; /*----------------------------------------------------*/selectpage(register char page) /*换页函数*/{union REGS r;r.x.ax=0x4f05;r.x.bx=0;r.x.dx=page; /*选择页面*/int86(0x10,&r,&r);}unsigned char set_SVGA_mode(int vmode) /*设置SVGA屏幕模式*/{union REGS r;r.x.ax=0x4f02;r.x.bx=vmode;int86(0x10,&r,&r);return(r.h.ah);}unsigned int get_SVGA_mode() /*获取当前SVGA屏幕模式*/{union REGS r;r.x.ax=0x4f03;int86(0x10,&r,&r);return(r.x.bx);}drawbmp(int start_x,int start_y,char filename[]){char buffer[640];int i,j,k,n,r,g,b,width,length;long position;FILE *fp;if((fp=fopen(filename,"rb"))==NULL){printf("Error! Can't open file!");getch();return;}fseek(fp,28,SEEK_SET);fread(&i,2,1,fp);if(i!=8) /*检查是否为256色位图*/{puts("Error!Can't find bitmap!");fclose(fp);getch();exit(0);}fseek(fp,18,SEEK_SET);fread(&width,4,1,fp);fread(&length,4,1,fp);if(firsttime){fseek(fp,54,SEEK_SET);for(i=0;i<256;i++) /*按照该图片的DAC色表设置色彩寄存器*/{b=fgetc(fp);g=fgetc(fp);r=fgetc(fp); /*获取R、G、B分量*/outportb(0x3c8,i);outportb(0x3c9,r>>2); /*右移是要转化为VGA的6位寄存器形式*/ outportb(0x3c9,g>>2);outportb(0x3c9,b>>2);fgetc(fp);}}elsefseek(fp,300,SEEK_SET);k=(width%4)?(4-width%4):0; /*宽度修正值*/for(j=length-1+start_x;j>=start_x;j--){fread(buffer,width,1,fp);for(i=start_y,n=0;i<width+start_y;i++,n++){position=j*640l+i; /*计算要显示点的显存位置*/page_new=position/65536; /*计算显示页*/if(page_new!=page_old) /*当显示页不同时更换页面,提高一定的输出速度*/{selectpage(page_new);page_old=page_new;}pokeb(0xa000,position%65536,buffer[n]); /*写到显存位置*/}fseek(fp,k,SEEK_CUR); /*每行绘制完后修正宽度*/}fclose(fp);}init(){savemode=get_SVGA_mode(); /*先保存原来的屏幕模式*/set_SVGA_mode(0x101); /*硬件无关性初始化屏幕为640*480 256色模式*/ }end(){set_SVGA_mode(savemode); /*恢复屏幕*/}/*----------------------------------------------------*/initpos(){int i,j;for(i=0;i<10;i++)for (j=0;j<9;j++){position[i][j].x=35+i*39;position[i][j].y=43+j*40;}}initchessmap(){board[0][0]=BLACK_JU;board[0][1]=BLACK_MA;board[0][2]=BLACK_XIANG;board[0][3]=BLACK_SHI;board[0][4]=BLACK_JIANG;board[0][5]=BLACK_SHI;board[0][6]=BLACK_XIANG;board[0][7]=BLACK_MA;board[0][8]=BLACK_JU;board[2][1]=BLACK_PAO;board[2][7]=BLACK_PAO;board[3][0]=BLACK_BIN;board[3][2]=BLACK_BIN;board[3][4]=BLACK_BIN;board[3][6]=BLACK_BIN;board[3][8]=BLACK_BIN;board[9][0]=RED_JU;board[9][1]=RED_MA;board[9][2]=RED_XIANG;board[9][3]=RED_SHI;board[9][4]=RED_JIANG;board[9][5]=RED_SHI;board[9][6]=RED_XIANG;board[9][7]=RED_MA;board[9][8]=RED_JU;board[7][1]=RED_PAO;board[7][7]=RED_PAO;board[6][0]=RED_BIN;board[6][2]=RED_BIN;board[6][4]=RED_BIN;board[6][6]=RED_BIN;board[6][8]=RED_BIN;}initdrawchess(){int i,j;;for(i=0;i<10;i++)for(j=0;j<9;j++){if(board[i][j])drawbmp(position[i][j].x,position[i][j].y,chessfile[board[i][j]]); }}drawcursor(struct pos p){int i,j,n,m,x,y;long thisposition;x=position[p.x][p.y].x+20;y=position[p.x][p.y].y+25;for(j=13-1+x,m=13;j>=x;j--,m--){for(i=y,n=0;i<13+y;i++,n++){thisposition=j*640l+i; /*计算要显示点的显存位置*/page_new=thisposition/65536; /*计算显示页*/if(page_new!=page_old) /*当显示页不同时更换页面,提高一定的输出速度*/ {selectpage(page_new);page_old=page_new;}if(cursor[m][n]!=1)if(cursor[m][n]==0)pokeb(0xa000,thisposition%65536,0);elseif(turn==RED)pokeb(0xa000,thisposition%65536,153);elsepokeb(0xa000,thisposition%65536,255);}}}drawselecursor(struct pos p){int i,j,n,m,x,y;long thisposition;x=position[p.x][p.y].x+20;y=position[p.x][p.y].y+25;for(j=13-1+x,m=13;j>=x;j--,m--){for(i=y,n=0;i<13+y;i++,n++){thisposition=j*640l+i; /*计算要显示点的显存位置*/page_new=thisposition/65536; /*计算显示页*/if(page_new!=page_old) /*当显示页不同时更换页面,提高一定的输出速度*/ {selectpage(page_new);page_old=page_new;}if(cursor[m][n]!=1)pokeb(0xa000,thisposition%65536,0);}}}/*----------------------------------------------------*/int getkey(){int press;while(bioskey(1) == 0);press=bioskey(0);press=press&0xff00;return(press);}/*--------------------红方操作--------------------*/int redcanselect(){int x,y;x=redcurpos.x;y=redcurpos.y;if(board[x][y]>=RED_JU&&board[x][y]<=RED_BIN)return 1;elsereturn 0;}int redcanmove(){int i,j,min,max,oldx,oldy,x,y;oldx=redoldpos.x;oldy=redoldpos.y;x=redcurpos.x;y=redcurpos.y;/*case1 目标位置是否是自己人*/if(board[x][y]>=RED_JU&&board[x][y]<=RED_BIN)return 0;/* 军、马、炮、相、士、将、卒的走法正确性的判断*/ switch(board[oldx][oldy]){case RED_BIN: /*完成*/if(oldx>=5){ if(y!=oldy||(oldx-x)!=1) return 0;}else{ if(x==(oldx-1)&&y==oldy) return 1;elseif(x==oldx&&y==(oldy+1)) return 1;elseif(x==oldx&&y==(oldy-1)) return 1;elsereturn 0;}break;case RED_JIANG: /*完成*/if(x!=oldx&&y!=oldy) return 0;if(x!=oldx)if((x-oldx)>1||(oldx-x)>1) return 0;else if(x<7) return 0;else if(y!=oldy)if((y-oldy)>1||(oldy-y)>1) return 0;else if(y<3||y>5) return 0;break;case RED_JU: /*完成*/if(x!=oldx&&y!=oldy) return 0;else if(x!=oldx){ min=(x>oldx)?oldx:x;max=(x>oldx)?x:oldx;for(i=min+1;i<max;i++)if(board[i][y]!=0) return 0;}else if(y!=oldy){ min=(y>oldy)?oldy:y;max=(y>oldy)?y:oldy;for(i=min+1;i<max;i++)if(board[x][i]!=0) return 0;}break;case RED_MA: /*完成*/if((x-oldx)==2&&((y-oldy)==1||(oldy-y)==1)) {if(board[oldx+1][oldy]!=0) return 0;}elseif((oldx-x)==2&&((y-oldy)==1||(oldy-y)==1)) {if(board[oldx-1][oldy]!=0) return 0;}elseif((y-oldy)==2&&((x-oldx)==1||(oldx-x)==1)) {if(board[oldx][oldy+1]!=0) return 0;}elseif((oldy-y)==2&&((x-oldx)==1||(oldx-x)==1)) {if(board[oldx][oldy-1]!=0) return 0;}elsereturn 0;break;case RED_PAO: /*完成*/if(x!=oldx&&y!=oldy) return 0;if(board[x][y]==0){if(x!=oldx){ min=(x>oldx)?oldx:x;max=(x>oldx)?x:oldx;for(i=min+1;i<max;i++)if(board[i][y]!=0) return 0; }else if(y!=oldy){ min=(y>oldy)?oldy:y; max=(y>oldy)?y:oldy;for(i=min+1;i<max;i++)if(board[x][i]!=0) return 0; }}else{if(x!=oldx){ min=(x>oldx)?oldx:x; max=(x>oldx)?x:oldx;for(i=min+1,j=0;i<max;i++) if(board[i][y]!=0) j++;if(j!=1) return 0;}else if(y!=oldy){ min=(y>oldy)?oldy:y; max=(y>oldy)?y:oldy;for(i=min+1,j=0;i<max;i++) if(board[x][i]!=0) j++;if(j!=1) return 0;}}break;case RED_SHI: /*完成*/if(oldx==9||oldx==7){if(x!=8||y!=4) return 0;} else if(oldx==8){if(x==9&&y==3) return 1; elseif(x==9&&y==5) return 1; elseif(x==7&&y==3) return 1; elseif(x==7&&y==5) return 1; else return 0;}else return 0;break;case RED_XIANG: /*完成*/ if(x<5) return 0;if(x!=oldx&&y!=oldy){if((x-oldx)==2&&(y-oldy)==2){i=oldx+1;j=oldy+1;}else if((x-oldx)==2&&(oldy-y)==2) {i=oldx+1;j=oldy-1;}else if((oldx-x)==2&&(y-oldy)==2) {i=oldx-1;j=oldy+1;}else if((oldx-x)==2&&(oldy-y)==2) {i=oldx-1;j=oldy-1;}else return 0;if(board[i][j]!=0) return 0;}else return 0;break;}return 1;}。