手机上能玩C语言游戏吗?

手机上有c语言编程软件吗?_百度知道
手机上有c语言编程软件吗?
我有更好的答案
试一下“C4droid”,可以在手机上输入语句和运行
采纳率:100%
为您推荐:
其他类似问题
您可能关注的内容
c语言编程软件的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。"好玩的c语言整人小程序"的糗事
你可能感兴趣:
糗事百科为大家收集了很多的好玩的c语言整人小程序的糗事,各种关于好玩的c语言整人小程序的爆笑经历、尴尬时刻和开心视频,想持续关注好玩的c语言整人小程序的糗事就收藏本页吧.
扫码下载糗事百科appC语言实现手机斗地主游戏中的洗牌C语言实现手机斗地主游戏中的洗牌游戏萝莉百家号Algorithm Gossip: 洗扑克牌我们在玩一些像斗地主这样的扑克牌游戏时,都要洗牌。在现实生活中洗牌都是由人把扑克牌随机打乱,那么,在比较火热的手机斗地主游戏中是怎样实现洗牌的呢?我们在编写程序时,首先要建模,即把现实世界中的问题抽象为计算机能够理解的模型,那么,怎么抽象洗扑克牌呢。扑克牌共有54张,4种花色,每种花色13张,还有大王、小王,通过(花色,扑克牌的值)这个二元组就可唯一确定一张扑克牌。我们可以将扑克牌抽象为1~54的数字,分成4个区间:[1,13]、[14,26]、[27,39]、[40,52],每个区间表示一种花色,每个区间中的数字依次表示A~K,还有53、54分别表示小王、大王。通过以上的抽象,洗扑克牌问题就被抽象为一个将1~54随机打乱顺序的问题。在将数字转换为扑克牌时,只需确定扑克牌的二元组就可以了,即只需将数字所处的区间转换为花色,将数字除以13的余数转换为牌的值就可以了,大王、小王单独处理。至于怎么做到随机打乱1~54这些数字, 初学者通常会直接想到,随机产生1~54的随机数并将之存入阵列中,后产生的随机数存入阵列前必须先检查阵列中是否已有重复的数字,如果有这个数就不存入,再重新产生下一个数,运气不好的话,重复的次数就会很多,程序的执行速度就很慢了,这不是一个好方法。可以将阵列先依序由1~54填入,然后遍历阵列,并产生1~54的随机数,将产生的随机数当作索引取出阵列中存的值,并与目前访问到的位置的值相交换,如此就不用担心随机数重复的问题了,阵列遍历完毕后,所有的数字也就随机打乱了。C语言实现洗牌算法代码:#include#define N 54int main(void) {int poker[N + 1];int i, j, tmp,// 初始化阵列for(i = 1; i &= N; i++)poker[i] =srand(time(0));// 洗牌for(i = 1; i &= N; i++) {j = rand() % 54 + 1;tmp = poker[i];poker[i] = poker[j];poker[j] =}if(poker[i]==53)printf(&小王 &);else if(poker[i]==54)printf(&大王 &);else{// 判断花色switch((poker[i]-1) / 13) {case 0:printf(&桃&);case 1:printf(&心&);case 2:printf(&砖&);case 3:printf(&梅&);// 扑克牌数字remain = poker[i] % 13;switch(remain) {printf(&K &);case 12:printf(&Q &);case 11:printf(&J &);default:printf(&%d &, remain);if(i % 17 == 0)printf(&\n&);return 0;上图为运行结果,每次运行结果都不同。由于控制了输出格式,可以看成是一盘斗地主游戏每个人的牌和底牌的情况。本文仅代表作者观点,不代表百度立场。系作者授权百家号发表,未经许可不得转载。游戏萝莉百家号最近更新:简介:好玩游戏良心推荐!随你心情尽情互动!作者最新文章相关文章利用C语言实现2048小游戏的方法
转载 & & 投稿:daisy
2048是比较流行的一款数字游戏,相信对大家来说都不陌生,这篇文章给大家分享了利用C语言实现2048小游戏的方法,对大家学习理解C语言具有一定的参考借鉴价值,有需要的朋友们下面来一起看看吧。
首先上一张图,因为这里只是在用C语言验证算法,所以没有对界面做很好的优化,丑是理所应当的。
了解了游戏的工作原理,实际上可以将游戏描述为四个带有方向的同一操作:
&&& 1、将所有数字向一个方向移动至中间没有空位
&&& 2、将相邻的两个相同的数字加和然后放在更靠近移动方向前部的一个位置上
另外需要判断一下玩家当前输入的内容是否可以执行,如果不可以执行等待用户下一条记录。
同时需要对游戏的进程进行控制,如果可以继续游戏,那么运行玩家继续输入下一条指令,而如果不可以进行,那么提示无法继续游戏的提示。
首先的问题就是光标键的输入。光标键属于功能键,使用常规的scanf当然是无法进行读取的,而使用更加接近硬件的getch()进行以字节为单位的标准输入。当使用getch()函数进行标准输入时,如果用户输入了一个功能键,例如光标键、Home、PgUp、PgDn、End之类的键,getch()将能够读取得到两个字符。当遇到功能键输入的时候,可以编写一个检测程序以获取对应按键的数据:
#include&stdio.h&
int main(){
printf("%d\n",getch());
随后运行这个数据提取程序,程序将按照一个字节一行,以整型的格式输出getch得到的数据。这里我查询到2048需要用到的四个按键↑↓←→对应的两个字节为:
然后就是游戏的主要的代码
#include&stdio.h&
//标准输入输出
#include&stdlib.h&
//基本工具函数
#define bool int
//C里边没有布尔类型,就自己造
#define true 1
//bool的两种值
#define false 0
int MAP[4][4]= {0};
//地图,默认0认为是空位
typedef enum {
//定义一个方向类型的枚举变量
void printMap();
//绘制图形
Direction getNextDirection(); //从键盘读入下一个用户操作
bool canMove(Direction direction); //判断是否可以进行指定方向的操作
void doAction();
//游戏事件
void move(Direction direction);
//移动数字
void putNew();
//放入一个新的数字
int main() {
Direction nextS
srand(time(0));
//游戏开始默认放两个数字
printMap();
//打印格子
while(1) {
if(!canMove(UP)&&!canMove(LEFT)&&!canMove(DOWN)&&!canMove(RIGHT)) //任意方向都不能移动,那么终止游戏
nextStep=getNextDirection();
//获取下一个用户操作
if(nextStep==UNKNOW)
//如果不知道用户按了个什么键或者用户胡乱按的,那么进入新的循环
if(!canMove(nextStep)) //如果下一步不可继续操作,进入新的循环
system("cls");
//对于Windows来说,执行命令行命令cls清屏
doAction(nextStep);
//执行操作
//放新的数字
printMap();
//打印格子
printf("You Died!");
//提示游戏结束
//等待游戏结束
void printMap() {
printf("*-------*-------*-------*-------*\n");
for(i=0; i&4; i++) {
printf("|");
for(j=0; j&4; j++) {
MAP[i][j]?printf("%d",MAP[i][j]):printf(" ");
printf("\t|");
printf("\n");
printf("*-------*-------*-------*-------*\n");
void doAction(Direction direction){
int i,j,k;
* 为了方便处理问题,将每个方向的运动操作简化为三步
* 1.将数字归并到一个方向
* 2.处理相同数字可消,并将消掉的数据定为0
* 3.再次将数字归并到一个方向
//1.移动数字,取消数字之间的空位
move(direction);
//2.按照方向处理相同数字
switch(direction){
//按列枚举
for(i=0;i&4;i++){
//对于每一行的每一个元素
for(j=0;j&3;j++){
//如果元素非零,并且当前和下一个相同,当前的翻倍,下一个置零
if(MAP[j][i]&&MAP[j][i]==MAP[j+1][i]){
MAP[j][i]+=MAP[j+1][i];
MAP[j+1][i]=0;
case LEFT://同上
for(i=0;i&4;i++)
for(j=0;j&3;j++)
if(MAP[i][j]&&MAP[i][j]==MAP[i][j+1]){
MAP[i][j]+=MAP[i][j+1];
MAP[i][j+1]=0;
case DOWN://同上
for(i=0;i&4;i++)
for(j=3;j&0;j--)
if(MAP[j][i]&&MAP[j][i]==MAP[j-1][i]){
MAP[j][i]+=MAP[j-1][i];
MAP[j-1][i]=0;
case RIGHT://同上
for(i=0;i&4;i++)
for(j=3;j&0;j--)
if(MAP[i][j]&&MAP[i][j]==MAP[i][j-1]){
MAP[i][j]+=MAP[i][j-1];
MAP[i][j-1]=0;
//3.移动数字,取消因为上一步置零过程中新产生的空位
move(direction);
void move(Direction direction) { //移动数字
int i,j,k;
switch(direction) {
//按列枚举
for(i=0;i&4;i++)
//对于每一行的每一个元素
for(j=0;j&4;j++)
//如果非零,那么应当取消当前位置,后边元素向前移动
if(!MAP[j][i]){
for(k=j;k&3;k++){
MAP[k][i]=MAP[k+1][i];
//新产生的空位置零
MAP[k][i]=0;
case LEFT://同上
for(i=0;i&4;i++)
for(j=0;j&4;j++)
if(!MAP[i][j]){
for(k=j;k&3;k++){
MAP[i][k]=MAP[i][k+1];
MAP[i][k]=0;
case DOWN://同上
for(i=0;i&4;i++)
for(j=3;j&=0;j--)
if(!MAP[j][i]){
for(k=j;k&0;k--){
MAP[k][i]=MAP[k-1][i];
MAP[k][i]=0;
case RIGHT://同上
for(i=0;i&4;i++)
for(j=3;j&=0;j--)
if(!MAP[i][j]){
for(k=j;k&0;k--){
MAP[i][k]=MAP[i][k-1];
MAP[i][k]=0;
bool canMove(Direction direction) { //判断是否可以进行指定方向的操作
switch(direction) {
//依次检查每一列
for(i=0;i&4;i++){
//首先排除在远端的一串空位,直接将j指向第一个非零元素
for(j=3;j&=0;j--)
if(MAP[j][i])
//j&0代表这一列并非全部为0
//依次检查每一个剩余元素,遇见空位直接返回true
for(;j&=0;j--)
if(!MAP[j][i])
//依次检查相邻的元素是否存在相同的非零数字
for(j=3;j&0;j--)
if(MAP[j][i]&&MAP[j][i]==MAP[j-1][i])
case DOWN://同上
for(i=0;i&4;i++){
for(j=0;j&4;j++)
if(MAP[j][i])
for(;j&4;j++)
if(!MAP[j][i])
for(j=0;j&3;j++)
if(MAP[j][i]&&MAP[j][i]==MAP[j+1][i])
case LEFT://同上
for(i=0; i&4; i++){
for(j=3;j&=0;j--)
if(MAP[i][j])
for(;j&=0;j--)
if(!MAP[i][j])
for(j=0;j&3;j++)
if(MAP[i][j]&&MAP[i][j]==MAP[i][j+1])
case RIGHT://同上
for(i=0; i&4; i++){
for(j=0;j&4;j++)
if(MAP[i][j])
for(;j&4;j++)
if(!MAP[i][j])
for(j=0;j&3;j++){
if(MAP[i][j]&&MAP[i][j]==MAP[i][j+1])
//当允许条件都被检查过后,返回不可执行的结果
Direction getNextDirection() {
//第一个字节必须是224,否则判定输入的不是功能键
if(getch()!=224) return UNKNOW;
//根据第二字节对应出来用户的操作
switch(getch()) {
return UP;
return DOWN;
return LEFT;
return RIGHT;
return UNKNOW;
void putNew(){
//为了方便操作,临时存储一下所有空闲格子的指针,这样可以用一个线性的内存随机访问实现对所有空位中任一空位的随机访问.
int* boxes[16]={NULL};
//用来临时保存目标格子的地址
//统计一共有多少个有效空格
int count=0;
//统计空位,发现空位即保存地址并累加计数器
for(i=0;i&4;i++)
for(j=0;j&4;j++)
if(!MAP[i][j]){
boxes[count]=&MAP[i][j];
if(count){
//如果有空位,那么对这一位进行随机赋值操作,对于每一位可能性是相同的
target=boxes[rand()%count];
//50%可能出现2 50% 可能出现4
*target=rand()%2?2:4;
以上就是这篇文章的全部内容了,小编认为像俄罗斯方块、2048这些稍微偏算法的小游戏是程序员必写的几个小程序。希望这篇文章对大家的学习或者工作能有所帮助,如果有疑问大家可以留言交流。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具

我要回帖

 

随机推荐