C语言实现小游戏:五子棋

it2025-12-17  12

五子棋: 需要的数据: 1、定义一个15*15的棋盘 2、定义变量用于记录棋子的坐标 3、定义角色变量 业务逻辑: 是否需要对数据进行初始化 for( ; ; ) { 1、刷新屏幕,显示棋盘 2、落子 检查坐标是否合法,该位置不能有棋子 3、检查是否五子连珠 刷新屏幕 是:游戏胜利 4、交换角色 } 5、宣布平局,结束游戏

注:该程序在Linux环境下可以正常编译,Windows环境下需要修改!

#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <getch.h> //Linux中没有这个头文件,需要自己手动导入库中,文末有代码,自己创建getch.h复制进去并导入库中即可 // 定义棋盘 char board[15][15]; // 棋子坐标 char key_x = 7,key_y = 7; // 角色 char role = '@'; // 初始化棋盘 void init_board(void) { for(int i=0;i<15;i++) { for(int j=0;j<15;j++) { board[i][j] = '*'; } } } // 显示棋盘 void show_board(void) { system("clear"); for(int i=0;i<15;i++) { for(int j=0;j<15;j++) { printf(" %c",board[i][j]); } printf("\n"); } } // 落子 void get_key(void) { printf("请%c下棋\n",role); for(;;) { printf("\33[%hhd;%hhdH",key_x+1,(key_y+1)*2); switch(getch()) { case 183: key_x>0 && key_x--;break; case 184: key_x<14 && key_x++;break; case 185: key_y<14 && key_y++;break; case 186: key_y>0 && key_y--;break; case 10: if(board[key_x][key_y] == '*') { board[key_x][key_y] = role; return; } } } } //计算一个方向上有多少个相同的棋子 int count_key(int go_x,int go_y)//0 -1 { int count = 0; for(int x=key_x+go_x,y=key_y+go_y; x>=0 && y>=0 && x<15 && y<15;x+=go_x,y+=go_y) { if(role == board[x][y]) { count++; } else { break; } } return count; } // 检查五子连珠 bool check_key(void) { //左上右下 if(count_key(-1,-1) + count_key(1,1) >= 4) return true; if(count_key(-1,1) + count_key(1,-1) >= 4) return true; if(count_key(1,0) + count_key(-1,0) >= 4) return true; if(count_key(0,1) + count_key(0,-1) >= 4) return true; return false; } int main(int argc,const char* argv[]) { // 初始化棋盘 init_board(); for(;;) { // 显示棋盘 show_board(); // 落子 get_key(); // 检查五子连珠 if(check_key()) { show_board(); printf("%c胜利!!!\n",role); return 0; } // 交换角色 role = role == '@'?'$':'@'; } }

以下为getch.h代码,创建getch.h复制进去并导入库中即可

#ifndef GETCH_H #define GETCH_H #include <termios.h> #include <unistd.h> // 修改终端的控制方式,1取消回显、确认 2获取数据 3还原 static int getch(void) { // 记录终端的配置信息 struct termios old; // 获取终端的配置信息 tcgetattr(STDIN_FILENO,&old); // 设置新的终端配置 struct termios new = old; // 取消确认、回显 new.c_lflag &= ~(ICANON|ECHO); // 设置终端配置信息 tcsetattr(STDIN_FILENO,TCSANOW,&new); // 在新模式下获取数据 int key_val = 0; do{ key_val += getchar(); }while(stdin->_IO_read_end - stdin->_IO_read_ptr); // 还原配置信息 tcsetattr(STDIN_FILENO,TCSANOW,&old); return key_val; } #endif//GETCH_H

上图即为最终效果。有需要的同学可以自行美化棋盘和棋子

最新回复(0)