文章目录:
一:定义函数,打印游戏菜单。
二:宏定义打印棋盘,以及创建新文件以及头文件,例:game.c和game.h
1:定义函数初始化棋盘
2:定义函数打印棋盘以及分割线(重难点)
三:玩家下棋
四:电脑下棋
五:判断输赢(重难点)
六:代码全析总结
一、打印菜单
- 相信大家在打单机游戏的时候,肯定会看到一个菜单(目录),也就是在刚刚进入游戏的时候看到的选项,需要玩家输入数字进行选择
- 选择1(进入游戏)
- 选择0(退出游戏)
void venu() { printf("---------------------------\n"); printf("---1:开始游戏 2:结束游戏\n"); printf("---------------------------\n"); }
在主函数内进行游戏规划以及实现代码框架
在函数中会叫用rand()和srand()函数以及time()函数,注意记得调用其头文件:
#include<stdlib.h>以及#include<time.h>头文件,同时注意格式和运行的逻辑顺序
int main() { //打印游戏菜单 srand((unsigned int)time(NULL)); int input = 0; do { venu(); printf("请输入数字\n"); scanf("%d", &input); switch (input) {//实现game游戏函数 case 1:game(); break; case 0:printf("结束游戏\n"); break; default:printf("输入错误,请重新输入\n"); break; } } while (input); return 0; }
二、棋盘打印
因为棋盘类似于一个二维数组,所以用一个二维数组来接收下的棋子的“字符”;
1:定义函数初始化棋盘
void Initboard(char board[Row][Col], int row, int col) { int i = 0; for (i = 0; i < row; i++) { int j = 0; for (j = 0; j < col; j++) { board[i][j] = ' '; } } }
2:定义函数打印棋盘以及分割线(重难点)
为了格式美观,会将最后一列的格式线进行删除。
当for在行循环中进行到最后一行和一列时,注意:此时的行格式线和列格式线都要进行删除
void playboard(char board[Row][Col], int row, int col) { int i = 0; for (i = 0; i < row; i++) { int j = 0; for(j=0;j<col;j++) { printf(" %c ", board[i][j]); if(j<col-1) printf("|"); } printf("\n"); //控制行变化,不打印row最后一行 if (i < row - 1) { for (j = 0; j < col; j++) { printf("---"); //控制不打印col最后一列 if (j < col - 1) printf("|"); } } printf("\n"); } }
三:玩家下棋
那就是玩家(也就是你自己)下一步,然后电脑在下一步,直到谁赢,输,平局,所以无论在你下完一步后还是在电脑下完一步后,都要判断这局游戏的输赢,但是判断三字棋局的输赢,除了三字连成线,也就是横三条,竖三条,斜两条,可表示输赢,还有如果棋子下完了棋盘还没有分出胜负,那就是平局,其他情况就继续下棋。
用函数 Playgame();表示玩家下一步棋子,用字符‘*’表示,使用玩家输入的值,然后判断该坐标是否被占用,如果被占用则再次输入值进行填充表格
void playgame(char board[Row][Col], int row, int col) { int x = 0, y = 0; 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"); } } }
四:电脑下棋
使用Computergame()函数; 表示电脑下一步棋,用字符‘#’表示,在使用rand()函数,使电脑生成随机值,然后判断该坐标是否被占用,如果被占用则再次随机生成值进行填充表格。
void computergame(char board[Row][Col], int row, int col) { int x = 0, y = 0; printf("电脑下棋\n"); while (1) { x = rand() % row; y = rand() % col; if (board[x][y] == ' ') { board[x ][y ] = '#'; break; } } }
五:判断输赢(重难点)
再完成一个函数 Iswin();判断棋局输赢,需要一个返回值,如果玩家赢返回‘’;如果输返回‘#’,平局返回‘Q’,继续则返回‘C’
char iswin(char board[Row][Col], int row, int col) {int i = 0, j = 0,count=0,flag=1; //判断行是否相同 for (i = 0; i < row; i++) { if (board[i][0] == ' ') continue; count = 0; for (j = 0; j < col-1; j++) { if (board[i][j] == board[i][j + 1]) count++; } if(count==row-1) return board[i][0]; } //判断列是否相同 for (i = 0; i < col; i++) { if (board[0][i] == ' ') continue; count = 0; for (j = 0; j < row - 1; j++) { if (board[j][i] == board[j + 1][i]) count++; } if(count==col-1) return board[0][j]; } //判断主对角线是否相同 count = 0; for (i = 0; i < row-1; i++) { if (board[0][0] == ' ') break; if (board[i][i] == board[i + 1][i + 1]) count++; if (count == row-1) return board[i][i]; } //判断次对角线是否相同 count = 0; for (i = 0,j=col-1; i < (row - 1)&&j>0; i++,j--) { if (board[0][col-1] == ' ') break; if (board[i][j] == board[i+1][j-1]) count++; if (count == row - 1) return board[i][j]; } //判断是否和棋 count = 0; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { if (board[i][j] == ' ') return 'c'; else count++; } } if (count == (row * col)) return 'Q'; }
六:代码全析总结
第一部分:主函数 例:源.c
#define _CRT_SECURE_NO_WARNINGS 1 #pragma warning(disable:6031) #include"game.h" #include<stdio.h> #include<stdlib.h> #include<time.h> //打印菜单 void venu() { printf("---------------------------\n"); printf("---1:开始游戏 2:结束游戏\n"); printf("---------------------------\n"); } void game() { char board[Row][Col] = { 0 }; //1:给board字符数组覆空格初始值 Initboard(board, Row,Col); //2:打印表格 playboard(board, Row, Col); char ret = 0; while (1) {//玩家下棋 playgame(board, Row, Col); playboard(board, Row, Col); //判断谁赢 ret=iswin(board, Row, Col); if (ret != 'c') break; //电脑下棋 computergame(board, Row, Col); playboard(board, Row, Col); ret=iswin(board, Row, Col); if (ret != 'c') break; } if (ret == '*') printf("玩家赢了\n"); else if (ret == '#') printf("电脑赢了\n"); else printf("和棋了\n"); } int main() { //打印游戏菜单 srand((unsigned int)time(NULL)); int input = 0; do { venu(); printf("请输入数字\n"); scanf("%d", &input); switch (input) {//实现game游戏函数 case 1:game(); break; case 0:printf("结束游戏\n"); break; default:printf("输入错误,请重新输入\n"); break; } } while (input); return 0; }
第二部分:实现三子棋的游戏头文件
#pragma once #define Row 3 #define Col 3 //覆初始值 void Initboard(char board[Row][Col], int row, int col); //打印表格 void playboard(char board[Row][Col], int row, int col); //玩家下棋 void playgame(char board[Row][Col], int row, int col); void computergame(char board[Row][Col], int row,int col); char iswin(char board[Row][Col], int row, int col);
第三部分:(核心)游戏代码的实现
#define _CRT_SECURE_NO_WARNINGS 1 #pragma warning(disable:6031) #include"game.h" #include<stdio.h> #include<stdlib.h> void Initboard(char board[Row][Col], int row, int col) { int i = 0; for (i = 0; i < row; i++) { int j = 0; for (j = 0; j < col; j++) { board[i][j] = ' '; } } } void playboard(char board[Row][Col], int row, int col) { int i = 0; for (i = 0; i < row; i++) { int j = 0; for(j=0;j<col;j++) { printf(" %c ", board[i][j]); if(j<col-1) printf("|"); } printf("\n"); //控制行变化,不打印row最后一行 if (i < row - 1) { for (j = 0; j < col; j++) { printf("---"); //控制不打印col最后一列 if (j < col - 1) printf("|"); } } printf("\n"); } } void playgame(char board[Row][Col], int row, int col) { int x = 0, y = 0; 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 computergame(char board[Row][Col], int row, int col) { int x = 0, y = 0; printf("电脑下棋\n"); while (1) { x = rand() % row; y = rand() % col; if (board[x][y] == ' ') { board[x ][y ] = '#'; break; } } } char iswin(char board[Row][Col], int row, int col) {int i = 0, j = 0,count=0,flag=1; //判断行是否相同 for (i = 0; i < row; i++) { if (board[i][0] == ' ') continue; count = 0; for (j = 0; j < col-1; j++) { if (board[i][j] == board[i][j + 1]) count++; } if(count==row-1) return board[i][0]; } //判断列是否相同 for (i = 0; i < col; i++) { if (board[0][i] == ' ') continue; count = 0; for (j = 0; j < row - 1; j++) { if (board[j][i] == board[j + 1][i]) count++; } if(count==col-1) return board[0][j]; } //判断主对角线是否相同 count = 0; for (i = 0; i < row-1; i++) { if (board[0][0] == ' ') break; if (board[i][i] == board[i + 1][i + 1]) count++; if (count == row-1) return board[i][i]; } //判断次对角线是否相同 count = 0; for (i = 0,j=col-1; i < (row - 1)&&j>0; i++,j--) { if (board[0][col-1] == ' ') break; if (board[i][j] == board[i+1][j-1]) count++; if (count == row - 1) return board[i][j]; } //判断是否和棋 count = 0; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { if (board[i][j] == ' ') return 'c'; else count++; } } if (count == (row * col)) return 'Q'; }
最后真诚的祝愿每一位代码人都能够实现~~~~