通过一段时间的学习,我们可以利用我们所学的知识来写一个小游戏,三子棋小游戏,游戏内容是玩家输入棋盘上的坐标进行下棋,电脑随机下棋,循环,直到一方胜利(一方所下棋子3个连成一条线)或平局(棋盘下满)。
效果图
1.数组存放棋子
玩家棋子为* ,电脑棋子为#,我们可以用字符数组来存放。当没有棋子时用‘ ’就是空格来表示,为了更方便的改为其他棋盘,如5子棋,我们可以用宏定义行和列
//宏定义行和列 #define ROW 3 #define COL 3 //定义棋盘 char board[ROW][COL] = { 0 }; //初识化棋盘 InitBoard(board,ROW,COL); //初识化棋盘函数定义 void InitBoard(char board[ROW][COL], int row, int col) { for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { board[i][j] = ' ';//最开始棋盘为空 所以赋值为空格 } } }
2.打印棋盘
棋盘形状:
//打印棋盘函数 DisplayBoard(board, ROW, COL); //打印棋盘函数实现 void DisplayBoard(char board[ROW][COL], int row, int col) { for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { if (j < col - 1) { printf(" %c |",board[i][j]); } else { printf(" %c \n",board[i][j]); } } if(i<row-1)//最后一行的线不打印 { for (int j = 0; j < col; j++) { if (j < col - 1) { printf("---|"); } else { printf("---\n"); } } } } }
3.玩家下棋函数
void PlayerMove(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; printf("玩家下棋\n"); while(1) { printf("请输入你要下棋的坐标\n"); scanf("%d %d", &x, &y); x = x - 1; y = y - 1; if (x >= 0 && x <= row - 1 && y >= 0 && y <= col - 1 ) { if (board[x][y] == ' ') { board[x][y] = '*';//将棋盘改为* break; } else { printf("该坐标被占用,请重新输入\n"); } } else printf("输入非法,请重新输入\n"); } }
4.电脑随机下棋
电脑下棋需要生成随机坐标,用到随机数rand()函数,为了是生成的数达到真正的随机,还需要使用随机数种子,srand((unsigned int)time(NULL)); 还要包含头文件<stdlib.h> <time.h>。
void ComputerMove(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; printf("电脑下棋\n"); while(1) { x = rand() % ROW;//生成0到ROW之间的随机数 y = rand() % COL; if (board[x][y] == ' ')//如果棋盘没有棋子,下棋成功 { board[x][y] = '#';//下棋成功,将棋盘改为# break; } } }
5.判断是否胜利函数
有4个返回值* # ’0‘ ’1‘
//判断输赢 //玩家赢返回 '*' //电脑赢返回 '#' //平局 '0' //继续 '1' char IsWin(char board[ROW][COL], int row, int col) { int flag = 0; char ret = 0; //是否胜利 //1.行相同 for (int i = 0; i < row; i++) { flag = 0;//重置flag ret = board[i][0]; for (int j = 1; j < row; j++) { if (ret != board[i][j]) { flag = 1;//修改flag break; } } if (flag == 0 && ret != ' ') return ret; /*if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ') { return board[i][0]; }*///三子棋简单写法 } //2.列相同 for (int i = 0; i < col; i++) { flag = 0;//重置flag ret = board[0][i]; for (int j = 1; j < row; j++) { if (ret != board[j][i]) { flag = 1;//修改flag break; } } if (flag == 0 && ret != ' ') return ret; /*if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ') { return board[0][i]; }*///三子棋简单写法 } //3.对角线 flag = 0; ret = board[0][0]; for (int i = 1; i < row; i++) { if (ret != board[i][i]) { flag = 1; break; } } if (flag == 0 && ret != ' ') return ret; flag = 0; ret = board[0][col-1]; for (int i = 1; i < row; i++) { if (ret != board[i][col-i-1]) { flag = 1; break; } } if (flag == 0 && ret != ' ') return ret; //if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ') //{ // return board[0][0]; //} //if (board[0][2] == board[1][1] && board[1][1] == board[2][1] && board[1][1] != ' ') //{ // return board[1][1]; //}//三子棋简单写法 //是否平局 for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { if (board[i][j] == ' ') return '1'; } } return '0'; }
6.game函数
整个游戏过程
void game() { char board[ROW][COL] = { 0 }; //初识化棋盘 InitBoard(board,ROW,COL); //打印棋盘 DisplayBoard(board, ROW, COL); char ret = 0; while (1) { //玩家下棋 * PlayerMove(board, ROW, COL); DisplayBoard(board, ROW, COL); //判断输赢 ret = IsWin(board, ROW, COL); if (ret != '1') { break; } //电脑随机下棋 # ComputerMove(board, ROW, COL); DisplayBoard(board, ROW, COL); //判断输赢 ret = IsWin(board, ROW, COL); if (ret != '1') { break; } } if (ret == '*') { printf("恭喜玩家胜利\n"); } else if (ret == '#') { printf("电脑胜利\n"); } else if (ret == '0') { printf("平局\n"); } }
7.主函数
主函数能够实现游戏在玩完一次之后可以选择继续玩下一次或者结束游戏
void menu() { printf("**************************\n"); printf("****** 1.play ******\n"); printf("****** 0.exit ******\n"); printf("**************************\n"); } int main() { srand((unsigned int)time(NULL)); int input = 0; do { menu(); printf("请输入:>"); scanf("%d", &input); switch (input) { case 1: printf("游戏开始\n"); game(); break; case 0: printf("游戏结束\n"); break; default: printf("输入非法,请重新输入\n"); break; } } while (input); return 0; }
8.全部代码
game.h文件
#pragma once #include<stdio.h> #include<time.h> #include<stdlib.h> #define ROW 3 #define COL 3 void InitBoard(char board[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 IsWin(char board[ROW][COL], int row, int col);
game.c文件
#include"game.h" //初始化棋盘 void InitBoard(char board[ROW][COL], int row, int col) { for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { board[i][j] = ' '; } } } void DisplayBoard(char board[ROW][COL], int row, int col) { for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { if (j < col - 1) { printf(" %c |",board[i][j]); } else { printf(" %c \n",board[i][j]); } } if(i<row-1) { for (int j = 0; j < col; j++) { if (j < col - 1) { printf("---|"); } else { printf("---\n"); } } } } } void PlayerMove(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; printf("玩家下棋\n"); while(1) { printf("请输入你要下棋的坐标\n"); scanf("%d %d", &x, &y); x = x - 1; y = y - 1; if (x >= 0 && x <= row - 1 && y >= 0 && y <= col - 1 ) { if (board[x][y] == ' ') { board[x][y] = '*'; break; } else { printf("该坐标被占用,请重新输入\n"); } } else printf("输入非法,请重新输入\n"); } } void ComputerMove(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; printf("电脑下棋\n"); while(1) { x = rand() % ROW; y = rand() % COL; if (board[x][y] == ' ') { board[x][y] = '#'; break; } } } //判断输赢 //玩家赢返回 '*' //电脑赢返回 '#' //平局 '0' //继续 '1' char IsWin(char board[ROW][COL], int row, int col) { int flag = 0; char ret = 0; //是否胜利 //1.行相同 for (int i = 0; i < row; i++) { flag = 0;//重置flag ret = board[i][0]; for (int j = 1; j < row; j++) { if (ret != board[i][j]) { flag = 1;//修改flag break; } } if (flag == 0 && ret != ' ') return ret; /*if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ') { return board[i][0]; }*/ } //2.列相同 for (int i = 0; i < col; i++) { flag = 0;//重置flag ret = board[0][i]; for (int j = 1; j < row; j++) { if (ret != board[j][i]) { flag = 1;//修改flag break; } } if (flag == 0 && ret != ' ') return ret; /*if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ') { return board[0][i]; }*/ } //3.对角线 flag = 0; ret = board[0][0]; for (int i = 1; i < row; i++) { if (ret != board[i][i]) { flag = 1; break; } } if (flag == 0 && ret != ' ') return ret; flag = 0; ret = board[0][col-1]; for (int i = 1; i < row; i++) { if (ret != board[i][col-i-1]) { flag = 1; break; } } if (flag == 0 && ret != ' ') return ret; //if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ') //{ // return board[0][0]; //} //if (board[0][2] == board[1][1] && board[1][1] == board[2][1] && board[1][1] != ' ') //{ // return board[1][1]; //} //是否平局 for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { if (board[i][j] == ' ') return '1'; } } return '0'; }
test.c文件
#include"game.h" //三子棋游戏 void menu() { printf("**************************\n"); printf("****** 1.play ******\n"); printf("****** 0.exit ******\n"); printf("**************************\n"); } void game() { char board[ROW][COL] = { 0 }; //初识化棋盘 InitBoard(board,ROW,COL); //打印棋盘 DisplayBoard(board, ROW, COL); char ret = 0; while (1) { //玩家下棋 * PlayerMove(board, ROW, COL); DisplayBoard(board, ROW, COL); //判断输赢 ret = IsWin(board, ROW, COL); if (ret != '1') { break; } //电脑随机下棋 # ComputerMove(board, ROW, COL); DisplayBoard(board, ROW, COL); //判断输赢 ret = IsWin(board, ROW, COL); if (ret != '1') { break; } } if (ret == '*') { printf("恭喜玩家胜利\n"); } else if (ret == '#') { printf("电脑胜利\n"); } else if (ret == '0') { printf("平局\n"); } } int main() { srand((unsigned int)time(NULL)); int input = 0; do { menu(); printf("请输入:>"); scanf("%d", &input); switch (input) { case 1: printf("游戏开始\n"); game(); break; case 0: printf("游戏结束\n"); break; default: printf("输入非法,请重新输入\n"); break; } } while (input); return 0; }
希望对大家有帮助,kiss kiss。