我们今天讲一个小游戏,三子棋大家应该都玩过吧,就是行和列,或者对角线上有一样大的字符时,就为获胜,今天我们就来写这样的一个代码实现这样的功能
首先我们要创建两个源文件和一个头文件
头文件game.h用来包含我们的头文件和函数的声明以及一些定义
game.c来实现游戏
test.c用来测试我们游戏的逻辑
test.c
#include<stdio.h> void menu() { printf("***************\n"); printf("****0.exit*****\n"); printf("****1.play*****\n"); printf("***************\n"); } void test() { int input = 0; do { menu();//打印菜单 printf("请选择>"); scanf("%d", &input); switch(input) { case 0: printf("退出游戏\n"); break; case 1: printf("进入游戏\n"); break; default: printf("请重新选择\n"); break; } } while (input); } int main() { test(); return 0; }
我们先实现一个打印菜单的逻辑
选择1进入游戏,选择0退出游戏,选择其他重新选择
用do while函数的话一上来就打印菜单,满足我们的需求
现在我们要实现游戏选择1完成
下一步我们要创建game()函数来实现三子棋的逻辑
首先我们要初始化棋盘
test.c
void game() { //存放下棋的数据 char board[Row][Col ] = { 0 }; //初始化棋盘为空格 Initboard(board, Row, Col); }
game.h
//初始化棋盘 void Initboard(char board[Row][Col], int row, int col);
game.c
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] = ' '; } } }
初始化棋盘之后我们要打印棋盘,打印棋盘是个井字
game.h
//打印棋盘 void Displayboard(char board[Row][Col], int row, int col);
game.c
void Displayboard(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"); if (i < row - 1) { for (j = 0; j < col; j++) { printf("---"); if (j < col - 1) { printf("|"); } } printf("\n"); } } }
test.c
//打印棋盘 Displayboard(board, Row, Col);
接下来我们要做的就是我们下棋
game.h
//玩家下棋 void play_move(char board[Row][Col], int row, int col);
game.c
void play_move(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"); } } }
test.c
play_move(board, Row, Col); //打印棋盘 Displayboard(board, Row, Col);
玩家下棋完,我们开始电脑下棋,但是我们在这里电脑下棋完成的只是随机下棋
game.h
void computer_move(char board[Row][Col], int row, int col);
game.c
void computer_move(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; } } }
电脑下棋和玩家下棋是一个循环,且随机,这个时候要用到我们的rand函数,同时要用到srand,还有时间戳的这样一个概念,这些都在猜数字里讲过
那我们接下来就是要思考怎么产生x = rand() % row; y = rand() % col;
这样产生坐标,思考这个我们需要思考怎么才能判断输赢,判断三子棋的输赢就是对角线或者行和列要满足,那么我们就做这样的一个函数来实现
test.c
while (1) { //玩家下棋 play_move(board, Row, Col); Displayboard(board, Row, Col); ret=is_win(board,Row,Col); if (ret != 'C') { break; } //电脑下棋 computer_move(board, Row, Col); Displayboard(board, Row, Col); ret = is_win(board, Row, Col); if (ret != 'C') { break; } } if (ret == '*') { printf("玩家赢了\n"); } else if (ret == '#') { printf("电脑赢了\n"); } else { printf("平局\n"); } Displayboard(board, Row, Col);//再次打印棋盘 }
*玩家赢 #电脑赢 C平局
完整代码
game.h
#pragma once #include<stdio.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 play_move(char board[Row][Col], int row, int col); //电脑下棋 void computer_move(char board[Row][Col], int row, int col); //判断输赢 char is_win(char board[Row][Col], int row, int col);
game.c
#define _CRT_SECURE_NO_WARNINGS 1 #include"game.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 Displayboard(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"); if (i < row - 1) { for (j = 0; j < col; j++) { printf("---"); if (j < col - 1) { printf("|"); } } printf("\n"); } } } void play_move(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 computer_move(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; } } } char is_win(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][0] != ' ') { return board[i][0]; } } }
test.c
#define _CRT_SECURE_NO_WARNINGS 1 //测试三子棋逻辑 #include"game.h" void game() { char ret = 0; //存放下棋的数据 char board[Row][Col] = { 0 }; //初始化棋盘为空格 Initboard(board, Row, Col); //打印棋盘 Displayboard(board, Row, Col); while (1) { //玩家下棋 play_move(board, Row, Col); Displayboard(board, Row, Col); ret=is_win(board,Row,Col); if (ret != 'C') { break; } //电脑下棋 computer_move(board, Row, Col); Displayboard(board, Row, Col); ret = is_win(board, Row, Col); if (ret != 'C') { break; } } if (ret == '*') { printf("玩家赢了\n"); } else if (ret == '#') { printf("电脑赢了\n"); } else { printf("平局\n"); } Displayboard(board, Row, Col); } void menu() { printf("**************\n"); printf("****1.play****\n"); printf("****0.exit****\n"); printf("**************\n"); } void test() { int input = 0; do { menu(); printf("请选择>"); scanf("%d", &input); switch (input) { case 0: printf("退出游戏\n"); break; case 1: game(); break; default : printf("请重新输入\n"); break; } } while (input); } int main() { srand((unsigned int)time(NULL));//时间戳 test(); return 0;
今天的小游戏就到这,我们下次再见