** ** 摘要:该控制台程序是基于C语言来实现一个同机双人对战的控制台程序,主要包含三大模块:常量文件,系统函数,五子棋 关键词:C语言,控制台,五子棋。 主要功能:游戏简介,返回游戏主界面,落子,悔棋,背景音乐,重新开始,结束。 注:背景音乐需要导入头文件 一、常量文件中DataElement.h 二、系统函数文件中GoBangLib.h中 三、系统函数实现文件GoBangLib.c中 四、五子棋文件GoBang.h中 五、五子棋GoBang.c文件中 六、链栈LinkStack.h文件中 七、链栈LinkStack.c函数实现文件。 2020年6月4日入驻该博客,感谢读者的支持。C语言控制台版五子棋
——C语言版简易五子棋
作者:野风~S
文件,链栈文件。
#include <mmsystem.h>
#pragma comment(libm “winmm.lib”)
如果不能正常播放,则需要做一个改动,读者需要在
“项目”->“生成”->“选项”->“链接器设置”里面添加winmm语句即可。
概要:该文件中主要包含一些需要的常量定义/**常量定义文件*/ #define OK 1 #define ERROR 0 #define TURE 1 #define FALSE 0
概要:该文件中主要定义需要的系统函数/********************************************* *Project: 简易五子棋 *Function: 简易五子棋系统函数定义文件 *Author: 老九~野风 *Date: 2020/5/18 ~ 2020/5/23 ********************************************* *Copyright: 2020 by 老九~野风 **********************************************/ #include <stdio.h> #include <stdlib.h> /*设置控制台标题函数*/ void Set_Title(char * title); /*设置前景色和背景色函数*/ void Set_Color(int foreColor, int backColor); /*设置光标位置函数*/ void Set_Position(int x, int y); /*背景音乐播放函数*/ void Back_Music();
概要:该文件主要用于系统函数的实现#include "GoBangLib.h" #include <windows.h> #include <mmsystem.h> #pragma comment(libm "winmm.lib") /*设置控制台标题函数*/ void Set_Title(char * title) { SetConsoleTitle(title); } /*设置前景色和背景色函数*/ void Set_Color(int foreColor, int backColor) { /* 0 = 黑色 8 = 灰色 1 = 蓝色 9 = 淡蓝色 2 = 绿色 A = 淡绿色 3 = 浅绿色 B = 淡浅绿色 4 = 红色 C = 淡红色 5 = 紫色 D = 淡紫色 6 = 黄色 E = 淡黄色 7 = 白色 F = 亮白色 */ HANDLE winHandle; //句柄 winHandle = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTextAttribute(winHandle, foreColor + backColor * 0x10); } /*设置光标位置函数*/ void Set_Position(int x, int y) { HANDLE winHandle; //句柄 COORD pos = {x, y}; winHandle = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorPosition(winHandle, pos); } /*背景音乐播放函数*/ void Back_Music() { mciSendString("open C:\Users\86182\Desktop\Project\GoBang2.0\1.mp3", NULL, 0, NULL); mciSendString("play C:\Users\86182\Desktop\Project\GoBang2.0\1.mp3", NULL, 0, NULL); }
概要:该文件主要包含五子棋的结构定义,棋盘绘制函数,以及五子棋测试函数定义。#include <stdio.h> #include <stdlib.h> #include "DataElement.h" /*棋盘大小定义*/ #define BOARD_SIZE 15 /*棋子类型结构体定义*/ typedef struct ChessMan { int x; //当前棋子的坐标 int y; char type[5]; //当前棋子的类型数组 }ChessMan; /*棋盘结构体二维数组定义*/ ChessMan chess[BOARD_SIZE][BOARD_SIZE]; /*主界面界面函数*/ void Main_InterFace(); /*游戏介绍函数*/ void GoBang_Description(); /*初始化棋盘函数*/ void Init_ChessBoard(ChessMan chess[BOARD_SIZE][BOARD_SIZE]); /*打印棋盘函数*/ void Print_ChessBoard(ChessMan chess[BOARD_SIZE][BOARD_SIZE]); /*根据坐标x,y清空行列数为rowCount的区域函数*/ void Clear(int x, int y, int rowCount); /*判断胜负函数*/ int Judge(ChessMan ch, ChessMan chess[][BOARD_SIZE]); /*简易五子棋*/ int GoBang();
概要:主要用于实现五子棋函数。#include "GoBang.h" #include "LinkStack.h" #include "GoBangLib.h" #include <windows.h> #include <conio.h> /*棋盘光标初始位置*/ int X = BOARD_SIZE / 2, Y = BOARD_SIZE / 2; /*主界面界面函数*/ void Main_InterFace() { //系统设置函数调用 system("mode con cols=30 lines=20"); //设置窗口大小 Set_Title("五子棋"); Set_Color(0, 14); //设置标准颜色 int choice; //接受用户的选择 Set_Position(12, 1); printf("五子棋"); Set_Position(10, 3); printf("1.开始游戏"); Set_Position(10, 5); printf("2.游戏简介"); Set_Position(10, 7); printf("3.退出游戏"); Set_Position(8, 10); printf("请选择<1 2 3>:"); scanf("%d", &choice); switch(choice){ case 1: Clear(0, 0, BOARD_SIZE + 1); GoBang(); break; case 2: Clear(0, 0, BOARD_SIZE + 1); GoBang_Description(); break; case 3: exit(0); break; default: Clear(0, 0, BOARD_SIZE + 1); Main_InterFace(); } } /*游戏介绍函数*/ void GoBang_Description() { Set_Position(11, 1); printf("五子棋"); Set_Position(0, 3); printf("五子棋是中国著名黑白棋之一,n为两人对弈策略型棋类游戏。n"); printf("n老少皆宜,修身养性!n"); printf("n以白棋为先手先成五子者为胜,n悔棋次数为3次.n"); printf("n方向键:移动n空格键:下棋n"); printf("n按任意键返回主菜单..."); _getch(); //读取输入的任意键,以便后续语句执行 Clear(0, 0, BOARD_SIZE + 1); Main_InterFace(); } /*初始化棋盘函数*/ void Init_ChessBoard(ChessMan chess[BOARD_SIZE][BOARD_SIZE]) { int i, j; for(i = 0; i < BOARD_SIZE; i++){ for(j = 0; j < BOARD_SIZE; j++){ chess[i][j].x = j; //记录每一个棋盘格子坐标 chess[i][j].y = i; strcpy(chess[i][j].type, "十"); //将'十'复制给每个元素类型 } } } /*打印棋盘函数*/ void Print_ChessBoard(ChessMan chess[BOARD_SIZE][BOARD_SIZE]) { Clear(0, 0, BOARD_SIZE + 1); //清空区域,以便刷新 Set_Position(0, 0); //将光标位置放到0,0位置 int i, j; for(i = 0; i < BOARD_SIZE; i++){ for(j = 0; j < BOARD_SIZE; j++){ if(i == Y && j == X){ Set_Color(2, 4); //改变光标处的颜色 } printf("%s", chess[i][j].type); Set_Color(0, 14); //改为原来的颜色 } printf("n"); } printf("———————————————n"); printf("功能: 方向键:移动 空格:落子nn"); printf("菜单:1.悔棋2.退出3.重开4.音乐n"); } /*根据坐标x,y清空行列数为rowCount的区域函数*/ void Clear(int x, int y, int rowCount) { int i, j; for(i = 0; i < rowCount + 4; i++){ Set_Position(x, y + i); for(j = 0; j < rowCount + 14; j++){ printf(" "); } } } /*判断胜负函数*/ int Judge(ChessMan ch, ChessMan chess[][BOARD_SIZE]) { int count = 0; //记录当前同类型的棋子数目 int i, j; //向左方排查 for(i = ch.x - 1; i >= 0; i--){ if(strcmp(ch.type, chess[ch.y][i].type) == 0 && strcmp(ch.type, "十") != 0){ count++; }else{ break; } } //向右方排查 for(i = ch.x + 1; i < BOARD_SIZE; i++){ if(strcmp(ch.type, chess[ch.y][i].type) == 0 && strcmp(ch.type, "十") != 0){ count++; }else{ break; } } //判断相同类型棋子是否已满5个 if(count >= 4){ return OK; } count = 0; //向上方排查 for(j = ch.y - 1; j >= 0; j--){ if(strcmp(ch.type, chess[j][ch.x].type) == 0 && strcmp(ch.type, "十") != 0){ count++; }else{ break; } } //向下方排查 for(j = ch.y + 1; j < BOARD_SIZE; j++){ if(strcmp(ch.type, chess[j][ch.x].type) == 0 && strcmp(ch.type, "十") != 0){ count++; }else{ break; } } //判断相同类型棋子是否已满5个 if(count >= 4){ return OK; } count = 0; //向左上方排查 for(i = ch.x - 1, j = ch.y - 1; i >= 0 && j >= 0; i--, j--){ if(strcmp(ch.type, chess[j][i].type) == 0 && strcmp(ch.type, "十") != 0){ count++; }else{ break; } } //向右下方排查 for(i = ch.x + 1, j = ch.y + 1; i < BOARD_SIZE && j < BOARD_SIZE; i++, j++){ if(strcmp(ch.type, chess[j][i].type) == 0 && strcmp(ch.type, "十") != 0){ count++; }else{ break; } } //判断相同类型棋子是否已满5个 if(count >= 4){ return OK; } count = 0; //向左下方排查 for(i = ch.x - 1, j = ch.y + 1; i >= 0 && j < BOARD_SIZE; i--, j++){ if(strcmp(ch.type, chess[j][i].type) == 0 && strcmp(ch.type, "十") != 0){ count++; }else{ break; } } //向右上方排查 for(i = ch.x + 1, j = ch.y - 1; i < BOARD_SIZE && j >= 0; i++, j--){ if(strcmp(ch.type, chess[j][i].type) == 0 && strcmp(ch.type, "十") != 0){ count++; }else{ break; } } //判断相同类型棋子是否已满5个 if(count >= 4){ return OK; } return ERROR; } /*简易五子棋*/ int GoBang() { //棋盘打印 Init_ChessBoard(chess); Print_ChessBoard(chess); //为链栈分配内存,使用完要释放内存 LinkStack * linkStack = (LinkStack *)malloc(sizeof(LinkStack)); if(!linkStack){ return ERROR; } Init_LinkStack(linkStack); int count = 0; //记录当前下个棋子类型数 int count_undo = 0; //记录悔棋次数 char key; //接受用户输入按键的键值 while(1){ key = getch(); //直接传递键值 if(key == ' '){ //当用户按下空格键时下棋,将每部棋子压入链栈中 Push_LinkStack(linkStack, chess[Y][X]); //判断当前位置是否已经有棋子 if(strcmp(chess[Y][X].type, "○") == 0 || strcmp(chess[Y][X].type, "●") == 0){ continue; } if(count % 2 == 0){ strcpy(chess[Y][X].type, "○"); }else{ strcpy(chess[Y][X].type, "●"); } count++; }else if(key == '1'){ count_undo++; //当用户选择1时,如果悔棋次数在3次以内则将当前位置的棋子弹出链栈 if(count_undo <= 3){ ChessMan currChess; Pop_LinkStack(linkStack, &currChess); strcpy(chess[Y][X].type, "十"); count++; }else{ printf("悔棋次数已达上限!n"); continue; } }else if(key == '2'){ //退出 printf("游戏结束!"); exit(0); break; }else if(key == '3'){ //重新开始 //刷新棋盘 Clear(0, 0, BOARD_SIZE + 1); Init_ChessBoard(chess); Print_ChessBoard(chess); count = 0; }else if(key == '4'){ //播放音乐 Back_Music(); }else if(key == 72){ //上 Y--; }else if(key == 80){ //下 Y++; }else if(key == 75){ //左 X--; }else if(key == 77){ //右 X++; }else{ continue; } if(X > BOARD_SIZE - 1) X = 0; if(X < 0) X = BOARD_SIZE - 1; if(Y > BOARD_SIZE - 1) Y = 0; if(Y < 0) Y = BOARD_SIZE - 1; Print_ChessBoard(chess); if(Judge(chess[Y][X], chess) == 1){ printf("游戏结束:"); if(strcmp(chess[Y][X].type, "○") == 0){ printf("白方胜利!n"); }else{ printf("黑方胜利!n"); } } } free(linkStack); return 0; }
概要:该文件包含链栈的结构定义,以及函数定义#include <stdio.h> #include <stdlib.h> #include "DataElement.h" #include "GoBang.h" /*链栈结点定义*/ typedef struct StackNode { ChessMan data; struct StackNode * next; }StackNode; /*链栈头结点定义*/ typedef struct LinkStack { StackNode * top; int length; }LinkStack; /*初始化链栈函数*/ void Init_LinkStack(LinkStack * linkStack); /*压栈函数*/ int Push_LinkStack(LinkStack * linkStack, ChessMan element); /*判断是否为空函数*/ int IsEmpty_LinkStack(LinkStack * linkStack); /*弹栈函数*/ int Pop_LinkStack(LinkStack * linkStack, ChessMan * element);
#include "LinkStack.h" /*初始化链栈函数*/ void Init_LinkStack(LinkStack * linkStack) { linkStack->top = NULL; linkStack->length = 0; } /*压栈函数*/ int Push_LinkStack(LinkStack * linkStack, ChessMan element) { //定义新结点,赋值,改变指针域 StackNode * node = (StackNode *)malloc(sizeof(StackNode)); node->data = element; node->next = linkStack->top; linkStack->top = node; linkStack->length++; return OK; } /*判断是否为空函数*/ int IsEmpty_LinkStack(LinkStack * linkStack) { if(linkStack->top == NULL && linkStack->length == 0){ return TURE; } return FALSE; } /*弹栈函数*/ int Pop_LinkStack(LinkStack * linkStack, ChessMan * element) { if(IsEmpty_LinkStack(linkStack)){ return ERROR; } * element = linkStack->top->data; StackNode * node = linkStack->top; linkStack->top = linkStack->top->next;; free(node); linkStack->length--; return OK; }
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算