基于C语言的趣味游戏之五子棋

基于C语言的趣味游戏之五子棋目录 趣味五子棋游戏 第一步 text c 文件 第二步 game h 文件 第三步 初始化 打印棋盘 玩家输入 电脑输入 判断输赢 game c 趣味五子棋游戏 第一步 先写菜单 然后在主函数里调用 由于这是一个可以重复的游戏所以将 do

大家好,我是讯享网,很高兴认识大家。

目录

 

趣味五子棋游戏

 第一步

text.c文件 

 第二步

game.h文件

第三步

初始化

 打印棋盘

玩家输入 

电脑输入

判断输赢 

game.c


趣味五子棋游戏


讯享网

 第一步

先写菜单,然后在主函数里调用,由于这是一个可以重复的游戏所以将do while循环里调用menu函数。

  1. 当我们键盘输入1时开启游戏,调用game()函数。由于我们是一个五子棋游戏,那么可能需要一个5x5大小的棋盘,所以我们要定义一个字符型的棋盘char board[ROW][COL];
  2. 定义好棋盘之后就初始化棋盘,在game.c文件里初始化。
  3. 初始化完之后就要打印棋盘。
  4. 然后就是让玩家落子,在判输赢,接着电脑落子,接着判输赢,这是一个循环的操作,所以需要一个while循环让这个操作循环起来。

text.c文件 

//text.c文件 #define _CRT_SECURE_NO_WARNINGS #include"game.h" //五子棋 //菜单 void menu() { printf("*\n"); printf(" 1 paly \n"); printf(" 0 exit \n"); printf("*\n"); } void game() { char board[ROW][COL]; //初始化棋盘 InitBoard(board, ROW, COL); //打印棋盘 displayBoard(board, ROW, COL); char ret = 0; while(1) { //玩家下棋 playermove(board, ROW, COL); //打印棋盘 displayBoard(board, ROW, COL); //判断输赢 ret = inwin(board, ROW, COL); if (ret != 'C') { break; } //电脑下棋 computermove(board, ROW, COL); //打印棋盘 displayBoard(board, ROW, COL); //判断输赢 ret = inwin(board, ROW, COL); if (ret != 'C') { break; } } if(ret=='*') { printf("玩家赢了\n"); }else if(ret=='#') { printf("电脑赢了\n"); } else { printf("平局\n"); } } int main() { int input = 0; srand((unsigned int)time(NULL)); do { menu(); printf("请选择:>"); scanf("%d", &input); switch(input) { case 1: game(); break; case 0: printf("退出游戏\n"); default: printf("请输入正确的数字\n"); break; } } while (input); return 0; }

讯享网

 第二步

是去头文件里去声明函数以及将一些公共的头文件包含起来。在一些大型的开发都是声明和函数实现分离的。

game.h文件

讯享网#pragma once #include<stdlib.h> #include<stdio.h> #include<string.h> #include<time.h> #include"game.h" #define ROW 5 #define COL 5 //初始化棋盘 void InitBoard(char borad[ROW][COL],int row,int col); //打印棋盘 void displayBoard(char board[ROW][COL], int row, int col); //玩家下棋 void playermove(char board[ROW][COL], int row, int col); //电脑下棋 void computermove(char board[ROW][COL], int row, int col); //判断输赢 char inwin(char board[ROW][COL], int row, int col);

第三步

 去game.c文件里去实现函数的相关功能。

初始化

初始化棋盘,就是将5x5的数组具象化,将他形成5x5的空格。当用户在相应的坐标里输入时,就将对应的空格替换成特定的符号。

 打印棋盘

//初始化棋盘 void InitBoard(char board[ROW][COL], int row, int col) { int i = 0; int j = 0; for(i=0;i<row;i++) { for(j=0;j<col;j++) { board[i][j] = ' '; } } }

对于打印棋盘,我们可以观察一下棋盘,可以将棋盘划分成两个部分一个是要输入数值部分,一个是分割部分

这里绿色部分为数值部分是用户和电脑输入坐标的部分,数值部分由  空格 | 空格 | 空格组成

红色部分是分割部分,由 ..... | ..... | ..... 组成 。

在代码实现的时候可以分两部分,数值部分,循环打印数值board[i][j];在少打一列的 | 。

分割部分可以先循环打印虚线 .......,在少打一列 | 。

讯享网//打印棋盘 void displayBoard(char board[ROW][COL], int row, int col) { int i = 0; int j = 0; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { printf(" %c ", board[i][j]); if (j < col - 1) printf("|"); } printf("\n"); if(i<row-1) { for (j = 0; j < col; j++) { printf("..."); if (j < col - 1) printf("|"); } } printf("\n"); } }

玩家输入 

 由于数组的下标是从0开始到n-1的,但是玩家是不会考虑这些的,所以玩家的输入的下标,应该在要减一才是棋盘的下标

首先要判空,看玩家输入的下标是否不合法,收否不为空格,不为空格就是这个下标已经被占用了。

 最后在合法的下标下,将玩家输入的下标位置用 ‘ * ’替换空格。

//玩家下棋 void playermove(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; printf("玩家下棋\n"); while (1) { printf("输入你要下的坐标: "); scanf("%d %d", &x, &y); if (x >= 1 && x <= row && y >= 1 && y <= col) { if (board[x - 1][y - 1] == ' ') { board[x - 1][y - 1] = '*'; break; } else { printf("该子已被下过\n"); } } else { printf("该坐标非法,请换坐标\n"); } } }

电脑输入

 我们设计电脑输入为随机的输入,用到了随机函数rand,用rand去%模row,col是为了随机值是在小于row和col的情况下。但是别忘了,在用rand之前要先使用srand随机数种子,为了确保随机数种子的唯一性,我们将随机数种子放在test.c文件的main()函数里,确保随机数种子只被调用一次

将电脑输入的合法下标下,用#号去替换原有的空格。

讯享网//电脑随机下棋 void computermove(char board[ROW][COL], int row, int col) { printf("电脑下棋\n"); int x = 0; int y = 0; while(1) { x = rand() % row; y = rand() % col; if(board[x][y]==' ') { board[x ][y ] = '#'; break; } } }

判断输赢 

 玩过五子棋的都知道,五子棋只有在五个棋子连在一起的情况才会赢。所以我们分三种情况。

第一种,用一个循环,判断所以行是否出现一样的情况。

第二种,所有列是否出现一样的情况。

第三种,正负对角线有没有出现一样的情况。

最后用他们一样的情况的一个点作为返回条件去判断谁赢了。

如果返回 * 则玩家赢;如果返回 # 则电脑赢了。如果返回Q则平局。

//判平局 static int IsFull(char board[ROW][COL], int row, int col) { int i = 0; int j = 0; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { if (board[i][j] == ' ') return 0; } } return 1; } //判断输赢 char inwin(char board[ROW][COL], int row, int col) { int i = 0; for(i=0;i<row;i++) { if (board[i][0] == board[i][1] && board[i][1] == board[i][2]&& board[i][2] == board[i][3]&&board[i][3] == board[i][4]&& board[i][0] !=' ') { return board[i][0]; } } for (i = 0; i < col; i++) { if (board[0][i] == board[1][i] && board[1][i] == board[2][1] && board[2][i] == board[3][i] && board[3][i] == board[4][i] && board[0][i] != ' ') { return board[0][i]; } } if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[2][2] == board[3][3] &&board[3][3] == board[4][4] && board[1][1] != ' ') { return board[0][0]; } if (board[0][4] == board[1][3] && board[1][3] == board[2][2] && board[2][2] == board[3][1]&&board[3][1] == board[4][0] && board[0][4] != ' ') { return board[0][4]; } //判断平局 if (IsFull(board, row, col)) { return 'Q'; } return 'C'; } 

game.c

讯享网//game.c #define _CRT_SECURE_NO_WARNINGS #include"game.h" //初始化棋盘 void InitBoard(char board[ROW][COL], int row, int col) { int i = 0; int j = 0; for(i=0;i<row;i++) { for(j=0;j<col;j++) { board[i][j] = ' '; } } } //打印棋盘 void displayBoard(char board[ROW][COL], int row, int col) { int i = 0; int j = 0; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { printf(" %c ", board[i][j]); if (j < col - 1) printf("|"); } printf("\n"); if(i<row-1) { for (j = 0; j < col; j++) { printf("..."); if (j < col - 1) printf("|"); } } printf("\n"); } } //玩家下棋 void playermove(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; printf("玩家下棋\n"); while (1) { printf("输入你要下的坐标: "); scanf("%d %d", &x, &y); if (x >= 1 && x <= row && y >= 1 && y <= col) { if (board[x - 1][y - 1] == ' ') { board[x - 1][y - 1] = '*'; break; } else { printf("该子已被下过\n"); } } else { printf("该坐标非法,请换坐标\n"); } } } //电脑随机下棋 void computermove(char board[ROW][COL], int row, int col) { printf("电脑下棋\n"); int x = 0; int y = 0; while(1) { x = rand() % row; y = rand() % col; if(board[x][y]==' ') { board[x ][y ] = '#'; break; } } } //判平局 static int IsFull(char board[ROW][COL], int row, int col) { int i = 0; int j = 0; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { if (board[i][j] == ' ') return 0; } } return 1; } //判断输赢 char inwin(char board[ROW][COL], int row, int col) { int i = 0; for(i=0;i<row;i++) { if (board[i][0] == board[i][1] && board[i][1] == board[i][2]&& board[i][2] == board[i][3]&&board[i][3] == board[i][4]&& board[i][0] !=' ') { return board[i][0]; } } for (i = 0; i < col; i++) { if (board[0][i] == board[1][i] && board[1][i] == board[2][1] && board[2][i] == board[3][i] && board[3][i] == board[4][i] && board[0][i] != ' ') { return board[0][i]; } } if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[2][2] == board[3][3] &&board[3][3] == board[4][4] && board[1][1] != ' ') { return board[0][0]; } if (board[0][4] == board[1][3] && board[1][3] == board[2][2] && board[2][2] == board[3][1]&&board[3][1] == board[4][0] && board[0][4] != ' ') { return board[0][4]; } //判断平局 if (IsFull(board, row, col)) { return 'Q'; } return 'C'; } 

代码压缩包

https://download.csdn.net/download/_/icon-default.png?t=N7T8https://download.csdn.net/download/_/ 

小讯
上一篇 2025-03-03 16:25
下一篇 2025-02-22 21:47

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/11427.html